Files
benilla-octo/crates/benilla/assets/ui/MacroFrame.xml
T
SamandClaude Fable 5 77dc8f8ead pets get their action bar, macros arrive, and hunters draw the bow
- a hunter's or warlock's pet has its action bar now: attack, follow, stay, the pet's own spells with cooldowns and autocast sparkles
- the macro system lands: the macro window, the icon chooser, /cast and /macro, and macros dragged onto the action bar
- hunter shots look right at last: the bow draws and releases on the shot, and the arrow lays a spark trail its whole flight
- the options window re-dresses in 1.12's own art with the classic dialog look, and gets a working search box and clickable steppers

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:03:13 +07:00

934 lines
57 KiB
XML

<Ui>
<!--
benilla's MACRO window (decision 0983) — the 384x512 macro editor + its name/icon popup,
transcribed from the real 1.12 `Interface\AddOns\Blizzard_MacroUI\Blizzard_MacroUI.xml`
and `.lua` (extracted from the MPQ chain to session scratch; director-local reference
artifacts, never committed — the 0068/0138 pattern. Line cites below are into that
extraction). All the art it names is shipped: `Interface\MacroFrame\MacroFrame-Icon`,
`-BotLeft`, `-BotRight`, `MacroPopup-{Top,Bot}{Left,Right}` (verified present in
interface.MPQ), plus the PaperDollInfoFrame top halves and the ClassTrainerFrame bar the
ref itself borrows.
Docks the left UIPanel slot with the ref's own registration row
(`UIPanelWindows["MacroFrame"] = { area = "left", pushable = 5, whileDead = 1 }`,
Blizzard_MacroUI.lua:7 — mirrored in UiPanels.xml). `whileDead` is the reference's, and it
matters: writing a macro while you run back as a ghost is a real thing people do.
The usual house deviation, applied consistently: every frame here is Benilla-prefixed. The
ref's global entry point `ShowMacroFrame()` keeps its BARE name (UIParent.lua:198 — the
game menu's Macros button and `SlashCmdList["MACRO"]` both call it), matching this
codebase's own `ToggleCharacter`/`ToggleQuestLog`/`ToggleSpellBook` precedent.
THE MODEL IS THE ENGINE'S. Unlike every other window in this folder, the macro table is not
an app feed: 1.12 macros have no server side at all, so `benilla_ui::script::macros` owns
the table and this file drives it through the reference's own API —
`GetNumMacros`/`GetMacroInfo`/`GetMacroIndexByName`/`CreateMacro`/`EditMacro`/
`DeleteMacro`/`PickupMacro`/`GetNumMacroIcons`/`GetMacroIconInfo`. `UPDATE_MACROS` (the
ref's own event) fires on every change, including the load at world entry, and is what
redraws this window.
DELIBERATE DEVIATIONS, each re-cited at its site:
- THE BODY BOX SIZES ITS OWN SCROLL CHILD. The ref's `MacroFrameScrollFrame` inherits
`UIPanelScrollFrameTemplate`, whose C-side `UpdateScrollChildRect` auto-grows the child
to the text — the engine gap TalentFrame.xml and QuestLogFrame.xml both document. Here
the child is an EditBox whose height is recomputed from the text on every change
(`BenillaMacroFrameText_Resize`), over-estimating wrapped lines rather than clipping.
- `MacroFrameTextButton` (the ref's invisible click-to-focus plate over the body) is kept
— this engine's EditBox does not self-focus on a click through a ScrollFrame.
- The ref's `PanelTemplates_TabResize(-15, ...)` width tuning and its manual
`HighlightTexture:SetWidth(GetTextWidth() + 31)` are dropped: `TabButtonTemplate`
(UiPanels.xml) already does its own text-fit on load, and re-doing it here would fight
it (the same call the trainer/talent tabs already omit).
- `PlaySound("igCharacterInfoOpen"/"Close"/"gsTitleOptionOK")` are kept — this engine has
PlaySound and those kit names resolve.
-->
<Script><![CDATA[
-- ref Blizzard_MacroUI.lua:1-5, verbatim.
MAX_MACROS = 18
NUM_MACRO_ICONS_SHOWN = 20
NUM_ICONS_PER_ROW = 5
NUM_ICON_ROWS = 4
MACRO_ICON_ROW_HEIGHT = 36
-- The body box's own scroll sizing (this file's header comment). `letters="255"` caps the
-- body, and the box is ~286 wide at GameFontHighlightSmall, so ~48 characters fit a line.
-- The child height is `(explicit lines + wrap allowance) * line height`, which can only
-- OVER-estimate — an over-estimate costs a little empty scroll room, an under-estimate
-- clips text the player typed.
BENILLA_MACRO_LINE_H = 14
BENILLA_MACRO_CHARS_PER_LINE = 48
BENILLA_MACRO_BODY_H = 85 -- the ref's own MacroFrameScrollFrame height (ref l.396)
function BenillaMacroFrameText_Resize()
local box = getglobal("BenillaMacroFrameText")
local text = box:GetText() or ""
local lines, pos = 1, 1
while true do
local at = string.find(text, "\n", pos, true)
if not at then break end
lines, pos = lines + 1, at + 1
end
local wrap = math.ceil(string.len(text) / BENILLA_MACRO_CHARS_PER_LINE)
local h = (lines + wrap) * BENILLA_MACRO_LINE_H
if h < BENILLA_MACRO_BODY_H then h = BENILLA_MACRO_BODY_H end
box:SetHeight(h)
local scroll = getglobal("BenillaMacroFrameScrollFrame")
scroll:UpdateScrollChildRect()
BenillaScroll_SyncBar(scroll)
end
function BenillaMacroFrameScrollFrame_OnLoad(scrollFrame)
scrollFrame:SetScrollChild(getglobal("BenillaMacroFrameText"))
BenillaScroll_SyncBar(scrollFrame)
end
-- Tab 2's label is the ref's own `format(CHARACTER_SPECIFIC_MACROS, UnitName("player"))`
-- (ref MacroFrame.xml l.509), re-derived on every show because the player name is not known
-- at load time here. Guarded on the global string itself: a VM without GlobalStrings (the
-- shipped-XML load test) must not die in an OnLoad.
function BenillaMacroFrame_TabTwoLabel()
if not CHARACTER_SPECIFIC_MACROS then return "Character" end
return format(CHARACTER_SPECIFIC_MACROS, UnitName("player") or "")
end
-- ref UIParent.lua:198-203. No LoadAddOn here: benilla has no load-on-demand addon layer,
-- so the window is always loaded and this is a plain Show.
function ShowMacroFrame()
ShowUIPanel(getglobal("BenillaMacroFrame"))
end
-- ref Blizzard_MacroUI.lua:13-17.
function BenillaMacroFrame_OnLoad(frame)
BenillaMacroFrame_SetAccountMacros()
PanelTemplates_SetNumTabs(frame, 2)
PanelTemplates_SetTab(frame, 1)
end
-- ref l.19-29. The OnHide save is the reference's own "closing the window commits the
-- body you were typing" — the single most load-bearing line in this file.
function BenillaMacroFrame_OnShow()
BenillaMacroFrame_Update()
PlaySound("igCharacterInfoOpen")
end
function BenillaMacroFrame_OnHide()
getglobal("BenillaMacroPopupFrame"):Hide()
BenillaMacroFrame_SaveMacro()
PlaySound("igCharacterInfoClose")
end
-- ref l.31-49.
function BenillaMacroFrame_SetAccountMacros()
local frame = getglobal("BenillaMacroFrame")
frame.macroBase = 0
local numAccountMacros = GetNumMacros()
if numAccountMacros > 0 then
BenillaMacroFrame_SelectMacro(frame.macroBase + 1)
else
BenillaMacroFrame_SelectMacro(nil)
end
end
function BenillaMacroFrame_SetCharacterMacros()
local frame = getglobal("BenillaMacroFrame")
frame.macroBase = MAX_MACROS
local numAccountMacros, numCharacterMacros = GetNumMacros()
if numCharacterMacros > 0 then
BenillaMacroFrame_SelectMacro(frame.macroBase + 1)
else
BenillaMacroFrame_SelectMacro(nil)
end
end
-- DEVIATION (this window is always loaded; the ref's is LoadOnDemand). The ref's
-- `MacroFrame_OnLoad` — which picks the first macro — runs the instant the addon loads,
-- i.e. immediately before the first open, so it always sees the real macro table. Ours
-- runs at boot, before the app has loaded a single macro from disk, so the selection has
-- to be re-established whenever the table can have moved. One place: the top of _Update,
-- which every show, every UPDATE_MACROS, every tab switch and every delete already runs
-- through. A still-valid selection is left alone (reopening the window keeps your place,
-- exactly as the ref's does).
function BenillaMacroFrame_EnsureSelection()
local frame = getglobal("BenillaMacroFrame")
local numAccount, numChar = GetNumMacros()
local numMacros = numAccount
if frame.macroBase ~= 0 then numMacros = numChar end
local sel = frame.selectedMacro
if sel and sel > frame.macroBase and sel <= (frame.macroBase + numMacros) then
return
end
if numMacros > 0 then
BenillaMacroFrame_SelectMacro(frame.macroBase + 1)
else
BenillaMacroFrame_SelectMacro(nil)
end
end
-- ref l.51-120, transcribed.
function BenillaMacroFrame_Update()
BenillaMacroFrame_EnsureSelection()
local frame = getglobal("BenillaMacroFrame")
local numAccountMacros, numCharacterMacros = GetNumMacros()
local numMacros
if frame.macroBase == 0 then
numMacros = numAccountMacros
else
numMacros = numCharacterMacros
end
for i = 1, MAX_MACROS do
local macroButton = getglobal("BenillaMacroButton" .. i)
local macroIcon = getglobal("BenillaMacroButton" .. i .. "Icon")
local macroName = getglobal("BenillaMacroButton" .. i .. "Name")
if i <= numMacros then
local name, texture, body = GetMacroInfo(frame.macroBase + i)
macroIcon:SetTexture(texture)
macroName:SetText(name)
macroButton:Enable()
if frame.selectedMacro and (i == (frame.selectedMacro - frame.macroBase)) then
macroButton:SetChecked(1)
getglobal("BenillaMacroFrameSelectedMacroName"):SetText(name)
getglobal("BenillaMacroFrameText"):SetText(body)
getglobal("BenillaMacroFrameSelectedMacroButton"):SetID(i)
getglobal("BenillaMacroFrameSelectedMacroButtonIcon"):SetTexture(texture)
else
macroButton:SetChecked(0)
end
else
macroButton:SetChecked(0)
macroIcon:SetTexture("")
macroName:SetText("")
macroButton:Disable()
end
end
if frame.selectedMacro ~= nil then
BenillaMacroFrame_ShowDetails()
else
BenillaMacroFrame_HideDetails()
end
if numMacros == MAX_MACROS then
getglobal("BenillaMacroNewButton"):Disable()
else
getglobal("BenillaMacroNewButton"):Enable()
end
if getglobal("BenillaMacroPopupFrame"):IsVisible() then
getglobal("BenillaMacroEditButton"):Disable()
getglobal("BenillaMacroDeleteButton"):Disable()
else
getglobal("BenillaMacroEditButton"):Enable()
getglobal("BenillaMacroDeleteButton"):Enable()
end
if not frame.selectedMacro then
getglobal("BenillaMacroDeleteButton"):Disable()
end
-- The body's scroll range follows whatever SetText just put in the box.
BenillaMacroFrameText_Resize()
end
-- ref l.122-126. The engine calls nothing by this name; the spellbook's shift-click does
-- (SpellBookFrame.xml, ref SpellBookFrame.lua:272-280) — the "shift click a spell in your
-- spellbook with the macro UI open" line MACRO_HELP_TEXT_LINE5 advertises.
function BenillaMacroFrame_AddMacroLine(line)
local box = getglobal("BenillaMacroFrameText")
if box:IsVisible() then
box:SetText((box:GetText() or "") .. line)
getglobal("BenillaMacroFrame").textChanged = 1
BenillaMacroFrameText_Resize()
end
end
-- ref l.128-138.
function BenillaMacroButton_OnClick(button)
local frame = getglobal("BenillaMacroFrame")
BenillaMacroFrame_SaveMacro()
BenillaMacroFrame_SelectMacro(frame.macroBase + button:GetID())
BenillaMacroFrame_Update()
getglobal("BenillaMacroPopupFrame"):Hide()
getglobal("BenillaMacroFrameText"):ClearFocus()
end
function BenillaMacroFrame_SelectMacro(id)
getglobal("BenillaMacroFrame").selectedMacro = id
end
-- ref l.140-150.
function BenillaMacroNewButton_OnClick()
BenillaMacroFrame_SaveMacro()
local popup = getglobal("BenillaMacroPopupFrame")
popup.mode = "new"
popup:Show()
end
function BenillaMacroEditButton_OnClick()
BenillaMacroFrame_SaveMacro()
local popup = getglobal("BenillaMacroPopupFrame")
popup.mode = "edit"
popup:Show()
end
-- ref l.152-169.
function BenillaMacroFrame_HideDetails()
getglobal("BenillaMacroEditButton"):Hide()
getglobal("BenillaMacroFrameCharLimitText"):Hide()
getglobal("BenillaMacroFrameEnterMacroText"):Hide()
getglobal("BenillaMacroFrameText"):Hide()
getglobal("BenillaMacroFrameSelectedMacroName"):Hide()
getglobal("BenillaMacroFrameSelectedMacroBackground"):Hide()
getglobal("BenillaMacroFrameSelectedMacroButton"):Hide()
end
function BenillaMacroFrame_ShowDetails()
getglobal("BenillaMacroEditButton"):Show()
getglobal("BenillaMacroFrameCharLimitText"):Show()
getglobal("BenillaMacroFrameEnterMacroText"):Show()
getglobal("BenillaMacroFrameText"):Show()
getglobal("BenillaMacroFrameSelectedMacroName"):Show()
getglobal("BenillaMacroFrameSelectedMacroBackground"):Show()
getglobal("BenillaMacroFrameSelectedMacroButton"):Show()
end
-- ref l.171-213.
function BenillaMacroPopupFrame_OnShow(popup)
if popup.mode == "new" then
getglobal("BenillaMacroFrameText"):Hide()
getglobal("BenillaMacroFrameSelectedMacroButtonIcon"):SetTexture("")
popup.selectedIcon = nil
end
getglobal("BenillaMacroFrameText"):ClearFocus()
getglobal("BenillaMacroPopupEditBox"):SetFocus()
PlaySound("igCharacterInfoOpen")
BenillaMacroPopupFrame_Update(true) -- the ONE caller that resets the name box
BenillaMacroPopupOkayButton_Update()
getglobal("BenillaMacroEditButton"):Disable()
getglobal("BenillaMacroDeleteButton"):Disable()
getglobal("BenillaMacroNewButton"):Disable()
getglobal("BenillaMacroFrameTab1"):Disable()
getglobal("BenillaMacroFrameTab2"):Disable()
end
function BenillaMacroPopupFrame_OnHide(popup)
local frame = getglobal("BenillaMacroFrame")
if popup.mode == "new" then
getglobal("BenillaMacroFrameText"):Show()
getglobal("BenillaMacroFrameText"):SetFocus()
end
getglobal("BenillaMacroEditButton"):Enable()
getglobal("BenillaMacroDeleteButton"):Enable()
local numAccountMacros, numCharacterMacros = GetNumMacros()
local numMacros
if frame.macroBase == 0 then
numMacros = numAccountMacros
else
numMacros = numCharacterMacros
end
if numMacros < MAX_MACROS then
getglobal("BenillaMacroNewButton"):Enable()
end
PanelTemplates_UpdateTabs(frame)
end
-- ref l.215-250, with ONE faithfulness note that is easy to get wrong. The ref's body
-- opens `if ( this.mode == "new" ) then MacroPopupEditBox:SetText("")` — and `this` there
-- is the FrameScript caller, not the popup: from `MacroPopupFrame_OnShow` it IS the popup
-- (so a fresh "new" clears the name box), but from `MacroPopupButton_OnClick` it is the
-- clicked BUTTON, whose `.mode` is nil, so neither branch runs and the name you already
-- typed survives the icon click. Substituting the popup for `this` would blank the name on
-- every icon click — the reference does not do that. Modelled explicitly instead: only the
-- OnShow path asks for the name reset.
function BenillaMacroPopupFrame_Update(resetName)
local popup = getglobal("BenillaMacroPopupFrame")
local scrollFrame = getglobal("BenillaMacroPopupScrollFrame")
local numMacroIcons = GetNumMacroIcons()
local macroPopupOffset = BenillaFauxScrollFrame_GetOffset(scrollFrame)
if resetName then
if popup.mode == "new" then
getglobal("BenillaMacroPopupEditBox"):SetText("")
elseif popup.mode == "edit" then
local name = GetMacroInfo(getglobal("BenillaMacroFrame").selectedMacro)
getglobal("BenillaMacroPopupEditBox"):SetText(name or "")
end
end
for i = 1, NUM_MACRO_ICONS_SHOWN do
local icon = getglobal("BenillaMacroPopupButton" .. i .. "Icon")
local button = getglobal("BenillaMacroPopupButton" .. i)
local index = (macroPopupOffset * NUM_ICONS_PER_ROW) + i
if index <= numMacroIcons then
icon:SetTexture(GetMacroIconInfo(index))
button:Show()
else
icon:SetTexture("")
button:Hide()
end
if index == popup.selectedIcon then
button:SetChecked(1)
else
button:SetChecked(nil)
end
end
BenillaFauxScrollFrame_Update(scrollFrame,
math.ceil(numMacroIcons / NUM_ICONS_PER_ROW), NUM_ICON_ROWS, MACRO_ICON_ROW_HEIGHT)
end
-- ref l.252-261. The "edit" arm's second Enable is the ref's own: renaming an existing
-- macro does not require re-picking an icon.
function BenillaMacroPopupOkayButton_Update()
local popup = getglobal("BenillaMacroPopupFrame")
local okay = getglobal("BenillaMacroPopupOkayButton")
local text = getglobal("BenillaMacroPopupEditBox"):GetText() or ""
if string.len(text) > 0 and popup.selectedIcon then
okay:Enable()
else
okay:Disable()
end
if popup.mode == "edit" and string.len(text) > 0 then
okay:Enable()
end
end
-- ref l.263-268.
function BenillaMacroPopupButton_OnClick(button)
local popup = getglobal("BenillaMacroPopupFrame")
local scrollFrame = getglobal("BenillaMacroPopupScrollFrame")
popup.selectedIcon = button:GetID()
+ (BenillaFauxScrollFrame_GetOffset(scrollFrame) * NUM_ICONS_PER_ROW)
getglobal("BenillaMacroFrameSelectedMacroButtonIcon")
:SetTexture(GetMacroIconInfo(popup.selectedIcon))
BenillaMacroPopupOkayButton_Update()
BenillaMacroPopupFrame_Update()
end
-- ref l.270-280. `perCharacter` is the ref's own `(MacroFrame.macroBase > 0)`.
function BenillaMacroPopupOkayButton_OnClick()
local frame = getglobal("BenillaMacroFrame")
local popup = getglobal("BenillaMacroPopupFrame")
local name = getglobal("BenillaMacroPopupEditBox"):GetText()
local index = 1
if popup.mode == "new" then
index = CreateMacro(name, popup.selectedIcon, nil, nil, (frame.macroBase > 0))
elseif popup.mode == "edit" then
index = EditMacro(frame.selectedMacro, name, popup.selectedIcon)
end
popup:Hide()
BenillaMacroFrame_SelectMacro(index)
BenillaMacroFrame_Update()
end
-- ref l.282-287.
function BenillaMacroFrame_SaveMacro()
local frame = getglobal("BenillaMacroFrame")
if frame.textChanged and frame.selectedMacro then
EditMacro(frame.selectedMacro, nil, nil, getglobal("BenillaMacroFrameText"):GetText())
frame.textChanged = nil
end
end
-- The body box's OnTextChanged (ref MacroFrame.xml l.411-427): mark dirty, close a "new"
-- popup, refresh the character counter, and keep the view pinned to the bottom while
-- typing (the ref's own scrollBar:SetValue(max) tail).
function BenillaMacroFrameText_OnTextChanged(box)
local frame = getglobal("BenillaMacroFrame")
frame.textChanged = 1
local popup = getglobal("BenillaMacroPopupFrame")
if popup.mode == "new" then
popup:Hide()
end
getglobal("BenillaMacroFrameCharLimitText")
:SetText(format(MACROFRAME_CHAR_LIMIT, box:GetNumLetters()))
BenillaMacroFrameText_Resize()
local bar = getglobal("BenillaMacroFrameScrollFrameBar")
local _, maxValue = bar:GetMinMaxValues()
if maxValue > 0 and box.maxScroll ~= maxValue then
box.maxScroll = maxValue
bar:SetValue(maxValue)
end
end
-- The window's own event driver: UPDATE_MACROS is the ref's event for "the macro table
-- changed" and covers BOTH an edit made here and the app's load at world entry, so a
-- freshly-entered world shows the saved macros without this file knowing about files.
function BenillaMacroFrame_OnEvent(frame, event)
if event == "UPDATE_MACROS" then
BenillaMacroFrame_EnsureSelection()
if frame:IsVisible() then
BenillaMacroFrame_Update()
end
end
end
]]></Script>
<!--
ref MacroFrameButtonTemplate (l.4-52): a 36x36 CheckButton whose NormalTexture IS the icon
($parentIcon), over the empty-slot plate, with the name outlined along the bottom.
-->
<CheckButton name="BenillaMacroFrameButtonTemplate" virtual="true">
<Size><AbsDimension x="36" y="36"/></Size>
<Layers>
<Layer level="OVERLAY">
<FontString name="$parentName" inherits="GameFontHighlightSmallOutline">
<Size><AbsDimension x="36" y="10"/></Size>
<Anchors><Anchor point="BOTTOM"><Offset><AbsDimension x="0" y="2"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
<Layer level="BACKGROUND">
<Texture file="Interface\Buttons\UI-EmptySlot-Disabled">
<Size><AbsDimension x="64" y="64"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="0" y="-1"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
</Layers>
<NormalTexture name="$parentIcon">
<Size><AbsDimension x="36" y="36"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="0" y="-1"/></Offset></Anchor></Anchors>
</NormalTexture>
<HighlightTexture alphaMode="ADD" file="Interface\Buttons\ButtonHilight-Square"/>
<CheckedTexture alphaMode="ADD" file="Interface\Buttons\CheckButtonHilight"/>
</CheckButton>
<!-- ref MacroButtonTemplate (l.53-65): the list button — click selects, drag picks up. -->
<CheckButton name="BenillaMacroButtonTemplate" inherits="BenillaMacroFrameButtonTemplate" virtual="true">
<Scripts>
<OnLoad>self:RegisterForDrag("LeftButton")</OnLoad>
<OnClick>BenillaMacroButton_OnClick(self)</OnClick>
<OnDragStart>PickupMacro(getglobal("BenillaMacroFrame").macroBase + self:GetID())</OnDragStart>
</Scripts>
</CheckButton>
<!-- ref MacroPopupButtonTemplate (l.66-72). -->
<CheckButton name="BenillaMacroPopupButtonTemplate" inherits="BenillaMacroFrameButtonTemplate" virtual="true">
<Scripts>
<OnClick>BenillaMacroPopupButton_OnClick(self)</OnClick>
</Scripts>
</CheckButton>
<!-- The panel button face (the TrainerFrame precedent — this engine ships no
UIPanelButtonTemplate/UIPanelButtonGrayTemplate). -->
<Button name="BenillaMacroPanelButtonTemplate" virtual="true">
<Size><AbsDimension x="80" y="22"/></Size>
<NormalFont inherits="GameFontNormal"/>
<HighlightFont inherits="GameFontHighlight"/>
<DisabledFont inherits="GameFontDisable"/>
<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></PushedTexture>
<DisabledTexture file="Interface\Buttons\UI-Panel-Button-Disabled"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></DisabledTexture>
<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD"><TexCoords left="0" right="0.625" top="0" bottom="0.6875"/></HighlightTexture>
</Button>
<!-- ref MacroFrame (l.73-618). No <Anchors>: ShowUIPanel SetPoints this into the left slot. -->
<Frame name="BenillaMacroFrame" hidden="true">
<Size><AbsDimension x="384" y="512"/></Size>
<Layers>
<Layer level="BACKGROUND">
<Texture name="BenillaMacroFramePortrait" file="Interface\MacroFrame\MacroFrame-Icon">
<Size><AbsDimension x="60" y="60"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="7" y="-6"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
<!-- The four quadrant slabs: the ref borrows PaperDollInfoFrame's two top halves and
uses MacroFrame's own two bottoms (ref l.103-134). -->
<Layer level="BORDER">
<Texture file="Interface\PaperDollInfoFrame\UI-Character-General-TopLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-General-TopRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPRIGHT"/></Anchors>
</Texture>
<Texture file="Interface\MacroFrame\MacroFrame-BotLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="BOTTOMLEFT"/></Anchors>
</Texture>
<Texture file="Interface\MacroFrame\MacroFrame-BotRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="BOTTOMRIGHT"/></Anchors>
</Texture>
<FontString inherits="GameFontNormal" text="CREATE_MACROS">
<Anchors><Anchor point="TOP"><Offset><AbsDimension x="0" y="-17"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
<Layer level="ARTWORK">
<!-- The divider between the 18-button grid and the detail pane (ref l.146-171). -->
<Texture name="BenillaMacroHorizontalBarLeft" file="Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar">
<Size><AbsDimension x="256" y="16"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="15" y="-220"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="1.0" top="0" bottom="0.25"/>
</Texture>
<Texture file="Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar">
<Size><AbsDimension x="75" y="16"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="BenillaMacroHorizontalBarLeft" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0" right="0.29296875" top="0.25" bottom="0.5"/>
</Texture>
<Texture name="BenillaMacroFrameSelectedMacroBackground" file="Interface\Buttons\UI-EmptySlot">
<Size><AbsDimension x="64" y="64"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="16" y="-228"/></Offset></Anchor></Anchors>
</Texture>
<FontString name="BenillaMacroFrameSelectedMacroName" inherits="GameFontNormalLarge" justifyH="LEFT">
<Size><AbsDimension x="256" y="16"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaMacroFrameSelectedMacroBackground" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="-4" y="-15"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="BenillaMacroFrameEnterMacroText" inherits="GameFontHighlightSmall" text="ENTER_MACRO_LABEL">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaMacroFrameSelectedMacroBackground" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="8" y="0"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="BenillaMacroFrameCharLimitText" inherits="GameFontHighlightSmall">
<Anchors><Anchor point="BOTTOM"><Offset><AbsDimension x="-15" y="105"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<!-- The detail pane's own big button: a drag source for the selected macro (ref
l.217-231 — its OnClick unchecks itself and picks up, never re-selects). -->
<CheckButton name="BenillaMacroFrameSelectedMacroButton" inherits="BenillaMacroButtonTemplate" id="0">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaMacroFrameSelectedMacroBackground">
<Offset><AbsDimension x="14" y="-14"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
self:SetChecked(nil)
PickupMacro(getglobal("BenillaMacroFrame").selectedMacro)
</OnClick>
</Scripts>
</CheckButton>
<!-- The 18-button grid: 3 rows of 6 (ref l.232-393; the ref's own 13px column gap and
10px row gap). -->
<CheckButton name="BenillaMacroButton1" inherits="BenillaMacroButtonTemplate" id="1">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="42" y="-83"/></Offset></Anchor></Anchors>
</CheckButton>
<CheckButton name="BenillaMacroButton2" inherits="BenillaMacroButtonTemplate" id="2"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton1" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton3" inherits="BenillaMacroButtonTemplate" id="3"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton2" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton4" inherits="BenillaMacroButtonTemplate" id="4"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton3" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton5" inherits="BenillaMacroButtonTemplate" id="5"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton4" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton6" inherits="BenillaMacroButtonTemplate" id="6"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton5" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton7" inherits="BenillaMacroButtonTemplate" id="7"><Anchors><Anchor point="TOP" relativeTo="BenillaMacroButton1" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-10"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton8" inherits="BenillaMacroButtonTemplate" id="8"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton7" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton9" inherits="BenillaMacroButtonTemplate" id="9"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton8" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton10" inherits="BenillaMacroButtonTemplate" id="10"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton9" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton11" inherits="BenillaMacroButtonTemplate" id="11"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton10" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton12" inherits="BenillaMacroButtonTemplate" id="12"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton11" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton13" inherits="BenillaMacroButtonTemplate" id="13"><Anchors><Anchor point="TOP" relativeTo="BenillaMacroButton7" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-10"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton14" inherits="BenillaMacroButtonTemplate" id="14"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton13" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton15" inherits="BenillaMacroButtonTemplate" id="15"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton14" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton16" inherits="BenillaMacroButtonTemplate" id="16"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton15" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton17" inherits="BenillaMacroButtonTemplate" id="17"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton16" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroButton18" inherits="BenillaMacroButtonTemplate" id="18"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroButton17" relativePoint="RIGHT"><Offset><AbsDimension x="13" y="0"/></Offset></Anchor></Anchors></CheckButton>
<!-- The body's tooltip-backdrop plate (ref MacroFrameTextBackground l.449-477), drawn
before the scroll frame so the text sits on it. -->
<Frame name="BenillaMacroFrameTextBackground">
<Size><AbsDimension x="322" y="95"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="18" y="-305"/></Offset></Anchor></Anchors>
<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
<EdgeSize><AbsValue val="16"/></EdgeSize>
<TileSize><AbsValue val="16"/></TileSize>
<BackgroundInsets><AbsInset left="5" right="5" top="5" bottom="5"/></BackgroundInsets>
</Backdrop>
<Scripts>
<OnLoad>
self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
</OnLoad>
</Scripts>
</Frame>
<!-- The body editor (ref MacroFrameScrollFrame l.394-435). A real ScrollFrame with a
self-sizing EditBox child + a real draggable Slider — this file's header comment. -->
<ScrollFrame name="BenillaMacroFrameScrollFrame">
<Size><AbsDimension x="286" y="85"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaMacroFrameSelectedMacroBackground" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="11" y="-18"/></Offset>
</Anchor>
</Anchors>
<Frames>
<!-- `$parentBar` is the real-scroll kit's own naming contract
(ScrollTemplates.xml: `BenillaScroll_SyncBar` derives the bar from the
frame's name). Its OnValueChanged REPLACES the faux handler the shared
Slider template carries — the TalentFrame precedent. -->
<Slider name="$parentBar" inherits="BenillaScrollBarTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="6" y="-16"/></Offset></Anchor>
<Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT"><Offset><AbsDimension x="6" y="16"/></Offset></Anchor>
</Anchors>
<Scripts>
<OnValueChanged>BenillaScrollBar_OnValueChanged(self, arg1)</OnValueChanged>
</Scripts>
</Slider>
<EditBox name="BenillaMacroFrameText" multiLine="true" letters="255" autoFocus="false">
<Size><AbsDimension x="286" y="85"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
<FontString inherits="GameFontHighlightSmall"/>
<Scripts>
<OnTextChanged>BenillaMacroFrameText_OnTextChanged(self)</OnTextChanged>
<OnEscapePressed>self:ClearFocus()</OnEscapePressed>
</Scripts>
</EditBox>
</Frames>
<Scripts>
<OnLoad>BenillaMacroFrameScrollFrame_OnLoad(self)</OnLoad>
</Scripts>
</ScrollFrame>
<!-- ref MacroFrameTextButton (l.436-448): the click-to-focus plate over the body. -->
<Button name="BenillaMacroFrameTextButton">
<Size><AbsDimension x="286" y="85"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaMacroFrameScrollFrame" relativePoint="TOPLEFT"/></Anchors>
<Scripts>
<OnClick>getglobal("BenillaMacroFrameText"):SetFocus()</OnClick>
</Scripts>
</Button>
<!-- The two tabs (ref l.478-520). Tab 2's label is the ref's own
`format(CHARACTER_SPECIFIC_MACROS, UnitName("player"))`, re-set on every show
because the player name is not known at load time in this client. -->
<Button name="BenillaMacroFrameTab1" inherits="TabButtonTemplate" text="GENERAL_MACROS" id="1">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="65" y="-39"/></Offset></Anchor></Anchors>
<Scripts>
<OnClick>
PanelTemplates_SetTab(getglobal("BenillaMacroFrame"), self:GetID())
BenillaMacroFrame_SaveMacro()
BenillaMacroFrame_SetAccountMacros()
BenillaMacroFrame_Update()
</OnClick>
</Scripts>
</Button>
<Button name="BenillaMacroFrameTab2" inherits="TabButtonTemplate" id="2">
<Anchors><Anchor point="LEFT" relativeTo="BenillaMacroFrameTab1" relativePoint="RIGHT"/></Anchors>
<Scripts>
<OnLoad>self:SetText(BenillaMacroFrame_TabTwoLabel())</OnLoad>
<OnClick>
PanelTemplates_SetTab(getglobal("BenillaMacroFrame"), self:GetID())
BenillaMacroFrame_SaveMacro()
BenillaMacroFrame_SetCharacterMacros()
BenillaMacroFrame_Update()
</OnClick>
</Scripts>
</Button>
<Button name="BenillaMacroEditButton" inherits="BenillaMacroPanelButtonTemplate" text="CHANGE_MACRO_NAME_ICON">
<Size><AbsDimension x="170" y="22"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaMacroFrameSelectedMacroBackground">
<Offset><AbsDimension x="51" y="-30"/></Offset>
</Anchor>
</Anchors>
<Scripts><OnClick>BenillaMacroEditButton_OnClick()</OnClick></Scripts>
</Button>
<Button name="BenillaMacroDeleteButton" inherits="BenillaMacroPanelButtonTemplate" text="DELETE">
<Anchors><Anchor point="BOTTOMLEFT"><Offset><AbsDimension x="17" y="79"/></Offset></Anchor></Anchors>
<Scripts>
<OnClick>
-- The ref relies on the button being Disabled (MacroFrame_Update) to keep
-- `selectedMacro` non-nil here; guard anyway — a script Click() bypasses
-- the disabled state and DeleteMacro(nil) is a hard error, not a no-op.
if not getglobal("BenillaMacroFrame").selectedMacro then return end
DeleteMacro(getglobal("BenillaMacroFrame").selectedMacro)
BenillaMacroFrame_SetAccountMacros()
if getglobal("BenillaMacroFrame").macroBase ~= 0 then
BenillaMacroFrame_SetCharacterMacros()
end
BenillaMacroFrame_Update()
getglobal("BenillaMacroFrameText"):ClearFocus()
</OnClick>
</Scripts>
</Button>
<Button name="BenillaMacroNewButton" inherits="BenillaMacroPanelButtonTemplate" text="NEW">
<Anchors><Anchor point="CENTER" relativePoint="TOPLEFT"><Offset><AbsDimension x="222" y="-422"/></Offset></Anchor></Anchors>
<Scripts><OnClick>BenillaMacroNewButton_OnClick()</OnClick></Scripts>
</Button>
<Button name="BenillaMacroExitButton" inherits="BenillaMacroPanelButtonTemplate" text="EXIT">
<Anchors><Anchor point="CENTER" relativePoint="TOPLEFT"><Offset><AbsDimension x="303" y="-422"/></Offset></Anchor></Anchors>
<Scripts><OnClick>HideUIPanel(getglobal("BenillaMacroFrame"))</OnClick></Scripts>
</Button>
<!-- The top-right X (ref a UIPanelCloseButton at TOPRIGHT (-29,-8); the minimize-button
art stands in — this engine ships no UIPanelCloseButton, TrainerFrame's precedent). -->
<Button name="BenillaMacroFrameCloseButton">
<Size><AbsDimension x="32" y="32"/></Size>
<Anchors><Anchor point="TOPRIGHT"><Offset><AbsDimension x="-29" y="-8"/></Offset></Anchor></Anchors>
<NormalTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Up"/>
<PushedTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Down"/>
<HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
<Scripts><OnClick>HideUIPanel(getglobal("BenillaMacroFrame"))</OnClick></Scripts>
</Button>
</Frames>
<Scripts>
<OnLoad>
BenillaMacroFrame_OnLoad(self)
self:RegisterEvent("UPDATE_MACROS")
</OnLoad>
<OnEvent>BenillaMacroFrame_OnEvent(self, event)</OnEvent>
<OnShow>
getglobal("BenillaMacroFrameTab2"):SetText(BenillaMacroFrame_TabTwoLabel())
BenillaMacroFrame_OnShow()
UpdateMicroButtons()
</OnShow>
<OnHide>
BenillaMacroFrame_OnHide()
UpdateMicroButtons()
</OnHide>
<OnMouseWheel>BenillaScroll_OnMouseWheel(getglobal("BenillaMacroFrameScrollFrame"), arg1)</OnMouseWheel>
</Scripts>
</Frame>
<!-- ref MacroPopupFrame (l.619-1005): the name + icon chooser, hung off the window's right edge. -->
<Frame name="BenillaMacroPopupFrame" toplevel="true" hidden="true">
<Size><AbsDimension x="297" y="298"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaMacroFrame" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="-40" y="-40"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture file="Interface\MacroFrame\MacroPopup-TopLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture file="Interface\MacroFrame\MacroPopup-TopRight">
<Size><AbsDimension x="64" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="256" y="0"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\MacroFrame\MacroPopup-BotLeft">
<Size><AbsDimension x="256" y="64"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="0" y="-256"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\MacroFrame\MacroPopup-BotRight">
<Size><AbsDimension x="64" y="64"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="256" y="-256"/></Offset></Anchor></Anchors>
</Texture>
<FontString inherits="GameFontHighlightSmall" text="MACRO_POPUP_TEXT">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="24" y="-21"/></Offset></Anchor></Anchors>
</FontString>
<FontString inherits="GameFontHighlightSmall" text="MACRO_POPUP_CHOOSE_ICON">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="24" y="-69"/></Offset></Anchor></Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<EditBox name="BenillaMacroPopupEditBox" letters="16" historyLines="0">
<Size><AbsDimension x="200" y="20"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="29" y="-35"/></Offset></Anchor></Anchors>
<Layers>
<Layer level="BACKGROUND">
<Texture name="BenillaMacroPopupNameLeft" file="Interface\ClassTrainerFrame\UI-ClassTrainer-FilterBorder">
<Size><AbsDimension x="12" y="29"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="-11" y="0"/></Offset></Anchor></Anchors>
<TexCoords left="0" right="0.09375" top="0" bottom="1.0"/>
</Texture>
<Texture name="BenillaMacroPopupNameMiddle" file="Interface\ClassTrainerFrame\UI-ClassTrainer-FilterBorder">
<Size><AbsDimension x="175" y="29"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupNameLeft" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.09375" right="0.90625" top="0" bottom="1.0"/>
</Texture>
<Texture name="BenillaMacroPopupNameRight" file="Interface\ClassTrainerFrame\UI-ClassTrainer-FilterBorder">
<Size><AbsDimension x="12" y="29"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupNameMiddle" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.90625" right="1.0" top="0" bottom="1.0"/>
</Texture>
</Layer>
</Layers>
<FontString inherits="ChatFontNormal"/>
<Scripts>
<OnTextChanged>
BenillaMacroPopupOkayButton_Update()
getglobal("BenillaMacroFrameSelectedMacroName"):SetText(self:GetText())
</OnTextChanged>
<OnEscapePressed>getglobal("BenillaMacroPopupFrame"):Hide()</OnEscapePressed>
<OnEnterPressed>
-- The ref writes `IsEnabled() ~= 0`; this engine's IsEnabled returns
-- a BOOLEAN (button.rs), for which `~= 0` is always true — plain
-- truthiness is the correct read here.
if getglobal("BenillaMacroPopupOkayButton"):IsEnabled() then
BenillaMacroPopupOkayButton_OnClick()
end
</OnEnterPressed>
</Scripts>
</EditBox>
<!-- The icon grid's faux scroll (ref a ClassTrainerListScrollFrameTemplate). -->
<Frame name="BenillaMacroPopupScrollFrame" inherits="BenillaFauxScrollFrameTemplate">
<Size><AbsDimension x="252" y="152"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="24" y="-85"/></Offset></Anchor></Anchors>
<Scripts>
<!-- The faux kit's contract (ScrollTemplates.xml): the owner sets updateFunc,
the shared Slider handler calls it whenever the row offset moves. -->
<OnLoad>
BenillaFauxScrollFrame_OnLoad(self)
self.updateFunc = BenillaMacroPopupFrame_Update
</OnLoad>
</Scripts>
</Frame>
<CheckButton name="BenillaMacroPopupButton1" inherits="BenillaMacroPopupButtonTemplate" id="1">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="24" y="-85"/></Offset></Anchor></Anchors>
</CheckButton>
<CheckButton name="BenillaMacroPopupButton2" inherits="BenillaMacroPopupButtonTemplate" id="2"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton1" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton3" inherits="BenillaMacroPopupButtonTemplate" id="3"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton2" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton4" inherits="BenillaMacroPopupButtonTemplate" id="4"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton3" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton5" inherits="BenillaMacroPopupButtonTemplate" id="5"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton4" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton6" inherits="BenillaMacroPopupButtonTemplate" id="6"><Anchors><Anchor point="TOPLEFT" relativeTo="BenillaMacroPopupButton1" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-8"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton7" inherits="BenillaMacroPopupButtonTemplate" id="7"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton6" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton8" inherits="BenillaMacroPopupButtonTemplate" id="8"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton7" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton9" inherits="BenillaMacroPopupButtonTemplate" id="9"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton8" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton10" inherits="BenillaMacroPopupButtonTemplate" id="10"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton9" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton11" inherits="BenillaMacroPopupButtonTemplate" id="11"><Anchors><Anchor point="TOPLEFT" relativeTo="BenillaMacroPopupButton6" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-8"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton12" inherits="BenillaMacroPopupButtonTemplate" id="12"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton11" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton13" inherits="BenillaMacroPopupButtonTemplate" id="13"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton12" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton14" inherits="BenillaMacroPopupButtonTemplate" id="14"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton13" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton15" inherits="BenillaMacroPopupButtonTemplate" id="15"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton14" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton16" inherits="BenillaMacroPopupButtonTemplate" id="16"><Anchors><Anchor point="TOPLEFT" relativeTo="BenillaMacroPopupButton11" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-8"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton17" inherits="BenillaMacroPopupButtonTemplate" id="17"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton16" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton18" inherits="BenillaMacroPopupButtonTemplate" id="18"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton17" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton19" inherits="BenillaMacroPopupButtonTemplate" id="19"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton18" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<CheckButton name="BenillaMacroPopupButton20" inherits="BenillaMacroPopupButtonTemplate" id="20"><Anchors><Anchor point="LEFT" relativeTo="BenillaMacroPopupButton19" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor></Anchors></CheckButton>
<Button name="BenillaMacroPopupCancelButton" inherits="BenillaMacroPanelButtonTemplate" text="CANCEL">
<Size><AbsDimension x="78" y="22"/></Size>
<Anchors><Anchor point="BOTTOMRIGHT"><Offset><AbsDimension x="-11" y="13"/></Offset></Anchor></Anchors>
<Scripts>
<OnClick>
getglobal("BenillaMacroPopupFrame"):Hide()
BenillaMacroFrame_Update()
PlaySound("gsTitleOptionOK")
</OnClick>
</Scripts>
</Button>
<Button name="BenillaMacroPopupOkayButton" inherits="BenillaMacroPanelButtonTemplate" text="OKAY">
<Size><AbsDimension x="78" y="22"/></Size>
<Anchors><Anchor point="RIGHT" relativeTo="BenillaMacroPopupCancelButton" relativePoint="LEFT"><Offset><AbsDimension x="-2" y="0"/></Offset></Anchor></Anchors>
<Scripts>
<OnClick>
BenillaMacroPopupOkayButton_OnClick()
PlaySound("gsTitleOptionOK")
</OnClick>
</Scripts>
</Button>
</Frames>
<Scripts>
<OnShow>BenillaMacroPopupFrame_OnShow(self)</OnShow>
<OnHide>BenillaMacroPopupFrame_OnHide(self)</OnHide>
<OnMouseWheel>BenillaFauxScrollFrame_OnMouseWheel(getglobal("BenillaMacroPopupScrollFrame"), arg1)</OnMouseWheel>
</Scripts>
</Frame>
</Ui>