diff --git a/crates/benilla-app/assets/ui/OptionsFrame.xml b/crates/benilla-app/assets/ui/OptionsFrame.xml
index b3a98397..b5466d06 100644
--- a/crates/benilla-app/assets/ui/OptionsFrame.xml
+++ b/crates/benilla-app/assets/ui/OptionsFrame.xml
@@ -629,8 +629,13 @@
-- left to right: A gives Status Text (CheckButton2), B gives Show Cloak → Show Helm
-- (31 → 20, sitting under the name toggles that live on our Nameplates page), C gives
-- the 42 → 39 → 66 chain. Help (29) closes the page, as before.
+ -- The target-of-target pair (decision 1576) breaks that left-to-right reading, and
+ -- it has to: 1.12 keeps it in a box this window has no page for — Advanced Options'
+ -- "Raid & Party" — so there is no column order to preserve, only a neighbour to pick.
+ -- It sits under Status Text because that is the other unit-frame readout on the page.
Interface = {
- "RowStatusText", "RowShowCloak", "RowShowHelm",
+ "RowStatusText", "RowTargetOfTarget", "RowTargetOfTargetMode",
+ "RowShowCloak", "RowShowHelm",
"RowInstantQuestText", "RowBuffDurations", "RowAutoQuestWatch",
"RowNewbieTips",
},
@@ -876,7 +881,11 @@
-- indexed 0/1/2, so a config or addon carrying that value means Never — and the
-- nearest-stop fallback below, which assumes the values are ordinal, would show
-- "Always" for it. A categorical dropdown says which strays are its own.
- if e.value == v or e.alt == v then match = e end
+ -- `e.alt ~= nil` guards the nil-eats-everything case: a row whose store is not
+ -- there yet reads nil, and every entry without an `alt` would otherwise ANSWER to
+ -- it (nil == nil), leaving the capsule showing the last entry and the row wearing
+ -- its description. An entry answers to a second value only if it has one.
+ if e.value == v or (e.alt ~= nil and e.alt == v) then match = e end
end
if not match and tonumber(v) then
local best
@@ -1098,6 +1107,14 @@
end
return
end
+ if key == "Interface" then
+ -- 1.12's own rule for this pair (UIOptionsFrame_UpdateDependencies l.694-700):
+ -- the mode picker is dead while the switch is unticked. It is the only
+ -- cross-row dependency on this page.
+ OptionsRow_SetEnabled(OptionsFrameContainerBodyInterfaceRowTargetOfTargetMode,
+ SHOW_TARGET_OF_TARGET ~= "0")
+ return
+ end
if key == "ActionBars" then
-- 1.12's own rule for this pair, verbatim in effect (UIOptionsFrame.lua l.722-726):
-- Show Right ActionBar 2 is dead while Show Right ActionBar is unticked, because
@@ -2624,6 +2641,56 @@
self.cvarEvent = "STATUS_BAR_TEXT"
+
+
+
+
+
+
+
+ OptionsGlobalRow_OnLoad(self, "SHOW_TARGET_OF_TARGET",
+ "Show Target of Target", "OPTION_TOOLTIP_SHOW_TARGET_OF_TARGET")
+ self.applyFunc = TargetofTarget_Update
+
+
+
+
+
+
+
+
+
+ OptionsGlobalRow_OnLoad(self, "SHOW_TARGET_OF_TARGET_STATE",
+ "Show When", "OPTION_TOOLTIP_TARGETOFTARGET5", 1)
+ OptionsDropdownRow_Setup(self, {
+ { text = "Raid", value = "1", tip = "OPTION_TOOLTIP_TARGETOFTARGET1" },
+ { text = "Party", value = "2", tip = "OPTION_TOOLTIP_TARGETOFTARGET2" },
+ { text = "Solo", value = "3", tip = "OPTION_TOOLTIP_TARGETOFTARGET3" },
+ { text = "Party or Raid", value = "4", tip = "OPTION_TOOLTIP_TARGETOFTARGET4" },
+ { text = "Always", value = "5", tip = "OPTION_TOOLTIP_TARGETOFTARGET5" },
+ })
+ self.applyFunc = TargetofTarget_Update
+
+
-
-
+
+
OptionsFuncRow_OnLoad(self, ShowingCloak, ShowCloak, "1",
diff --git a/crates/benilla-app/assets/ui/TalentWipeConfirm.xml b/crates/benilla-app/assets/ui/TalentWipeConfirm.xml
new file mode 100644
index 00000000..c906f822
--- /dev/null
+++ b/crates/benilla-app/assets/ui/TalentWipeConfirm.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+ self:RegisterEvent("CONFIRM_TALENT_WIPE")
+
+ BenillaTalentWipeConfirmDriver_OnEvent()
+
+
+
diff --git a/crates/benilla-app/assets/ui/UiPanels.xml b/crates/benilla-app/assets/ui/UiPanels.xml
index 536e2be1..f921154f 100644
--- a/crates/benilla-app/assets/ui/UiPanels.xml
+++ b/crates/benilla-app/assets/ui/UiPanels.xml
@@ -906,8 +906,13 @@
-- SET_GUILDOFFICERNOTE, registered in FriendsFrame.xml): the 350x64 centred box
-- replaces the narrow one, and the dialog widens to 420. See the widen arm below for
-- the reference's own oddity — the widen is keyed on `which`, not on hasWideEditBox.
+ -- · hasMoneyFrame is live (decision 1580's CONFIRM_TALENT_WIPE is the first customer,
+ -- and the reference's other five are all price confirms): a SmallMoneyFrameTemplate
+ -- child under the text, shown per entry, with the buttons dropping to -24 to clear it
+ -- and the frame growing 16px. The AMOUNT is not the engine's — the entry's own
+ -- OnShow/the event arm calls MoneyFrame_Update, exactly as the reference does.
-- · Accepted but v1-inert: exclusive, interruptCinematic (cinematics are acked
- -- instantly — 0196), notClosableByLogout, preferredIndex, and the money variant.
+ -- instantly — 0196), notClosableByLogout, preferredIndex.
-- · text_arg1/2 stash on the DIALOG frame (the ref stashes them on the Text region;
-- our regions don't carry Lua fields).
-- · GetText("SECONDS"/"MINUTES") localization collapses to English singular/plural.
@@ -956,18 +961,25 @@
end
end
- -- Ref l.1428-1438, the no-money leg only (v1 has no money variant).
+ -- Ref l.1428-1438, all three legs.
--
-- Note the ref measures the NARROW `EditBox` for the height even when the shown box is the
-- wide one — the wide box is 64 tall, anchored CENTER, and floats over a frame sized for a
-- 32-tall box. Transcribed as written: the guild MOTD dialog's look is that arithmetic.
+ --
+ -- The money leg does NOT measure the coin row either: it is the plain height plus a flat
+ -- 16, which is the room the -24 button drop below leaves for it. Same arithmetic, same
+ -- reason — the ref sizes these from constants, not from what is in the frame.
function StaticPopup_Resize(dialog, which)
local text = getglobal(dialog:GetName() .. "Text")
local button1 = getglobal(dialog:GetName() .. "Button1")
local editBox = getglobal(dialog:GetName() .. "EditBox")
- if StaticPopupDialogs[which] and StaticPopupDialogs[which].hasEditBox then
+ local info = StaticPopupDialogs[which]
+ if info and info.hasEditBox then
dialog:SetHeight(16 + text:GetHeight() + 8 + editBox:GetHeight() + 8
+ button1:GetHeight() + 16)
+ elseif info and info.hasMoneyFrame then
+ dialog:SetHeight(16 + text:GetHeight() + 8 + button1:GetHeight() + 32)
else
dialog:SetHeight(16 + text:GetHeight() + 8 + button1:GetHeight() + 16)
end
@@ -1100,18 +1112,30 @@
wideEditBox:Hide()
end
+ -- The money frame (ref l.1627-1632): shown for a hasMoneyFrame entry, hidden
+ -- otherwise. The engine never fills it — the AMOUNT belongs to whoever raised the
+ -- dialog, who calls MoneyFrame_Update on it (the ref's own division: its
+ -- CONFIRM_TALENT_WIPE arm in UIParent.lua does exactly that with the event's arg1).
+ getglobal(dialog:GetName() .. "MoneyFrame"):Hide()
+ if info.hasMoneyFrame then
+ getglobal(dialog:GetName() .. "MoneyFrame"):Show()
+ end
+
-- The buttons (ref l.1634-1676; fixed 120 widths — header note). Button2 shows only
-- when the entry names it AND DisplayButton2 (when present) allows it; a solo button1
-- re-seats centered under the text. With an edit box the pair hangs off the BOX's
- -- bottom instead of the text's (ref l.1641-1643), which is what leaves room for it.
+ -- bottom instead of the text's (ref l.1641-1643), which is what leaves room for it;
+ -- with a money frame the pair stays on the TEXT and drops 24 instead of 8, which is
+ -- what leaves room for the coins (ref l.1644-1646).
local buttonAnchor = info.hasEditBox and (dialog:GetName() .. "EditBox")
or (dialog:GetName() .. "Text")
+ local buttonDrop = info.hasMoneyFrame and -24 or -8
local button1 = getglobal(dialog:GetName() .. "Button1")
local button2 = getglobal(dialog:GetName() .. "Button2")
if info.button2 and (not info.DisplayButton2 or info.DisplayButton2()) then
button1:ClearAllPoints()
button2:ClearAllPoints()
- button1:SetPoint("TOPRIGHT", buttonAnchor, "BOTTOM", -6, -8)
+ button1:SetPoint("TOPRIGHT", buttonAnchor, "BOTTOM", -6, buttonDrop)
button2:SetPoint("LEFT", dialog:GetName() .. "Button1", "RIGHT", 13, 0)
button2:SetText(info.button2)
button2:Show()
@@ -1932,6 +1956,20 @@
+
+
+
+
+
+
+ SmallMoneyFrame_OnLoad(); MoneyFrame_SetType("STATIC")
+
+
+
@@ -1694,6 +1733,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TargetofTargetHealthCheck()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+