The options window, the ESC menu and the key bindings page follow the 1.15 era client because 1.12's settings screens are much worse to use. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
242 lines
12 KiB
XML
242 lines
12 KiB
XML
<Ui>
|
|
<!--
|
|
The game menu, the frame ESC opens. Its chrome is the reference GameMenuFrame.xml's: DIALOG
|
|
strata, the UI-DialogBox backdrop (insets 11/12/12/11, 32px tile and edge), the 256x64
|
|
header at TOP +12 with the title 14px down it, the reference's click sounds, and the stock
|
|
`GameMenuButtonTemplate`, which the era's MainMenuFrameButtonTemplate matches in art,
|
|
size and label fonts.
|
|
Deviation: the ladder is the 1.15 era client's ESC menu (GameMenuFrame.lua l.62-162),
|
|
because its settings screens replace 1.12's, which are much worse to use. It keeps the
|
|
era's layout numbers, padding 32 top and 28 elsewhere (MainMenuFrameTemplates.xml
|
|
l.18-33) and a 20-unit gap between groups (MainMenuFrameTemplates.lua l.61-71), and drops
|
|
the era's AddOns rung, because the character-select AddOns screen is the only addon UI;
|
|
Key Bindings is in the options window, as in the era.
|
|
Names are the reference's, unprefixed: addons address `GameMenuFrame` by name.
|
|
-->
|
|
<Script><![CDATA[
|
|
-- Label strings as `X = X or "..."`, so a stock GlobalStrings value wins where one exists.
|
|
MAIN_MENU = MAIN_MENU or "Main Menu"
|
|
HUD_EDIT_MODE_MENU = HUD_EDIT_MODE_MENU or "Edit Mode"
|
|
GAMEMENU_SUPPORT = GAMEMENU_SUPPORT or "Support"
|
|
MACROS = MACROS or "Macros"
|
|
LOGOUT = LOGOUT or "Logout"
|
|
EXIT_GAME = EXIT_GAME or "Exit Game"
|
|
RETURN_TO_GAME = RETURN_TO_GAME or "Return to Game"
|
|
CANCEL = CANCEL or "Cancel"
|
|
|
|
-- Labels and disables a rung with nothing behind it yet (Edit Mode, Support), greyed on the
|
|
-- template's -Disabled art the way the era menu greys a dead entry.
|
|
function GameMenuButton_Pending(button, text)
|
|
button:SetText(text)
|
|
button:Disable()
|
|
end
|
|
|
|
-- ══ Our options window in the stock "is an options window open?" checks ══
|
|
-- The three stock functions name the reference's options windows, which here are hidden
|
|
-- stock frames, so each is wrapped to add `BenillaOptionsFrame` and still runs the stock
|
|
-- body. Wrapped here because this file loads last: `UpdateMicroButtons`
|
|
-- (MainMenuBarMicroButtons.xml) loads after our options window.
|
|
local Ref_IsOptionFrameOpen = IsOptionFrameOpen
|
|
local Ref_ToggleGameMenu = ToggleGameMenu
|
|
local Ref_UpdateMicroButtons = UpdateMicroButtons
|
|
|
|
-- Guarded for a test kit that loads the game menu without the options window.
|
|
local function BenillaOptions_IsOpen()
|
|
return BenillaOptionsFrame and BenillaOptionsFrame:IsVisible()
|
|
end
|
|
|
|
-- `UIParent.lua:996`, read by `CloseAllWindows_WithExceptions`: a yes keeps the ESC sweep
|
|
-- off the centre panel, which our window is, so ESC closes it through its own rung.
|
|
function IsOptionFrameOpen()
|
|
if BenillaOptions_IsOpen() then
|
|
return 1
|
|
end
|
|
return Ref_IsOptionFrameOpen()
|
|
end
|
|
|
|
-- `UIParent.lua:1465-1497`, the ESC ladder: static popup first, then an open options
|
|
-- window, then the rest of the stock ladder. The stock body re-runs the popup rung, a pure
|
|
-- scan when nothing is shown (`StaticPopup.lua:1879-1893`). Our Close button's click is
|
|
-- the discard-and-hide the reference reaches through `OptionsFrameCancel:Click()`.
|
|
function ToggleGameMenu(clicked)
|
|
if clicked then
|
|
-- As the reference's `clicked` arm: close an options window, then still toggle.
|
|
if BenillaOptions_IsOpen() then
|
|
BenillaOptionsFrameCloseButton:Click()
|
|
end
|
|
return Ref_ToggleGameMenu(clicked)
|
|
end
|
|
if StaticPopup_EscapePressed() then
|
|
return
|
|
end
|
|
if BenillaOptions_IsOpen() then
|
|
BenillaOptionsFrameCloseButton:Click()
|
|
return
|
|
end
|
|
return Ref_ToggleGameMenu(clicked)
|
|
end
|
|
|
|
-- `MainMenuBarMicroButtons.lua:47-58`: a post-hook that only ever pushes the Main Menu
|
|
-- button, never releases it, so the stock decision over its six frames stands and ours adds
|
|
-- the seventh. Guarded for a test kit that loads this file without the micro bar.
|
|
function UpdateMicroButtons()
|
|
if Ref_UpdateMicroButtons then
|
|
Ref_UpdateMicroButtons()
|
|
end
|
|
if MainMenuMicroButton and BenillaOptions_IsOpen() then
|
|
MainMenuMicroButton:SetButtonState("PUSHED", 1)
|
|
end
|
|
end
|
|
|
|
]]></Script>
|
|
|
|
<!-- The era's header font, GameFontNormalMed1 (FRIZQT 13, gold): an era name 1.12's Fonts.xml
|
|
lacks, declared beside its one consumer. -->
|
|
<Font name="GameFontNormalMed1" inherits="GameFontNormal" virtual="true">
|
|
<FontHeight><AbsValue val="13"/></FontHeight>
|
|
</Font>
|
|
|
|
|
|
<!-- The reference frame's attributes (GameMenuFrame.xml l.3) except `movable`, which is inert
|
|
there: the reference defines no drag scripts. -->
|
|
<Frame name="GameMenuFrame" parent="UIParent" frameStrata="DIALOG" toplevel="true" enableMouse="true" hidden="true">
|
|
<!-- The era layout: 28+144+28 wide; 32 top and 28 bottom padding around seven 21-unit
|
|
rungs and three 20-unit section gaps. -->
|
|
<Size><AbsDimension x="200" y="267"/></Size>
|
|
<Anchors><Anchor point="CENTER"/></Anchors>
|
|
<Backdrop bgFile="Interface\DialogFrame\UI-DialogBox-Background" edgeFile="Interface\DialogFrame\UI-DialogBox-Border" tile="true">
|
|
<BackgroundInsets><AbsInset left="11" right="12" top="12" bottom="11"/></BackgroundInsets>
|
|
<TileSize><AbsValue val="32"/></TileSize>
|
|
<EdgeSize><AbsValue val="32"/></EdgeSize>
|
|
</Backdrop>
|
|
<Layers>
|
|
<Layer level="ARTWORK">
|
|
<Texture name="GameMenuFrameHeader" file="Interface\DialogFrame\UI-DialogBox-Header">
|
|
<Size><AbsDimension x="256" y="64"/></Size>
|
|
<Anchors><Anchor point="TOP"><Offset><AbsDimension x="0" y="12"/></Offset></Anchor></Anchors>
|
|
</Texture>
|
|
<!-- The era's 13px header font (MainMenuFrameMixin:OnLoad) on the 1.12 seat, which
|
|
is within half a unit of the era's. -->
|
|
<FontString name="GameMenuFrameTitle" inherits="GameFontNormalMed1" text="MAIN_MENU">
|
|
<Anchors>
|
|
<Anchor point="TOP" relativeTo="GameMenuFrameHeader"><Offset><AbsDimension x="0" y="-14"/></Offset></Anchor>
|
|
</Anchors>
|
|
</FontString>
|
|
</Layer>
|
|
</Layers>
|
|
<Frames>
|
|
|
|
<!-- The era's Options entry (GameMenuFrame.lua l.88), opening our options window. A
|
|
literal label: 1.12 has no GAMEMENU_OPTIONS, and its OPTIONS_MENU is a different
|
|
string, "Options Menu". -->
|
|
<Button name="GameMenuButtonOptions" inherits="GameMenuButtonTemplate" text="Options">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT"><Offset><AbsDimension x="28" y="-32"/></Offset></Anchor>
|
|
</Anchors>
|
|
<Scripts>
|
|
<OnClick>
|
|
PlaySound("igMainMenuOption")
|
|
HideUIPanel(GameMenuFrame)
|
|
ShowUIPanel(BenillaOptionsFrame)
|
|
</OnClick>
|
|
</Scripts>
|
|
</Button>
|
|
|
|
<Button name="GameMenuButtonEditMode" inherits="GameMenuButtonTemplate">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT" relativeTo="GameMenuButtonOptions" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20"/></Offset></Anchor>
|
|
</Anchors>
|
|
<Scripts><OnLoad>GameMenuButton_Pending(self, HUD_EDIT_MODE_MENU)</OnLoad></Scripts>
|
|
</Button>
|
|
<Button name="GameMenuButtonSupport" inherits="GameMenuButtonTemplate">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT" relativeTo="GameMenuButtonEditMode" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor>
|
|
</Anchors>
|
|
<Scripts><OnLoad>GameMenuButton_Pending(self, GAMEMENU_SUPPORT)</OnLoad></Scripts>
|
|
</Button>
|
|
<Button name="GameMenuButtonMacros" inherits="GameMenuButtonTemplate" text="MACROS">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT" relativeTo="GameMenuButtonSupport" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor>
|
|
</Anchors>
|
|
<!-- The reference's body (GameMenuFrame.xml l.118-122). -->
|
|
<Scripts>
|
|
<OnClick>
|
|
PlaySound("igMainMenuOption")
|
|
HideUIPanel(getglobal("GameMenuFrame"))
|
|
ShowMacroFrame()
|
|
</OnClick>
|
|
</Scripts>
|
|
</Button>
|
|
|
|
<!-- The reference's OnShow disables Logout and Exit Game while a CAMP or QUIT countdown
|
|
is up, so a running countdown cannot be re-armed. -->
|
|
<Button name="GameMenuButtonLogout" inherits="GameMenuButtonTemplate" text="LOGOUT">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT" relativeTo="GameMenuButtonMacros" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20"/></Offset></Anchor>
|
|
</Anchors>
|
|
<Scripts>
|
|
<OnShow>
|
|
if not StaticPopup_Visible("CAMP") and not StaticPopup_Visible("QUIT") then
|
|
self:Enable()
|
|
else
|
|
self:Disable()
|
|
end
|
|
</OnShow>
|
|
<OnClick>
|
|
PlaySound("igMainMenuLogout")
|
|
Logout()
|
|
HideUIPanel(GameMenuFrame)
|
|
</OnClick>
|
|
</Scripts>
|
|
</Button>
|
|
<Button name="GameMenuButtonQuit" inherits="GameMenuButtonTemplate" text="EXIT_GAME">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT" relativeTo="GameMenuButtonLogout" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor>
|
|
</Anchors>
|
|
<Scripts>
|
|
<OnShow>
|
|
if not StaticPopup_Visible("CAMP") and not StaticPopup_Visible("QUIT") then
|
|
self:Enable()
|
|
else
|
|
self:Disable()
|
|
end
|
|
</OnShow>
|
|
<OnClick>
|
|
PlaySound("igMainMenuQuit")
|
|
Quit()
|
|
HideUIPanel(GameMenuFrame)
|
|
</OnClick>
|
|
</Scripts>
|
|
</Button>
|
|
<Button name="GameMenuButtonContinue" inherits="GameMenuButtonTemplate" text="RETURN_TO_GAME">
|
|
<Anchors>
|
|
<Anchor point="TOPLEFT" relativeTo="GameMenuButtonQuit" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20"/></Offset></Anchor>
|
|
</Anchors>
|
|
<Scripts>
|
|
<OnClick>
|
|
PlaySound("igMainMenuContinue")
|
|
HideUIPanel(GameMenuFrame)
|
|
</OnClick>
|
|
</Scripts>
|
|
</Button>
|
|
</Frames>
|
|
<!-- The reference's OnShow/OnHide: the Main Menu micro button pushes in and the bag
|
|
buttons grey out while the menu is up. Guarded for a test that loads this file
|
|
without the action bar. -->
|
|
<Scripts>
|
|
<OnShow>
|
|
-- Deviation: ERA_WINDOW_SCALE (OptionsFrame.xml, loaded earlier) stands in for the
|
|
-- UIParent scale the era draws this menu and its options window at.
|
|
-- A second OnShow on this frame would replace this one: the last SetScript wins.
|
|
this:SetScale(ERA_WINDOW_SCALE or 1)
|
|
if UpdateMicroButtons then UpdateMicroButtons() end
|
|
if Disable_BagButtons then Disable_BagButtons() end
|
|
</OnShow>
|
|
<OnHide>
|
|
if UpdateMicroButtons then UpdateMicroButtons() end
|
|
if Enable_BagButtons then Enable_BagButtons() end
|
|
</OnHide>
|
|
</Scripts>
|
|
</Frame>
|
|
</Ui>
|