Files
benilla-octo/crates/benilla-app/assets/ui/StanceBar.xml
T
SamandClaude Fable 5 cf581aa2ac the auction house opens, the Honor tab lands, and a day of fixes
- the auction house end to end: right-clicking an auctioneer opens Browse/Bids/Auctions on the server's reply — search, the category tree from your own DBCs, the reference's 50-a-page pager, multi-key sorting (directions corrected at the bytes), bid/buyout, the sell slot with deposit and duration, cancel with its fee popup; prices sit on the reference's own money-frame kit in lined-up columns, the twenty auction messages split refusals-red / outcomes-to-chat, and a won or sold auction reads as a proper mail receipt — the window's Lua re-worded in our own terms after the overlap ratchet caught the first cut leaning on the reference's text
- the PvP honor system whole: the Honor tab and the inspect page over a real wire model, with current rank and highest-ever rank correctly two different fields
- a day of reported fixes: WASD survives a /logout re-entry, addon settings save on a window close and Cmd+Q (exactly once — a mac close could fire the tail twice), clams open again, random-enchant items name themselves on every surface, the loot window's rows hold their seats with legible counts, idle players stop sinking through building floors, the shooter re-pulls between Auto Shots, portraits loosen ~19% to the client's own aspect-1.0 matrix, and big creatures thump the camera off the CameraShakes table
- character select clicks like 1.12 — captions whiten on hover, buttons fire on release, Humans face straight ahead off the stage bone's real yaw, the facing is per-character, and hunter/warlock pets stand beside you at their family-ramp size with their own emitters (the imp's flames), the Voidwalker's sequence-hidden shackles culled
- the smaller player-facing set: nameplate on/off rows in Options with the CanAttack category gate (emissaries stop plating), the bonus bar slides up with igBonusBarOpen, the camera's framing height glides on a shapeshift, the open letter evicts the centre seat, the far-band fog hull stops printing a pale horizon stripe at low view distance, the guide arrow is gold with per-source rim art, error text fades through its shadow too, and /convertraid converts the party
- README: the auction house and PvP honor move out of "not built yet"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 19:04:27 +07:00

375 lines
24 KiB
XML

