Files
benilla-octo/crates/benilla-app/assets/ui/InspectFrame.xml
T
SamandClaude Fable 5 6aa78bc468 the shapeshift cloud both ways, and the Honor tab
- druids get the shift cloud back in both directions, by the reference's own mechanism: every shapeshift aura add *or* remove arms a one-slot pending-morph latch that the model-swap rebuild drains and replays — which is why shifting out (a client-side cancel the server sends no visual for) puffs at all, and why a GM morph or a revive correctly shows nothing; the first fix that merely let one-shot effects survive the swap's teardown produced the right pixels for the wrong reason and is superseded
- the honor system lands whole: the Honor tab on the character window, the honor page on inspect, and thirteen missing Lua bindings over a real wire model — session/yesterday/this-week/last-week kills, lifetime HKs and DKs, rank progress and badge art
- the load-bearing find: your current rank and your highest-ever rank are two separately-streamed fields, and the one we already had was the wrong one for anyone who ever de-ranked; a binary cross-check corrected five display details after the build, down to the rank title never being gendered

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

944 lines
64 KiB
XML

<Ui>
<!--
benilla's inspect window (decision 0631) — right-click a player → Inspect → their name,
portrait, level/race/class line, full-body model, and their 19 equipped items.
Dressed from the real 1.12.1 `Blizzard_InspectUI.xml`/`.lua` + `InspectPaperDollFrame.xml`/
`.lua`, extracted from the MPQ chain to session scratch this session (director-local
reference artifacts, never committed — the 0068/0138/0208 pattern; the `ref l.N` cites below
are into that extraction). Note the reference is NOT base FrameXML: it is the LoadOnDemand
addon `Blizzard_InspectUI` (`## LoadOnDemand: 1`). We implement no LoD mechanism for one
addon (decision 0631 §1) — this file simply loads with the rest, and `InspectUnit` below
stands in for the ref's `UIParentLoadAddOn`-then-show wrapper.
WHY THIS WINDOW NEEDS NO NEW READS: a player's worn gear rides `PLAYER_VISIBLE_ITEM_<n>_0`,
which is PUBLIC — the server streams it to every observer, and benilla already decodes it to
render other players' equipment. So the reference's own unit-keyed `GetInventoryItemTexture(
unit, slot)` family answers here exactly as it does for "player"; `Model::inv_slot` routes
the token to the inspect view (decision 0631 §2). Nothing waits on `SMSG_INSPECT` — it
echoes the guid and nothing else, and the ref paints immediately (`Blizzard_InspectUI.lua:
6-13` shows `NotifyInspect` and `ShowUIPanel` in the same breath).
Docks the left UIPanel slot like the character window (`UiPanels.xml`'s
`UIPanelWindows["BenillaInspectFrame"] = { area = "left", pushable = 0 }`, mirroring the
ref's own row `Blizzard_InspectUI.lua:4`) — so it competes for/replaces those windows rather
than stacking with them.
Naming: every frame here is Benilla-prefixed, this codebase's convention
(CharacterFrame.xml's header) — including the strings passed around internally. The two
addon-facing entry points keep their real global names (`InspectUnit`, and the engine's
`CanInspect`/`NotifyInspect`/`ClearInspectPlayer`), the same posture `ToggleCharacter`
takes.
THE HONOR TAB LANDED (ref tab 2, `Blizzard_InspectUI/InspectHonorFrame.{xml,lua}`, extracted
to session scratch alongside the rest of this window's reference). It was 0631's first named
deferral — it needed `MSG_INSPECT_HONOR_STATS` and an honor model that did not exist, and
the OWN character window had no Honor tab either — and the honor arc supplied all three at
once. The page is `BenillaInspectHonorFrame`, this window's own prefix convention; its five
row templates and both of its painters come from `HonorFrame.xml`, which is exactly the
sharing the reference does (its `HonorFrameTemplates.xml` is inherited straight into
`Blizzard_InspectUI`) and why that file must load first — see this window's `benilla.toc`
entry.
Named deferrals (decision 0631; each re-cited at its site):
- `InspectTitleText` / `InspectGuildText` — both `hidden="true"` in the ref itself, filled
only from PVP-rank / guild-query data (0208's own two named gaps). Not transcribed.
- Ctrl-click `DressUpItemLink` and shift-click chat-link insert (ref
`InspectPaperDollFrame.lua:104-112`) — 0208's named deferrals, both LANDED (decisions
1059/1060): ctrl previews the inspected item on your own body, shift posts its link.
Nothing else happens on a click, which is still the reference's own shape.
- `UnitHasRelicSlot` (ref l.123, l.22) — vanilla-always-false, so the relic branch can
never fire. Dropped outright, as CharacterFrame.xml drops it.
- The held-button continuous spin (ref `InspectModelFrame_OnUpdate`, l.7-22) needs
`GetButtonState() == "PUSHED"`, which this engine's Button has no method for
(CharacterFrame.xml hit the identical wall) — click-only, so no OnUpdate is wired.
-->
<Script><![CDATA[
-- ── GlobalStrings values this window uses (ref-GlobalStrings.lua, cited per line — the
-- `X = X or "..."` idiom is this codebase's convention, CharacterFrame.xml/CastingBar.xml:
-- a real GlobalStrings.lua, if one ever loads, wins over the fallback). Declared HERE and
-- not borrowed from CharacterFrame.xml's identical line: load order must not be a hidden
-- dependency between two windows (it bit exactly this file — the level line errored
-- "string expected, got nil" when the window was driven without CharacterFrame loaded).
PLAYER_LEVEL = PLAYER_LEVEL or "Level %d %s %s" -- :3075
-- The subframe roster (ref INSPECTFRAME_SUBFRAMES, l.2), now the reference's own two. Index
-- N is tab N's page, and each page's `id=` is the same mapping written the other way round
-- — the invariant CharacterFrame.xml states for its own row, and the reason `ToggleInspect`
-- below can select the tab from the page rather than being told which one it is.
BENILLA_INSPECTFRAME_SUBFRAMES = {
"BenillaInspectPaperDollFrame", "BenillaInspectHonorFrame",
}
-- The 19 inspect slots, in the ref's own `InspectPaperDollFrame_OnShow` order (l.60-78).
-- Note there is NO ammo slot and NO bag buttons: a foreign player exposes neither.
BENILLA_INSPECT_SLOTS = {
"Head", "Neck", "Shoulder", "Back", "Chest", "Shirt", "Tabard", "Wrist",
"Hands", "Waist", "Legs", "Feet", "Finger0", "Finger1", "Trinket0", "Trinket1",
"MainHand", "SecondaryHand", "Ranged",
}
-- ref InspectUnit: in the real client this is the FrameXML wrapper that load-on-demands the
-- addon and then shows the frame. We have no LoD (header), so it IS the show path — kept
-- under the real global name because that is what the UnitPopup row and any addon call.
function InspectUnit(unit)
BenillaInspectFrame_Show(unit)
end
-- ref InspectFrame_Show (l.6-13) verbatim in shape: hide first, gate on CanInspect, request,
-- remember the token, show. The CanInspect gate is the real client's `0x48a1b0` — a 10-yard
-- d² test (wow-re §5-VERIFIED), which the app folds together with is-a-player and
-- not-attackable (decision 0631 §"What the pin verified" 3/4).
function BenillaInspectFrame_Show(unit)
local frame = getglobal("BenillaInspectFrame")
HideUIPanel(frame)
if CanInspect(unit) then
NotifyInspect(unit)
frame.unit = unit
ShowUIPanel(frame)
end
end
-- ref InspectFrame_OnLoad (l.15-25). UNIT_PORTRAIT_UPDATE is NOT registered in the ref
-- either (its OnEvent has a branch for it, l.34-38, that can therefore never fire — a
-- reference bug, transcribed as the ref behaves, not as it reads).
function BenillaInspectFrame_OnLoad(frame)
frame:RegisterEvent("PLAYER_TARGET_CHANGED")
frame:RegisterEvent("PARTY_MEMBERS_CHANGED")
frame:RegisterEvent("UNIT_NAME_UPDATE")
frame:RegisterEvent("UNIT_MODEL_CHANGED")
frame.unit = nil
PanelTemplates_SetNumTabs(frame, 2)
PanelTemplates_SetTab(frame, 1)
end
-- ref InspectFrame_OnEvent (l.27-45). The retarget branch re-runs InspectUnit on the STORED
-- TOKEN, so an inspect window follows a re-target — the token resolves to whoever is
-- selected now. That is the ref's real behavior, not a quirk of ours.
function BenillaInspectFrame_OnEvent(frame)
if not frame:IsVisible() then
return
end
if event == "PLAYER_TARGET_CHANGED" or event == "PARTY_MEMBERS_CHANGED" then
InspectUnit(frame.unit)
elseif event == "UNIT_NAME_UPDATE" then
if arg1 == frame.unit then
getglobal("BenillaInspectNameText"):SetText(UnitName(arg1))
end
end
end
-- ref InspectFrame_OnShow (l.47-51), with ONE deliberate deviation: the unit is nil-guarded.
-- The ref calls SetPortraitTexture(portrait, this.unit) unguarded, and `this.unit` is nil on
-- any show that didn't come through InspectFrame_Show — `ToggleInspect` re-opening after
-- OnHide cleared it is the reachable one. In the real client that leaks a swallowed Lua
-- arg error every time (the same class decision 0413 caught in the merchant frame); ours
-- would throw out of OnShow and abandon the rest of it, so the window would open with a
-- stale name too. Guarding paints nothing instead, and the ref's own OnUpdate closes a
-- target-less window on the next frame regardless.
function BenillaInspectFrame_OnShow(frame)
PlaySound("igCharacterInfoOpen")
if frame.unit then
SetPortraitTexture(getglobal("BenillaInspectFramePortrait"), frame.unit)
getglobal("BenillaInspectNameText"):SetText(UnitName(frame.unit))
end
end
-- ref InspectFrame_OnHide (l.53-59): drop the token, play the close sound, and tell the
-- engine to stop inspecting (which stops the app's per-frame slot resolve). No subframe
-- hide-loop is needed (unlike CharacterFrame_OnHide's): BOTH pages are true engine children
-- of this frame — they are declared inside its own `<Frames>`, not as separate top-level
-- files the way the character window's four are — so they hide on the parent's cascade.
-- Dropping the token here is also what makes the honor page's nil check load-bearing: an
-- `MSG_INSPECT_HONOR_STATS` reply can outlive the window that asked for it.
function BenillaInspectFrame_OnHide(frame)
frame.unit = nil
PlaySound("igCharacterInfoClose")
ClearInspectPlayer()
end
-- ref ToggleInspect (l.67-83) + InspectFrame_ShowSubFrame (l.85-93). The ref's own "clicking
-- the tab of the page already showing CLOSES the window" is kept rather than smoothed away,
-- because that is what the real tab does. ToggleInspect is BARE (not Benilla-prefixed), the
-- addon-facing name, matching this codebase's ToggleCharacter/ToggleQuestLog precedent.
--
-- THE TAB ROW IS SELECTED HERE, from the page's own id, on every path — the line
-- CharacterFrame.xml's `ToggleCharacter` carries and the defect it records (director,
-- 2026-08-06: a page switch that did not move the row left the old tab enabled, and
-- clicking it took the "already visible" arm and shut the window). This window could not
-- show that defect while it had one tab; it can now, so the line lands with the second one
-- rather than after the report.
function ToggleInspect(tab)
local subFrame = getglobal(tab)
if not subFrame then
return
end
local frame = getglobal("BenillaInspectFrame")
PanelTemplates_SetTab(frame, subFrame:GetID())
if frame:IsVisible() then
if subFrame:IsVisible() then
HideUIPanel(frame)
else
PlaySound("igCharacterInfoTab")
BenillaInspectFrame_ShowSubFrame(tab)
end
else
ShowUIPanel(frame)
BenillaInspectFrame_ShowSubFrame(tab)
end
end
function BenillaInspectFrame_ShowSubFrame(frameName)
for _, name in ipairs(BENILLA_INSPECTFRAME_SUBFRAMES) do
local subFrame = getglobal(name)
if subFrame then
if name == frameName then subFrame:Show() else subFrame:Hide() end
end
end
end
-- ref InspectFrame_OnUpdate (l.61-65): the window closes the moment there is no target.
-- The ref's behaviour kept, bluntness included — the ref checks "target" specifically, even
-- when inspecting a party token, so inspecting a party member and then clearing your target
-- closes the window. That is the shipped 1.12 behavior.
function BenillaInspectFrame_OnUpdate(frame)
if not UnitExists("target") then
HideUIPanel(frame)
end
end
-- ── The paper-doll page (ref InspectPaperDollFrame.lua) ─────────────────────────────────
-- ref InspectPaperDollFrame_OnLoad (l.2-5).
function BenillaInspectPaperDollFrame_OnLoad(frame)
frame:RegisterEvent("UNIT_MODEL_CHANGED")
frame:RegisterEvent("UNIT_LEVEL")
end
-- ref InspectPaperDollFrame_OnEvent (l.41-50). The model branch is a no-op for us: the pane
-- samples the "inspect" booth slot, which the app re-bakes off the live unit's dressed look
-- on its own (decision 0631 §4) — there is no `SetUnit` to re-issue.
function BenillaInspectPaperDollFrame_OnEvent(frame)
local unit = getglobal("BenillaInspectFrame").unit
if arg1 and arg1 == unit and event == "UNIT_LEVEL" then
BenillaInspectPaperDollFrame_SetLevel()
end
end
-- ref InspectPaperDollFrame_SetLevel (l.52-55). The "?" placeholders match
-- CharacterFrame.xml's: UnitRace/UnitClass read nil for the one tick before the app's first
-- snapshot for this token lands (an unguarded format() errors on nil), which for a foreign
-- unit is a genuinely reachable window, not just a startup race.
function BenillaInspectPaperDollFrame_SetLevel()
local unit = getglobal("BenillaInspectFrame").unit
getglobal("BenillaInspectLevelText"):SetText(
format(PLAYER_LEVEL, UnitLevel(unit) or 0, UnitRace(unit) or "?", UnitClass(unit) or "?"))
end
-- ref InspectPaperDollFrame_OnShow (l.57-79): the level line then all 19 slots.
function BenillaInspectPaperDollFrame_OnShow()
BenillaInspectPaperDollFrame_SetLevel()
for _, slot in ipairs(BENILLA_INSPECT_SLOTS) do
BenillaInspectSlot_Update(getglobal("BenillaInspect" .. slot .. "Slot"))
end
end
-- ref InspectPaperDollItemSlotButton_OnLoad (l.81-93). `strsub(slotName, 8)` in the ref
-- strips its "Inspect" prefix to reach the GetInventorySlotInfo name; ours passes the bare
-- name in, CharacterFrame.xml's own convention (the prefix is longer here anyway).
function BenillaInspectSlot_OnLoad(button, slotName)
button:RegisterEvent("UNIT_INVENTORY_CHANGED")
local id, texture = GetInventorySlotInfo(slotName)
button.invSlotId = id
button.slotName = slotName
button.emptyTexture = texture
button.icon = getglobal(button:GetName() .. "IconTexture")
-- No RegisterForDrag and no right-click: an inspected item cannot be picked up, used, or
-- swapped. The ref registers no drag on these either — its OnClick (l.104-112) handles
-- ONLY ctrl (dressing room) and shift (chat link), both named deferrals here, so this
-- ships with the plain left-click registration and an inert handler.
button:RegisterForClicks("LeftButtonUp")
BenillaInspectSlot_Update(button)
end
-- ref InspectPaperDollItemSlotButton_OnEvent (l.95-102): only the inspected unit's own
-- inventory change repaints.
function BenillaInspectSlot_OnEvent(button)
if event == "UNIT_INVENTORY_CHANGED" and arg1 == getglobal("BenillaInspectFrame").unit then
BenillaInspectSlot_Update(button)
end
end
-- ref InspectPaperDollItemSlotButton_OnClick (l.104-112): CTRL previews the inspected
-- player's item on YOUR character in the dressing room (decision 1060), SHIFT posts its
-- link to chat (decision 1059) — "link me that" being most of why anyone inspects. Both
-- read through the unit-keyed `GetInventoryItemLink(unit, slot)`, the same binding the
-- paper doll uses: a foreign player's worn items are PUBLIC descriptor data, so their
-- links are as readable as our own (decision 0631's whole premise). Nothing else happens on
-- a click here — the reference has no third branch, and an inspected item is not ours to
-- pick up or use.
function BenillaInspectSlot_OnClick(button, mouseButton)
local unit = getglobal("BenillaInspectFrame").unit
if IsControlKeyDown() then
-- DressUpItemLink carries the reference's own nil guard (DressUpFrame.lua:11-13).
DressUpItemLink(GetInventoryItemLink(unit, button.invSlotId))
elseif IsShiftKeyDown() then
-- The visible-and-non-nil guards both live in the shared helper (UIParent.xml).
-- Waiting on a template is the COMMON case at this window — an inspected player's
-- gear is usually gear we have never seen — so the nil arm is a live path here,
-- not a theoretical one.
BenillaChatEdit_InsertLink(GetInventoryItemLink(unit, button.invSlotId))
end
end
-- ref InspectPaperDollItemSlotButton_Update (l.114-139). No count text and no broken tint:
-- a foreign player's gear comes from the PUBLIC visible-item entries, which carry no stack
-- count and no durability (decision 0631) — which is exactly why the reference's inspect
-- window shows neither. SetItemButtonCount's 0 branch is therefore always the one taken,
-- and is dropped with the count region.
function BenillaInspectSlot_Update(button)
local unit = getglobal("BenillaInspectFrame").unit
local textureName = GetInventoryItemTexture(unit, button.invSlotId)
if textureName then
button.icon:SetTexture(textureName)
else
button.icon:SetTexture(button.emptyTexture)
end
-- ref l.130-138: a tooltip already owned by this button re-renders in place.
if GameTooltip:IsOwned(button) then
BenillaInspectSlot_OnEnter(button)
end
end
-- ref InspectPaperDollItemSlotButtonTemplate's OnEnter (InspectPaperDollFrame.xml:18-28):
-- SetInventoryItem against the INSPECTED unit, falling back to the slot-name string.
function BenillaInspectSlot_OnEnter(button)
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
local unit = getglobal("BenillaInspectFrame").unit
if not GameTooltip:SetInventoryItem(unit, button.invSlotId) then
GameTooltip:SetText(getglobal(strupper(button.slotName)) or button.slotName)
end
GameTooltip:Show()
end
-- ── The model pane (ref InspectModelFrame, l.24-39) ─────────────────────────────────────
-- A booth-texture stand-in, not a live <PlayerModel> — the settled doctrine (0105's
-- "I don't like 3d btw go for better 2d", 0208 §5, decision 0631 §4). `frame.facing` stands
-- in for the ref's `model.rotation`; the ref's sign convention is preserved verbatim
-- (rotate-left SUBTRACTS, rotate-right ADDS — ref l.29-39), as is its 0.61 default (l.25).
function BenillaInspectModel_OnLoad(frame)
frame.facing = 0.61
BenillaInspectModel_SetFacing(frame.facing)
end
function BenillaInspectModel_RotateLeft(frame)
frame.facing = frame.facing - 0.03
BenillaInspectModel_SetFacing(frame.facing)
PlaySound("igInventoryRotateCharacter")
end
function BenillaInspectModel_RotateRight(frame)
frame.facing = frame.facing + 0.03
BenillaInspectModel_SetFacing(frame.facing)
PlaySound("igInventoryRotateCharacter")
end
-- The character window's twin (CharacterFrame.xml's BenillaPaperDollModel_OnUpdate — the
-- same ref Model_OnUpdate, UIParent.lua:1444-1462, that EVERY 1.12 model pane wires:
-- PaperDollFrame l.222-224, DressUpFrame.xml:202-204, TabardFrame.xml:406-408). Held button
-- = half a turn per second; the 0.03 click above is the tap. The ref's held-vs-click sign
-- flip is quoted, not corrected.
function BenillaInspectModel_OnUpdate(frame, elapsed)
local step = elapsed * 2 * PI * ROTATIONS_PER_SECOND
if getglobal(frame:GetName() .. "RotateLeftButton"):GetButtonState() == "PUSHED" then
frame.facing = frame.facing + step
if frame.facing < 0 then
frame.facing = frame.facing + (2 * PI)
end
BenillaInspectModel_SetFacing(frame.facing)
end
if getglobal(frame:GetName() .. "RotateRightButton"):GetButtonState() == "PUSHED" then
frame.facing = frame.facing - step
if frame.facing > (2 * PI) then
frame.facing = frame.facing - (2 * PI)
end
BenillaInspectModel_SetFacing(frame.facing)
end
end
-- ── The honor page (ref Blizzard_InspectUI/InspectHonorFrame.lua) ───────────────────────
--
-- WHY THIS PAGE WAITS WHERE THE PAPER DOLL DOES NOT. The gear page needs no round trip at
-- all — worn items ride PUBLIC descriptor fields the server already streams (this file's
-- header). A player's kill counters do not: they are private fields on their own object,
-- which we never see, so they come over a request and a reply of their own
-- (`MSG_INSPECT_HONOR_STATS`). Their RANK is the exception and rides the public bytes like
-- the gear does, which is why the rank block can paint from the unit while the counters
-- wait.
function BenillaInspectHonorFrame_OnLoad(frame)
frame:RegisterEvent("INSPECT_HONOR_UPDATE")
end
function BenillaInspectHonorFrame_OnEvent()
if event == "INSPECT_HONOR_UPDATE" then
BenillaInspectHonorFrame_Update()
end
end
-- ref InspectHonorFrame_OnShow: ask only when this player's numbers are not already held,
-- and repaint from them when they are. Both arms matter — the request arm is the first
-- visit, the repaint arm is every visit after it, and skipping the request when the answer
-- is already in hand is what keeps flipping between the two tabs from re-asking the server.
function BenillaInspectHonorFrame_OnShow()
if HasInspectHonorData() then
BenillaInspectHonorFrame_Update()
else
RequestInspectHonorData()
end
end
function BenillaInspectHonorFrame_Update()
-- THE TOKEN IS THIS WINDOW'S OWN, not the reference's hardcoded "target". The ref reads
-- `UnitPVPRank("target")`/`UnitFactionGroup("target")` while its own paper doll reads
-- `this.unit`, so inspecting a PARTY member paints that party member's gear under
-- whoever you happen to be targeting's rank and faction colour. This window already
-- tracks the token it was opened on (`BenillaInspectFrame_Show` stores it; every other
-- read in this file goes through it), so the honor page reads it too and the two halves
-- of one window agree about whose player they are showing.
local unit = getglobal("BenillaInspectFrame").unit
-- The token is nil'd when the window closes, and the reply is asynchronous: closing
-- before it lands is an ordinary thing to do. The reference cannot notice, because
-- "target" is still a unit; ours would paint a rank block for nobody, so it doesn't.
if not unit then
return
end
-- Twelve figures in one call, in the order the reply's own body carries them.
local sessionHK, sessionDK, yesterdayHK, yesterdayHonor, thisWeekHK, thisWeekHonor,
lastWeekHK, lastWeekHonor, lastWeekStanding, lifetimeHK, lifetimeDK, lifetimeRank =
GetInspectHonorData()
-- The same twelve rows the character window's page paints, through the same painter
-- (HonorFrame.xml) — one section per line, in the order they read down the page.
BenillaHonorPane_SetRows("BenillaInspectHonorFrame", {
CurrentHK = sessionHK, CurrentDK = sessionDK,
YesterdayHK = yesterdayHK, YesterdayContribution = yesterdayHonor,
ThisWeekHK = thisWeekHK, ThisWeekContribution = thisWeekHonor,
LastWeekHK = lastWeekHK, LastWeekContribution = lastWeekHonor,
LastWeekStanding = lastWeekStanding,
LifeTimeHK = lifetimeHK, LifeTimeDK = lifetimeDK,
LifeTimeRank = GetPVPRankInfo(lifetimeRank) or NONE,
})
-- The rank block, off the unit for the rank and the reply for the bar. The two do come
-- from different places and that is not an inconsistency: the rank is public unit state
-- we can read at any time, the bar position is a private byte that only the reply
-- carries.
BenillaHonorPane_SetRank("BenillaInspectHonorFrame", UnitPVPRank(unit),
GetInspectPVPRankProgress(), unit)
end
]]></Script>
<!--
The inspect slot button. The ref's own template inherits ItemButtonTemplate
(InspectPaperDollFrame.xml:4-46); ItemButtonTemplate's XML isn't part of this session's
extraction, so its shape is taken from this codebase's prior reconstruction of it
(CharacterFrame.xml's BenillaPaperDollItemSlotTemplate) minus what inspect can't have:
no $parentCount region (no stack counts on public gear), no PushedTexture (nothing to press
— the click is inert), no cooldown.
-->
<Button name="BenillaInspectItemSlotTemplate" virtual="true">
<Size><AbsDimension x="37" y="37"/></Size>
<Layers>
<Layer level="BACKGROUND">
<Texture name="$parentIconTexture"/>
</Layer>
</Layers>
<NormalTexture file="Interface\Buttons\UI-Quickslot2">
<Size><AbsDimension x="64" y="64"/></Size>
<Anchors>
<Anchor point="CENTER" relativePoint="CENTER"><Offset><AbsDimension x="0" y="-1"/></Offset></Anchor>
</Anchors>
</NormalTexture>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
<Scripts>
<OnClick>BenillaInspectSlot_OnClick(self, arg1)</OnClick>
<OnEnter>BenillaInspectSlot_OnEnter(self)</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
<OnEvent>BenillaInspectSlot_OnEvent(self)</OnEvent>
</Scripts>
</Button>
<Frame name="BenillaInspectFrame" hidden="true">
<!-- The real 384x512 window (ref l.4-14). No <Anchors> — ShowUIPanel SetPoints this to the
left slot on open (UiPanels.xml's convention, CharacterFrame.xml's precedent). -->
<Size><AbsDimension x="384" y="512"/></Size>
<HitRectInsets><AbsInset left="0" right="30" top="0" bottom="45"/></HitRectInsets>
<Layers>
<!-- Portrait 60x60 TOPLEFT (7,-6) (ref l.19-31) — the inspected unit's booth bake,
pointed at the token in OnShow (unlike the character window's fixed "player"). -->
<Layer level="ARTWORK">
<Texture name="BenillaInspectFramePortrait">
<Size><AbsDimension x="60" y="60"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="7" y="-6"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- Name: CENTER (6,232) wrapper, GameFontNormal centered inside it, white (ref l.35-64). -->
<Frame name="BenillaInspectNameFrame">
<Size><AbsDimension x="109" y="12"/></Size>
<Anchors><Anchor point="CENTER"><Offset><AbsDimension x="6" y="232"/></Offset></Anchor></Anchors>
<Layers>
<Layer>
<FontString name="BenillaInspectNameText" inherits="GameFontNormal" text="NAME">
<Size><AbsDimension x="300" y="12"/></Size>
<Anchors><Anchor point="CENTER"/></Anchors>
<Color r="1.0" g="1.0" b="1.0"/>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>self:SetFrameLevel(self:GetFrameLevel() + 1)</OnLoad>
</Scripts>
</Frame>
<!-- Close: the ref's own position (CENTER of TOPRIGHT, -44,-25 — ref l.65-78) on the
minimize-button art this codebase's close buttons all use. The +1 frame level is
CharacterFrame.xml's documented compensation: the page's BACKGROUND art is a
full-window sibling created after this button, so at level 0 it would paint over. -->
<Button name="BenillaInspectFrameCloseButton">
<Size><AbsDimension x="32" y="32"/></Size>
<Anchors><Anchor point="CENTER" relativePoint="TOPRIGHT"><Offset><AbsDimension x="-44" y="-25"/></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>
<OnLoad>self:SetFrameLevel(self:GetFrameLevel() + 1)</OnLoad>
<OnClick>HideUIPanel(getglobal("BenillaInspectFrame"))</OnClick>
</Scripts>
</Button>
<!-- The tab row (ref l.79-120 — CENTER of BOTTOMLEFT +60,+61, the second chained off
the first's RIGHT by -16, CharacterFrame.xml's own row spacing). BOTH of the ref's
tabs now. Its tabs carry a hover tooltip (CHARACTER_INFO / HONOR); ours follows
CharacterFrame.xml's own tab row, which carries none — the visible label already
says what it does. Tab 2's label is the GlobalStrings KEY, so it localizes with the
player's install; tab 1's enUS literal predates that convention and is left where
it is rather than swept up in an honor change. -->
<Button name="BenillaInspectFrameTab1" inherits="CharacterFrameTabButtonTemplate" text="Character">
<Anchors><Anchor point="CENTER" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="60" y="61"/></Offset></Anchor></Anchors>
<Scripts><OnClick>ToggleInspect("BenillaInspectPaperDollFrame")</OnClick></Scripts>
</Button>
<Button name="BenillaInspectFrameTab2" inherits="CharacterFrameTabButtonTemplate" text="HONOR">
<Anchors><Anchor point="LEFT" relativeTo="BenillaInspectFrameTab1" relativePoint="RIGHT"><Offset><AbsDimension x="-16" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnClick>ToggleInspect("BenillaInspectHonorFrame")</OnClick></Scripts>
</Button>
<!-- The paper-doll page (ref InspectPaperDollFrame, l.47-371). The ref uses
setAllPoints="true"; this is sized to fill the parent instead — equivalent, and the
shape CharacterFrame.xml's own paper doll takes (its header has the history).
id=1 is the ref's own, and it is what `ToggleInspect` selects the tab from: a
page's id IS its slot in this window's tab row (the roster's own note above). It
was absent while one page shipped, because a row of one cannot disagree. -->
<Frame name="BenillaInspectPaperDollFrame" id="1">
<Size><AbsDimension x="384" y="512"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPLEFT"/></Anchors>
<HitRectInsets><AbsInset left="0" right="30" top="0" bottom="45"/></HitRectInsets>
<Layers>
<Layer level="BACKGROUND">
<!-- The same four quadrant slabs the character tab uses (ref l.49-93). -->
<Texture file="Interface\PaperDollInfoFrame\UI-Character-CharacterTab-L1">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-CharacterTab-R1">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="256" y="0"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-CharacterTab-BottomLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="0" y="-256"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-CharacterTab-BottomRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="256" y="-256"/></Offset></Anchor></Anchors>
</Texture>
<!-- "Level %d %s %s" under the name (ref l.94-102). -->
<FontString name="BenillaInspectLevelText" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOP" relativeTo="BenillaInspectNameText" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<!-- The model pane (ref PlayerModel InspectModelFrame, l.124-187): 233x300 at
TOPLEFT (65,-78) — taller than the character window's 233x224 because the
inspect page carries no stats block under it. A plain Frame sampling the
"inspect" booth bake (header). -->
<Frame name="BenillaInspectModelFrame">
<Size><AbsDimension x="233" y="300"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="65" y="-78"/></Offset></Anchor></Anchors>
<Layers>
<!-- BACKGROUND, not ARTWORK — the booth quad is an OPAQUE stand-in for a
widget the reference renders outside the layer batches, so it must
sit as low as a region goes or it swallows same-level siblings
(decision 1070; the pet page's diet icon is where that bit). -->
<Layer level="BACKGROUND">
<Texture name="$parentTexture">
<Size><AbsDimension x="233" y="300"/></Size>
<Anchors><Anchor point="TOPLEFT"/></Anchors>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- Rotate buttons (ref l.148-185): 35x35, left then right chained off
its TOPRIGHT, both at the pane's own TOPLEFT. RegisterForClicks on
both edges + the pane's OnUpdate below = the ref's tap-and-hold. -->
<Button name="BenillaInspectModelFrameRotateLeftButton">
<Size><AbsDimension x="35" y="35"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPLEFT"/></Anchors>
<NormalTexture file="Interface\Buttons\UI-RotationLeft-Button-Up"/>
<PushedTexture file="Interface\Buttons\UI-RotationLeft-Button-Down"/>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Round" alphaMode="ADD"/>
<Scripts>
<OnLoad>self:RegisterForClicks("LeftButtonDown", "LeftButtonUp")</OnLoad>
<OnClick>BenillaInspectModel_RotateLeft(getglobal("BenillaInspectModelFrame"))</OnClick>
</Scripts>
</Button>
<Button name="BenillaInspectModelFrameRotateRightButton">
<Size><AbsDimension x="35" y="35"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectModelFrameRotateLeftButton" relativePoint="TOPRIGHT"/></Anchors>
<NormalTexture file="Interface\Buttons\UI-RotationRight-Button-Up"/>
<PushedTexture file="Interface\Buttons\UI-RotationRight-Button-Down"/>
<HighlightTexture file="Interface\Buttons\ButtonHilight-Round" alphaMode="ADD"/>
<Scripts>
<OnLoad>self:RegisterForClicks("LeftButtonDown", "LeftButtonUp")</OnLoad>
<OnClick>BenillaInspectModel_RotateRight(getglobal("BenillaInspectModelFrame"))</OnClick>
</Scripts>
</Button>
</Frames>
<Scripts>
<OnLoad>
BenillaInspectModel_OnLoad(self)
BenillaSetBoothTexture(getglobal(self:GetName() .. "Texture"), "inspect")
</OnLoad>
<OnUpdate>BenillaInspectModel_OnUpdate(self, arg1)</OnUpdate>
</Scripts>
</Frame>
<!-- The 19 slots (ref l.188-358). Left column from TOPLEFT (21,-74) chaining
-4 down; right column from (305,-74); the three weapon slots from
BOTTOMLEFT (122,127) chaining +5 right. The ref's own geometry, and the
same numbers the character window's doll uses. -->
<Button name="BenillaInspectHeadSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="21" y="-74"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "HeadSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectNeckSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectHeadSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "NeckSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectShoulderSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectNeckSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "ShoulderSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectBackSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectShoulderSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "BackSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectChestSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectBackSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "ChestSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectShirtSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectChestSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "ShirtSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectTabardSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectShirtSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "TabardSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectWristSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectTabardSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "WristSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectHandsSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="305" y="-74"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "HandsSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectWaistSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectHandsSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "WaistSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectLegsSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectWaistSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "LegsSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectFeetSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectLegsSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "FeetSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectFinger0Slot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectFeetSlot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "Finger0Slot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectFinger1Slot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectFinger0Slot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "Finger1Slot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectTrinket0Slot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectFinger1Slot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "Trinket0Slot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectTrinket1Slot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectTrinket0Slot" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "Trinket1Slot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectMainHandSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="122" y="127"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "MainHandSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectSecondaryHandSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectMainHandSlot" relativePoint="TOPRIGHT"><Offset><AbsDimension x="5" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "SecondaryHandSlot")</OnLoad></Scripts>
</Button>
<Button name="BenillaInspectRangedSlot" inherits="BenillaInspectItemSlotTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="BenillaInspectSecondaryHandSlot" relativePoint="TOPRIGHT"><Offset><AbsDimension x="5" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaInspectSlot_OnLoad(self, "RangedSlot")</OnLoad></Scripts>
</Button>
</Frames>
<Scripts>
<OnLoad>BenillaInspectPaperDollFrame_OnLoad(self)</OnLoad>
<OnEvent>BenillaInspectPaperDollFrame_OnEvent(self)</OnEvent>
<OnShow>BenillaInspectPaperDollFrame_OnShow()</OnShow>
</Scripts>
</Frame>
<!--
The honor page (ref InspectHonorFrame, its own file's l.4-364), id=2. Geometry for
geometry it is the character window's Honor tab with the level line taken out and
the frame names re-prefixed — the reference ships the two as near-copies of each
other, and every number below is quoted from the inspect one. What it is NOT a copy
of is the LOGIC: the row templates and both painters are HonorFrame.xml's, called
from this file's `BenillaInspectHonorFrame_Update` above.
A true engine child of this window (declared inside its `<Frames>`), unlike the
character window's pages, which are separate top-level files pinned by name. That is
why it needs no `parent=` substitute and why the parent's hide cascade closes it.
-->
<Frame name="BenillaInspectHonorFrame" enableMouse="true" hidden="true" id="2">
<Size><AbsDimension x="384" y="512"/></Size>
<Anchors><Anchor point="TOPLEFT" relativePoint="TOPLEFT"/></Anchors>
<HitRectInsets><AbsInset left="0" right="30" top="0" bottom="75"/></HitRectInsets>
<Layers>
<Layer level="BACKGROUND">
<!-- The shared "General" quadrants every PaperDollInfoFrame page wears,
carrying the portrait-ring cutout the window's own portrait shows
through (ref l.10-57). -->
<Texture file="Interface\PaperDollInfoFrame\UI-Character-General-TopLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="2" y="-1"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-General-TopRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="258" y="-1"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-General-BottomLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="2" y="-257"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-General-BottomRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="258" y="-257"/></Offset></Anchor></Anchors>
</Texture>
</Layer>
<Layer level="ARTWORK">
<!-- The honor plaque and the five section plates (ref l.60-107). -->
<Texture file="Interface\PaperDollInfoFrame\UI-Character-Honor-TopLeft">
<Size><AbsDimension x="256" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="22" y="-69"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-Honor-TopRight">
<Size><AbsDimension x="128" y="256"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="275" y="-69"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-Honor-BottomLeft">
<Size><AbsDimension x="256" y="128"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="22" y="-325"/></Offset></Anchor></Anchors>
</Texture>
<Texture file="Interface\PaperDollInfoFrame\UI-Character-Honor-BottomRight">
<Size><AbsDimension x="128" y="128"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="275" y="-325"/></Offset></Anchor></Anchors>
</Texture>
<!-- The rank title and its "(Rank N)". The title's y is the one the repaint
writes, not the reference's XML -81 that nothing ever sees —
HonorFrame.xml's header states the collapse and its reason. -->
<FontString name="BenillaInspectHonorFrameCurrentPVPTitle" inherits="GameFontNormal">
<Anchors><Anchor point="TOP"><Offset><AbsDimension x="0" y="-83"/></Offset></Anchor></Anchors>
</FontString>
<FontString name="BenillaInspectHonorFrameCurrentPVPRank" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="LEFT" relativeTo="BenillaInspectHonorFrameCurrentPVPTitle" relativePoint="RIGHT"><Offset><AbsDimension x="5" y="-1"/></Offset></Anchor>
</Anchors>
</FontString>
<!-- The five section headings (ref l.126-170), each chained off the last;
the uneven gaps are each section's own row count. -->
<FontString name="BenillaInspectHonorFrameCurrentSessionTitle" inherits="GameFontNormal" text="HONOR_THIS_SESSION">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="36" y="-112"/></Offset></Anchor></Anchors>
</FontString>
<FontString name="BenillaInspectHonorFrameYesterdayTitle" inherits="GameFontNormal" text="HONOR_YESTERDAY">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameCurrentSessionTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-41"/></Offset></Anchor>
</Anchors>
</FontString>
<FontString name="BenillaInspectHonorFrameThisWeekTitle" inherits="GameFontNormal" text="HONOR_THISWEEK">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameYesterdayTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-43"/></Offset></Anchor>
</Anchors>
</FontString>
<FontString name="BenillaInspectHonorFrameLastWeekTitle" inherits="GameFontNormal" text="HONOR_LASTWEEK">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameThisWeekTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-42"/></Offset></Anchor>
</Anchors>
</FontString>
<FontString name="BenillaInspectHonorFrameLifeTimeTitle" inherits="GameFontNormal" text="HONOR_LIFETIME">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLastWeekTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-64"/></Offset></Anchor>
</Anchors>
</FontString>
</Layer>
<Layer level="OVERLAY">
<!-- The rank badge (ref l.172-185). Pathless: the file is chosen per rank at
repaint time and there is none below rank 1. -->
<Texture name="BenillaInspectHonorFramePvPIcon">
<Size><AbsDimension x="24" y="24"/></Size>
<Anchors>
<Anchor point="RIGHT" relativeTo="BenillaInspectHonorFrameCurrentPVPTitle" relativePoint="LEFT"><Offset><AbsDimension x="-5" y="0"/></Offset></Anchor>
</Anchors>
</Texture>
</Layer>
</Layers>
<Frames>
<!-- The twelve rows (ref l.188-295), on HonorFrame.xml's five templates. Same
sections and the same row sets as the character window's page, because they
are the same figures about a different player. Today. -->
<Frame name="BenillaInspectHonorFrameCurrentHK" inherits="HonorFrameHKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameCurrentSessionTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="10" y="-3"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameCurrentDK" inherits="HonorFrameDKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameCurrentHK" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-2"/></Offset></Anchor>
</Anchors>
</Frame>
<!-- Yesterday. -->
<Frame name="BenillaInspectHonorFrameYesterdayHK" inherits="HonorFrameHKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameYesterdayTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="10" y="-3"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameYesterdayContribution" inherits="HonorFrameContributionButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameYesterdayHK" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-3"/></Offset></Anchor>
</Anchors>
</Frame>
<!-- This Week. -->
<Frame name="BenillaInspectHonorFrameThisWeekHK" inherits="HonorFrameHKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameThisWeekTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="10" y="-3"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameThisWeekContribution" inherits="HonorFrameContributionButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameThisWeekHK" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-3"/></Offset></Anchor>
</Anchors>
</Frame>
<!-- Last Week, the only three-row section. -->
<Frame name="BenillaInspectHonorFrameLastWeekHK" inherits="HonorFrameHKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLastWeekTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="10" y="-3"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameLastWeekContribution" inherits="HonorFrameContributionButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLastWeekHK" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-2"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameLastWeekStanding" inherits="HonorFrameStandingButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLastWeekContribution" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-2"/></Offset></Anchor>
</Anchors>
</Frame>
<!-- Lifetime. -->
<Frame name="BenillaInspectHonorFrameLifeTimeHK" inherits="HonorFrameHKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLifeTimeTitle" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="10" y="-4"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameLifeTimeDK" inherits="HonorFrameDKButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLifeTimeHK" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor>
</Anchors>
</Frame>
<Frame name="BenillaInspectHonorFrameLifeTimeRank" inherits="HonorFrameRankButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="BenillaInspectHonorFrameLifeTimeDK" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-4"/></Offset></Anchor>
</Anchors>
</Frame>
<!-- The rank hover: an invisible strip spanning badge to ordinal (ref
l.296-315), so the whole phrase explains itself. -->
<Frame name="BenillaInspectHonorFrameRankButton" enableMouse="true">
<Size><AbsDimension x="10" y="24"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="BenillaInspectHonorFramePvPIcon"/>
<Anchor point="RIGHT" relativeTo="BenillaInspectHonorFrameCurrentPVPRank"/>
</Anchors>
<Scripts>
<OnEnter>BenillaTooltip_AddNewbieTipFor(self, RANK, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b, NEWBIE_TOOLTIP_RANK)</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
</Frame>
<!-- The progress bar (ref l.316-351). The two frame-level drops are the
reference's own and the mechanism is the same one HonorFrame.xml's twin
documents: they put the BORDER-layer fill in the pane's own bucket so the
pane's ARTWORK plaque draws over it rather than under. -->
<StatusBar name="BenillaInspectHonorFrameProgressBar" enableMouse="true" drawLayer="BORDER" minValue="0" maxValue="1" defaultValue="0">
<Size><AbsDimension x="315" y="29"/></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="22" y="-77"/></Offset></Anchor></Anchors>
<Frames>
<Frame name="BenillaInspectHonorFrameProgressButton" enableMouse="true" setAllPoints="true">
<Scripts>
<OnLoad>self:SetFrameLevel(self:GetFrameLevel() - 1)</OnLoad>
<OnEnter>BenillaTooltip_AddNewbieTipFor(self, RANK_POSITION, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b, NEWBIE_TOOLTIP_RANK_POSITION)</OnEnter>
<OnLeave>GameTooltip:Hide()</OnLeave>
</Scripts>
</Frame>
</Frames>
<Scripts>
<OnLoad>self:SetFrameLevel(self:GetFrameLevel() - 1)</OnLoad>
</Scripts>
<BarTexture name="$parentBar" file="Interface\PaperDollInfoFrame\UI-Character-Skills-Bar"/>
</StatusBar>
</Frames>
<Scripts>
<OnLoad>BenillaInspectHonorFrame_OnLoad(self)</OnLoad>
<OnEvent>BenillaInspectHonorFrame_OnEvent()</OnEvent>
<OnShow>BenillaInspectHonorFrame_OnShow()</OnShow>
</Scripts>
</Frame>
</Frames>
<Scripts>
<OnLoad>BenillaInspectFrame_OnLoad(self)</OnLoad>
<OnEvent>BenillaInspectFrame_OnEvent(self)</OnEvent>
<OnShow>BenillaInspectFrame_OnShow(self)</OnShow>
<OnHide>BenillaInspectFrame_OnHide(self)</OnHide>
<OnUpdate>BenillaInspectFrame_OnUpdate(self)</OnUpdate>
</Scripts>
</Frame>
</Ui>