Проблема с кодом при использовании аддона параметров интерфейса в World of Warcraft - PullRequest
2 голосов
/ 09 февраля 2010

Я пишу пользовательский интерфейс в существующий аддон. Или, более конкретно, добавление параметров конфигурации и попытка воспользоваться панелью дополнений параметров интерфейса (IOA). Я ссылаюсь на wowwiki, в частности на страницу , в которой говорится об использовании этой панели , но в целом это куча страниц.

Я столкнулся с проблемой, которая, я уверен, является лишь результатом моей неопытности в написании аддонов (я написал несколько, но каждый раз это опыт обучения). Основная концепция:

  • Создание главной панели - с использованием XML
  • Создание подпунктов для вещей, которые должны быть видны на главной панели (то есть глобальные параметры) - с использованием XML
  • Создание подпанели для каждого дочернего элемента (категории конфигурации) - с использованием Lua (количество и имена подпанелей динамические)
  • Создание подпунктов для каждой подпанели - с использованием Lua

Вещи, которые работают:

  • Основная панель отображается на панели IOA
  • Подпанели отображаются на панели IOA как подэлементы главной панели
  • Текстуры, которые я наложил на вспомогательные панели, отображаются на них

У меня проблемы:

  • Если я создаю дочерние панели как дочерние элементы главной панели, они отображаются в верхней части главной панели
  • Если я создаю подпанели, являющиеся дочерними для UIParent, они отображаются на главном экране (отображается, когда окно IOA не открыто
  • Ничего из того, что я создаю в XML-файле как дочерний, на нем отображается рамка главной панели

Код, который у меня есть (вырезан для краткости), находится внизу сообщения. Любая помощь / предложения будут более чем оценены. Я знаю, что в разделе кода многое, но я хотел как можно яснее понять, что я делаю.

Обратите внимание, что я действительно писал об этом на официальном форуме Warcraft UI, но не смог получить там никакой помощи.

embeds.xml

...snip...
<Frame name="MyAddonFrame" parent="UIParent" hidden="false">
  <Scripts>
    <OnLoad>
      self:RegisterEvent("UNIT_TARGET");
      self:RegisterEvent("PLAYER_ENTERING_WORLD");
      MyAddon_OnLoad(self);
    </OnLoad>
    <OnEvent function="MyAddon_OnEvent" />
    </Scripts>

    <Frames>
      <Frame parent="MyAddonFrame" inherits="UIDropDownMenuTemplate">
        <Frames>
          <Button name="MyAddon_MacroSelectDropdownButton">
            <Anchors>
              <Anchor point="CENTER"/>
            </Anchors>

            <Scripts>
              <OnLoad>
                UIDropDownMenu_Initialize(this,
                MyAddon_MacroSelectDropdown_OnLoad);
              </OnLoad>
              <OnClick>
                MyAddon_MacroSelectDropdownButton_OnClick();
              </OnClick>
            </Scripts>
          </Button>
          <MessageFrame>
            <Anchors>
              <Anchor point="CENTER"/>
            </Anchors>
          <FontString text="Message Frame"/>
        </MessageFrame>
      </Frames>
    </Frame>
  </Frames>
</Frame>
...snip...

Код Lua

...snip...
function MyAddon_OnLoad(panel)
    MyAddon_CreateOptionsPanel(panel);
    MyAddon_ConsoleMessage("Loaded MyAddon: " .. tostring(panel));
end

function MyAddon_CreateOptionsPanel(panel)
    panel.name = "MyAddon " .. GetAddOnMetadata("MyAddon", "Version");  -- Set the name for the Category for the Panel
    panel.okay = function (self) MyAddonFrame_Close(); end;                 -- When the player clicks okay, run this function.
    panel.cancel = function (self)  MyAddonFrame_CancelOrLoad();  end;  -- When the player clicks cancel, run this function.
    InterfaceOptions_AddCategory(panel);                                    -- Add the panel to the Interface Options

    for name,text in pairs(ConfigData) do
        MyAddon_CreateMacroPanel(name, panel, panel.name);
    end
end

function MyAddon_CreateMacroPanel(macroName, parent, parentName)
    MyAddon_ConsoleMessage("Added macro option pane: " .. macroName);
    panel = CreateFrame( "Frame", "MyAddon_MacroPanel_" .. macroName, parent);
    panel.name = macroName;
    panel.parent = parentName;
    InterfaceOptions_AddCategory(panel);

    -- create a backdrop so we can see that the panel is created
    panel:SetFrameStrata("BACKGROUND");
    panel:SetWidth(128); -- Set these to whatever height/width is needed 
    panel:SetHeight(64); -- for your Texture

    local t = panel:CreateTexture(nil,"BACKGROUND");
    t:SetTexture("Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Factions.blp");
    t:SetAllPoints(panel);
    panel.texture = t;

    panel:SetPoint("CENTER",0,0);
end



-- MyAddon_MacroSelectDropdown
function MyAddon_MacroSelectDropdown_OnLoad()
    info            = {};
    info.text       = "Auto";
    info.value      = "Auto";
    -- FunctionCalledWhenOptionIsClicked 
    info.func       = function (self) MyAddon_SetMacroAuto(); end;
    UIDropDownMenu_AddButton(info);
    for index,macro in pairs(ConfigData) do
        info.text       = name;
        info.value      = name;
        -- FunctionCalledWhenOptionIsClicked 
        info.func       = function (self) MyAddon_SetMacroByName(name); end;
        UIDropDownMenu_AddButton(info);
    end
    -- can also be done as function() FunctionCalledWhenOptionIsClicked() end;
end
...snip...

1 Ответ

1 голос
/ 01 сентября 2011

Да, рамки, которые являются детьми, по умолчанию отображаются поверх их родителей. Это основной арендатор.

Я думаю, что разъединение здесь частично в предположении, что вам нужно добавить все элементы как дочерние элементы вашего основного фрейма. Это не так.

Для двух независимых «панелей», т. Е. Рамок, вы можете иметь:

<frame>...</frame>
<frame>...</frame>

Если первый - это ваш "основной фрейм" или тот, который вы намереваетесь получить от основных событий аддонов, например ADDON_LOADED, то второй может быть другим, но он все равно ваш. Ну, на самом деле оба на самом деле не «ваши», они находятся в глобальной общей области, доступной всем аддонам.

Поэтому, если вы хотите, чтобы видимые элементы следовали за конкретным кадром, и по положению, и по видимости они должны быть его дочерними элементами. В противном случае вы должны создать еще один кадр. Если вы сделаете родителя скрытым, то его потомки будут скрыты. Если вы переместите родителя, его дети переместятся, потому что у них есть относительное положение относительно родителя.

Это поведение по умолчанию, но если вам действительно не нужно делать что-то хитрое, например, действительно изменяющийся кадр, гораздо проще следовать поведению по умолчанию и создавать отдельные кадры.


<Frame name="MyAddonFrame" parent="UIParent" hidden="false">
  <Scripts>
    <OnLoad>
      self:RegisterEvent("UNIT_TARGET");
      self:RegisterEvent("PLAYER_ENTERING_WORLD");
      MyAddon_OnLoad(self);
    </OnLoad>
    <OnEvent function="MyAddon_OnEvent" />
    </Scripts>

    <Frames>
      <Frame parent="MyAddonFrame" inherits="UIDropDownMenuTemplate">

Вам не нужно устанавливать родителей, как вы делали выше, но если вы намереваетесь ссылаться на этот кадр из кода lua вне события непосредственно в этом кадре, вы должны дать ему имя:

    <Frames>
      <Frame name="$parentDropDownMenu" inherits="UIDropDownMenuTemplate">

Если это в файле "embeds.xml", то, по сути, этот файл предназначен для набора включений для библиотек, встроенных в аддон, а не для управления фреймами, но, конечно, WoW понятия не имеет, поэтому он будет работать. Код должен быть похож на MyAddon.xml, MyAddon.lua


В основном вам нужно создать кадры подходящего размера и зарегистрировать их, чтобы они отображались как часть панели параметров, что является своего рода кратким объяснением этого.

Дайте мне знать, что осталось, что не имеет смысла или работы.

...