既存のアドオンに UI を書いています。または、より具体的には、構成オプションを追加して、Interface Options Addons (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...
ルアコード
...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...