<Ui>
<!--
The stance/shapeshift bar (vanilla ShapeshiftBarFrame, ref-BonusActionBarFrame.xml/.lua —
extracted from patch.MPQ). Warrior stances, druid forms, rogue Stealth: one CheckButton per
known form, checked = the ACTIVE form (the descriptor's UNIT_FIELD_BYTES_1 byte-2 form,
wow-re bonusbar-shapeshift.md), grey icon when not castable, cooldown swipe, click casts
the form (`crate::ui_shapeshift` drains CastShapeshiftForm onto the wire).
Geometry QUOTED from the ref's ShapeshiftBar_UpdatePosition (BonusActionBarFrame.lua
l.229-251), which forks on whether MultiBarBottomLeft is up: buttons 30x30, button1 at frame
BOTTOMLEFT +(11,3), chained +7; NormalTexture UI-Quickslot2 at the RAISED mode's 50x50 (ref
l.236-237), CENTER (0,-1) like the action template. Max 10 slots (NUM_SHAPESHIFT_SLOTS).
THE SEAT IS NOT THIS FILE'S — the XML anchor below (MainMenuBar TOPLEFT +(30,45)) is only
the value the manage pass computes with the bottom-left bar up, written statically so the
frame is somewhere sane before the first pass runs. `ShapeshiftBarFrame` is a managed row
(UIParent.xml: baseY 0, bottomLeft 45, xOffset 30), so the pass re-derives +45 raised and
+0 unraised — the ref's own two positions — and re-seats the frame on every bar change. That
used to be a distinction without a difference (0270's bottom bars were always on, so raised
was the only state); decision 1500 made all four extra bars player options, and the unraised
state is now reachable. It is covered, and `multibar_stance_tests` pins both seats.
The ART half of that same fork IS this file's, and it is `ShapeshiftBar_UpdatePosition` in
the script below: the ref's unraised branch also shows the ShapeshiftBarEnds/Middle shelf
strips and grows each button's ring from 50x50 to 64x64. That branch was dead code while the
bottom bars were always on, and 1500 made it the DEFAULT — every form class meets the
unraised bar on a fresh character — so a shelf-less bar would be the shipped look rather than
an edge case. It rides `UIParent_RegisterManagedPositionListener` (decision 1499's
after-every-recompute hook, the same one the bag stack uses) so the art settles when the pass
that decides raised-ness has finished, and it needs no edit to UIParent.xml.
Ref divergences (deliberate):
- ONE refresh event: the app diffs the whole pushed form list (identity, active, castable,
cooldown) and fires UPDATE_SHAPESHIFT_FORMS on any change — so the ref's separate
Update/UpdateState split over six events (SPELL_UPDATE_COOLDOWN/_USABLE,
PLAYER_AURAS_CHANGED, UPDATE_INVENTORY_ALERTS "Wha??", ACTIONBAR_PAGE_CHANGED) collapses
into Update on UPDATE_SHAPESHIFT_FORMS + PLAYER_ENTERING_WORLD.
- No lastSelected bookkeeping (ref ShapeshiftBar_ChangeForm) — checked state is always
re-derived from the pushed `isActive`, never locally latched: the server's form byte is
the truth and the app re-pushes on its every change. (Verified dead in the ref itself:
`lastSelected` is written twice and read nowhere in the shipped FrameXML.)
-->
<Script><![CDATA[
NUM_SHAPESHIFT_SLOTS = 10
-- RIGHT-CLICK IS DEAD HERE, and deliberately (decision 1030 reverting 1027). The ref's
-- ShapeshiftButtonTemplate registers NOTHING: it inherits ActionButtonTemplate and then
-- overrides <OnLoad> with a body that only scales the cooldown, so the
-- `RegisterForClicks("LeftButtonUp","RightButtonUp")` that ActionButton_OnLoad gives every
-- other action-style button (ref ActionButton.lua:109) is lost and the default
-- {LeftButtonUp} stands. A right-press therefore neither flashes the pushed art
-- (0x77924b gates that on the same mask) nor casts. It reads like a Blizzard oversight
-- and it is the only bar that behaves this way — reproduced anyway, because the director
-- checked it against the reference and called faithful.
function BenillaShapeshiftButton_OnLoad(button, index)
button.index = index
button.icon = getglobal(button:GetName() .. "Icon")
button.cooldown = getglobal(button:GetName() .. "Cooldown")
end
-- The CheckButton widget toggles itself BEFORE OnClick fires (the widget contract); the
-- ref immediately reverts that toggle (ShapeshiftButtonTemplate OnClick, ref-
-- BonusActionBarFrame.xml l.31-38), so the checked ring never follows the click — only
-- the isActive repaint. That is what keeps a warrior's ACTIVE stance lit through the
-- click's silent wire no-op (stances never cancel — the 0x4b4963 guard), and a druid
-- form/Stealth lit until the server actually confirms the shift-out. The revert is
-- unconditional, which is why no click here can leave a lit form dark — unlike the pet
-- bar's flat SetChecked(0), which needs a repaint to be correct.
function BenillaShapeshiftButton_OnClick(button)
if button:GetChecked() then
button:SetChecked(nil)
else
button:SetChecked(1)
end
CastShapeshiftForm(button.index)
end
-- Hover: the form's spell tooltip through the engine channel (ref ShapeshiftBar's
-- GameTooltip:SetShapeshift; decision 0274 P2). Anchor: the ref's ShapeshiftButton
-- OnEnter (BonusActionBarFrame.xml l.40-45) takes the default corner when UberTooltips
-- is "1" — its byte-verified stock default — and sits beside the button otherwise. Like
-- the action bar's, that fork was collapsed to the "1" leg until B230 registered the CVar
-- (cvars.rs carries the byte-read); the stock look is unchanged, the off leg is reachable.
function BenillaShapeshiftButton_OnEnter(button)
if not GameTooltip then return end -- engine tests load file subsets
if GetCVar("UberTooltips") == "0" then
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
else
GameTooltip_SetDefaultAnchor(GameTooltip, button)
end
GameTooltip:SetShapeshift(button.index)
end
function BenillaShapeshiftButton_OnLeave(button)
GameTooltip:Hide()
end
-- Ref ShapeshiftBar_Update + ShapeshiftBar_UpdateState fused (SCOPE note above): size the
-- bar to the form count (hide the whole frame at 0 — a formless class never shows it),
-- then paint each button — icon, checked (active), the 1.0/0.4 castable tint (ref l.210-214),
-- cooldown swipe (CooldownFrame_SetTimer, Cooldown.xml's shared transcription).
function ShapeshiftBar_Update()
local numForms = GetNumShapeshiftForms()
if numForms > 0 then
-- ── The shelf's LENGTH is the form count (ref l.161-175) ─────────────────────
-- The three strips are DECLARED as the >2-form chain (Left → Middle → Right), so
-- the one- and two-form shelves have to re-point the end cap. Hiding the middle
-- strip does NOT close its gap — a hidden region still resolves its rect, here
-- and in the reference — so without this the 42x50 right cap sits 38px past the
-- last button as a stray empty recess: a rogue's Stealth with a second, always-
-- empty slot beside it. One form pulls the cap back INSIDE the left cap (+12, a
-- 54px shelf around the single button); two butt the caps together; past two the
-- middle strip carries one slot per extra form and the cap chains off it.
if numForms == 1 then
ShapeshiftBarRight:SetPoint("LEFT", ShapeshiftBarLeft, "LEFT", 12, 0)
elseif numForms == 2 then
ShapeshiftBarRight:SetPoint("LEFT", ShapeshiftBarLeft, "RIGHT", 0, 0)
else
ShapeshiftBarMiddle:SetPoint("LEFT", ShapeshiftBarLeft, "RIGHT", 0, 0)
ShapeshiftBarMiddle:SetWidth(38 * (numForms - 2))
ShapeshiftBarMiddle:SetTexCoord(0, numForms - 2, 0, 1)
ShapeshiftBarRight:SetPoint("LEFT", ShapeshiftBarMiddle, "RIGHT", 0, 0)
end
ShapeshiftBarFrame:Show()
else
ShapeshiftBarFrame:Hide()
end
for i = 1, NUM_SHAPESHIFT_SLOTS do
local button = getglobal("ShapeshiftButton" .. i)
if i <= numForms then
local texture, name, isActive, isCastable = GetShapeshiftFormInfo(i)
button.icon:SetTexture(texture or BENILLA_FALLBACK_ICON)
local start, duration, enable = GetShapeshiftFormCooldown(i)
CooldownFrame_SetTimer(button.cooldown, start, duration, enable)
if isActive then
button:SetChecked(1)
else
button:SetChecked(0)
end
if isCastable then
button.icon:SetVertexColor(1.0, 1.0, 1.0)
else
button.icon:SetVertexColor(0.4, 0.4, 0.4)
end
button:Show()
else
button:Hide()
end
end
-- The art depends on the form COUNT too (the middle strip's `> 2`), so it is re-derived
-- here as well as on every managed-position pass. Pure derivation, so running it twice
-- costs nothing and missing it costs a strip.
ShapeshiftBar_UpdatePosition()
end
-- ── The raised/unraised ART fork (ref ShapeshiftBar_UpdatePosition, l.229-251) ──────────
-- The reference's function does TWO things and we only owe it one. Its two SetPoints —
-- MainMenuBar TOPLEFT +(30,45) with the bottom-left multibar up, +(30,0) without — are
-- already `UIParent_ManageFramePositions`' job here: `ShapeshiftBarFrame` is a managed row
-- (baseY 0, bottomLeft 45, xOffset 30), which IS those two positions, and a second
-- SetPoint from this file would be a competing answer to a question already answered.
-- What the pass does NOT carry is the art half, and that is this:
--
-- raised — the three shelf strips hidden, each button's ring 50x50. The shelf art IS
-- the bar's border and only reads as one while the bar sits on the main bar;
-- a row up it would draw across whatever is underneath (the same rule the
-- pass applies to the pet bar's sliding strips).
-- unraised — the two END-CAPS shown, the MIDDLE strip shown only past two forms, each
-- button's ring 64x64.
--
-- The `> 2` on the middle strip is the ref's own and easy to miss: a two-form class (a
-- priest with Shadowform, a warrior before Berserker) gets the end caps and no middle.
--
-- **This became load-bearing with 1500.** While the bottom bars were always on (0270) the
-- raised branch was the only reachable state and this whole fork was dead code; now every
-- form class sees the UNRAISED bar on a fresh character, so the shelf-less version would be
-- the shipped default look rather than an edge case.
--
-- It keeps the reference's NAME because the corpus replaces that name wholesale:
-- CT_BottomBar.lua:712/741 saves and overwrites `ShapeshiftBar_UpdatePosition` to take the
-- bar over. The listener below therefore calls it through the GLOBAL, so an addon that
-- replaces it really does take the art with it.
function ShapeshiftBar_UpdatePosition()
local raised = MultiBarBottomLeft and MultiBarBottomLeft:IsShown()
local ring = 64
if raised then
ring = 50
ShapeshiftBarLeft:Hide()
ShapeshiftBarMiddle:Hide()
ShapeshiftBarRight:Hide()
else
ShapeshiftBarLeft:Show()
ShapeshiftBarRight:Show()
if GetNumShapeshiftForms() > 2 then
ShapeshiftBarMiddle:Show()
else
ShapeshiftBarMiddle:Hide()
end
end
-- The ref sizes only the buttons a form occupies; ours sizes all ten. Same pixels (a
-- hidden button draws nothing) and one less thing to get wrong — a button that appears
-- later is already the right size, without this needing to run again for it.
for i = 1, NUM_SHAPESHIFT_SLOTS do
local ringTexture = getglobal("ShapeshiftButton" .. i .. "NormalTexture")
ringTexture:SetWidth(ring)
ringTexture:SetHeight(ring)
end
end
function ShapeshiftBar_OnLoad()
local frame = this
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("UPDATE_SHAPESHIFT_FORMS")
ShapeshiftBar_Update()
end
function ShapeshiftBar_OnEvent()
local frame = this
ShapeshiftBar_Update()
end
-- Re-derive the art after every managed-position recompute (decision 1499's hook — the same
-- after-the-pass seam the bag stack registers on). The pass is what decides whether this bar
-- is raised, so the art fork has to run when the pass has finished and not before. Called
-- through the global name so an addon replacement is honoured (see the function's comment).
-- Guarded for the harnesses that load this file without UIParent.xml, the way BagFrame.xml
-- guards its own registration.
if UIParent_RegisterManagedPositionListener then
UIParent_RegisterManagedPositionListener(function() ShapeshiftBar_UpdatePosition() end)
end
]]></Script>
<!--
One stance button (ref ShapeshiftButtonTemplate: 30x30, inherits ActionButtonTemplate's
art set): icon fills (BACKGROUND); Cooldown child (the ref SetScale(.83)s the 36px
template's — ours is sized 30x30 directly); the raised-mode 50x50 UI-Quickslot2 ring
CENTER (0,-1); the action template's pushed/highlight/checked trio.
-->
<CheckButton name="BenillaShapeshiftButtonTemplate" virtual="true">
<Size><AbsDimension x="30" y="30"/></Size>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentIcon"/>
</Layer>
</Layers>
<Frames>
<Cooldown name="$parentCooldown" hidden="true">
<Size><AbsDimension x="30" y="30"/></Size>
<Anchors>
<Anchor point="CENTER" relativePoint="CENTER"><Offset><AbsDimension x="0" y="-1"/></Offset></Anchor>
</Anchors>
</Cooldown>
</Frames>
<NormalTexture name="$parentNormalTexture" file="Interface\Buttons\UI-Quickslot2">
<Size><AbsDimension x="50" y="50"/></Size>
<Anchors>
<Anchor point="CENTER" relativePoint="CENTER"><Offset><AbsDimension x="0" y="-1"/></Offset></Anchor>
</Anchors>
</NormalTexture>
<PushedTexture file="Interface\Buttons\UI-Quickslot-Depress"/>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
<CheckedTexture file="Interface\Buttons\CheckButtonHilight" alphaMode="ADD"/>
<Scripts>
<OnClick>BenillaShapeshiftButton_OnClick(self)</OnClick>
<OnEnter>BenillaShapeshiftButton_OnEnter(self)</OnEnter>
<OnLeave>BenillaShapeshiftButton_OnLeave(self)</OnLeave>
</Scripts>
</CheckButton>
<Frame name="ShapeshiftBarFrame" hidden="true">
<Size><AbsDimension x="29" y="32"/></Size>
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="MainMenuBar" relativePoint="TOPLEFT"><Offset><AbsDimension x="30" y="45"/></Offset></Anchor>
</Anchors>
<!-- The shelf art (ref BonusActionBarFrame.xml l.220-249), declared HIDDEN.
The header above says this art "is not modeled at all" because raised mode hides it and
we are permanently raised. That reasoning was right about the PIXELS and wrong about
the NAMES: 1219/1223 settled that the reference does not choose between shown and
absent, and "we don't show it" is not a reason for it not to exist. Four frames landed
on that principle; these are the first REGIONS to, which is why the sweep that closed
the class missed them — it ran over the frames/tables ranking, and a Texture is
neither.
Two corpus addons index them, and both do pure LAYOUT — they do not use the art, they
move it, exactly the shape 1223 found for BonusActionBarFrame:
zBarEx/zMainBar.lua:288-290 SetParent(MainMenuBar) on all three
CT_BottomBar.lua:681-692 ClearAllPoints + SetPoint off-screen
Absent, `ShapeshiftBarLeft:ClearAllPoints()` is `attempt to index global` and takes the
addon's whole handler with it.
Geometry, anchor chain and TexCoords quoted whole: Left and Right are two crops of ONE
`ShapeshiftBarEnds` file (0..0.453125 and 0.453125..0.875), Middle its own, and Right
hangs off Middle's RIGHT — the >2-form chain, which is the DECLARED state only. The
cap is re-pointed per form count by `ShapeshiftBar_Update` above (the ref's l.161-175):
hiding the middle strip leaves its 38px rect behind, so the declared chain alone
strands the cap past the last button.
`hidden="true"` is the RAISED state, and it is only the pre-pass value now:
`ShapeshiftBar_UpdatePosition` (above) shows and hides all three from the bottom-left
multibar's state on every managed-position pass. Declared hidden rather than shown so a
harness that never runs the pass draws nothing new. -->
<Layers>
<Layer level="OVERLAY">
<Texture name="ShapeshiftBarLeft" file="Interface\ShapeshiftBar\ShapeshiftBarEnds" hidden="true">
<Size><AbsDimension x="45" y="50"/></Size>
<Anchors><Anchor point="BOTTOMLEFT"/></Anchors>
<TexCoords left="0" right="0.453125" top="0" bottom="1"/>
</Texture>
<Texture name="ShapeshiftBarMiddle" file="Interface\ShapeshiftBar\ShapeshiftBarMiddle" hidden="true">
<Size><AbsDimension x="38" y="50"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftBarLeft" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0" right="1" top="0" bottom="1"/>
</Texture>
<Texture name="ShapeshiftBarRight" file="Interface\ShapeshiftBar\ShapeshiftBarEnds" hidden="true">
<Size><AbsDimension x="42" y="50"/></Size>
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftBarMiddle" relativePoint="RIGHT"/></Anchors>
<TexCoords left="0.453125" right="0.875" top="0" bottom="1"/>
</Texture>
</Layer>
</Layers>
<Frames>
<CheckButton name="ShapeshiftButton1" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="11" y="3"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 1)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton2" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton1" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 2)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton3" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton2" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 3)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton4" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton3" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 4)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton5" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton4" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 5)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton6" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton5" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 6)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton7" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton6" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 7)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton8" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton7" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 8)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton9" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton8" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 9)</OnLoad></Scripts>
</CheckButton>
<CheckButton name="ShapeshiftButton10" inherits="BenillaShapeshiftButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="ShapeshiftButton9" relativePoint="RIGHT"><Offset><AbsDimension x="7" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaShapeshiftButton_OnLoad(self, 10)</OnLoad></Scripts>
</CheckButton>
</Frames>
<Scripts>
<OnLoad>ShapeshiftBar_OnLoad()</OnLoad>
<OnEvent>ShapeshiftBar_OnEvent()</OnEvent>
<!-- The stance bar is the pet/stance term of the managed bottom-stack positions
(UIParent.xml, decision 0272): its show/hide re-fires the pass, exactly the
ref's BonusActionBarFrame.xml:350-355. -->
<OnShow>UIParent_ManageFramePositions()</OnShow>
<OnHide>UIParent_ManageFramePositions()</OnHide>
</Scripts>
</Frame>
</Ui>