NTFS load order, a title-sorted AddOns list, and tooltips at the cursor

- addons load in the order NTFS lists a folder, case-insensitive with an underscore before the letters, the order the vanilla corpus was written against and the one that decides which addon provides a shared library (2178)
- GetNumAddOns and the index form of every AddOn verb walk a title-sorted list that hides the Blizzard addons the server says to hide, and the character-select AddOns list is in title order (2175)
- SetPoint and SetAllPoints raise the reference's own errors for a frame name that does not exist or an omitted relative frame instead of quietly anchoring to the parent, and an explicit nil means the screen root (2176)
- a tooltip owned with ANCHOR_CURSOR follows the mouse, which pfUI's tooltip, xpbar and chat modules, pfQuest's browser and TipBuddy ask for; an omitted or unknown anchor is ANCHOR_LEFT (2176)
- a $parent name handed to CreateFrame, CreateTexture or CreateFontString expands as it does in XML, so FonzAppraiser's thirty dropdowns and pfQuest's search icon get the names they asked for (2176)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-09-11 21:03:49 +07:00
co-authored by Claude Fable 5.1
parent 5af3a15d0e
commit eebbcc050f
53 changed files with 1978 additions and 541 deletions
@@ -255,7 +255,7 @@ fn set_font_object_takes_the_object_or_the_name() {
s.run(
r#"
f = CreateFrame("Frame", "TwoWays")
f:SetWidth(200); f:SetHeight(40); f:SetPoint("CENTER")
f:SetWidth(200); f:SetHeight(40); f:SetPoint("CENTER", 0, 0)
byObject = f:CreateFontString(nil, "ARTWORK")
byObject:SetText("obj")
byObject:SetFontObject(GameFontHighlightSmall)
@@ -320,7 +320,7 @@ fn dewdrop_recolors_a_row_from_its_own_font_object() {
s.run(
r#"
f = CreateFrame("Frame", "DdRow")
f:SetWidth(120); f:SetHeight(16); f:SetPoint("CENTER")
f:SetWidth(120); f:SetHeight(16); f:SetPoint("CENTER", 0, 0)
button = { text = f:CreateFontString(nil, "ARTWORK") }
button.text:SetText("row")
button.text:SetFontObject(GameFontHighlightSmall)
@@ -362,7 +362,7 @@ fn mutating_a_font_object_repaints_everything_that_inherits_it() {
s.run(
r#"
f = CreateFrame("Frame", "ThemeHost")
f:SetWidth(200); f:SetHeight(60); f:SetPoint("CENTER")
f:SetWidth(200); f:SetHeight(60); f:SetPoint("CENTER", 0, 0)
a = f:CreateFontString(nil, "ARTWORK"); a:SetText("inherited")
a:SetFontObject(ThemeFont)
b = f:CreateFontString(nil, "ARTWORK"); b:SetText("overridden")
@@ -445,7 +445,7 @@ fn propagation_is_scoped_to_the_object_that_changed() {
s.run(
r#"
f = CreateFrame("Frame", "ScopeHost")
f:SetWidth(200); f:SetHeight(60); f:SetPoint("CENTER")
f:SetWidth(200); f:SetHeight(60); f:SetPoint("CENTER", 0, 0)
one = f:CreateFontString(nil, "ARTWORK"); one:SetText("one"); one:SetFontObject(FontOne)
two = f:CreateFontString(nil, "ARTWORK"); two:SetText("two"); two:SetFontObject(FontTwo)
FontOne:SetFont("Fonts\\CHANGED.TTF", 30)
@@ -477,7 +477,7 @@ fn create_font_mints_publishes_and_paints() {
Nameplate.Font:SetTextColor(0, 0.5, 1)
f = CreateFrame("Frame", "PlateHost")
f:SetWidth(120); f:SetHeight(20); f:SetPoint("CENTER")
f:SetWidth(120); f:SetHeight(20); f:SetPoint("CENTER", 0, 0)
Name = f:CreateFontString(nil, "ARTWORK")
Name:SetText("plate")
Name:SetFontObject(Nameplate.Font)
@@ -626,7 +626,7 @@ fn button_state_fonts_take_the_object_and_follow_its_mutation() {
s.run(
r#"
b = CreateFrame("Button", "StateFontButton")
b:SetWidth(80); b:SetHeight(22); b:SetPoint("CENTER")
b:SetWidth(80); b:SetHeight(22); b:SetPoint("CENTER", 0, 0)
b:SetText("go")
b:SetTextFontObject(GameFontNormal)
"#,
@@ -671,7 +671,7 @@ fn an_empty_font_object_copies_nothing_onto_a_fontstring() {
s.run(
r#"
f = CreateFrame("Frame", "EmptyFontHost")
f:SetWidth(120); f:SetHeight(20); f:SetPoint("CENTER")
f:SetWidth(120); f:SetHeight(20); f:SetPoint("CENTER", 0, 0)
fs = f:CreateFontString(nil, "ARTWORK")
fs:SetText("keep")
fs:SetFontObject(DressedFont)
@@ -859,7 +859,7 @@ fn a_cross_axis_token_erases_the_axis_but_still_draws_centred() {
let mut s = script();
s.run(
"f = CreateFrame('Frame', 'ClearAxisFrame')\n\
f:SetWidth(200) f:SetHeight(40) f:SetPoint('CENTER')\n\
f:SetWidth(200) f:SetHeight(40) f:SetPoint('CENTER', 0, 0)\n\
fs = f:CreateFontString()\n\
fs:SetAllPoints(f)\n\
fs:SetText('erased')",
@@ -924,9 +924,9 @@ fn the_font_block_reaches_both_message_frame_tables() {
"fo = CreateFont('MsgBlockFont')\n\
fo:SetFont('Fonts\\\\FRIZQT__.TTF', 14)\n\
mf = CreateFrame('MessageFrame', 'MsgBlockPlain')\n\
mf:SetWidth(300) mf:SetHeight(80) mf:SetPoint('CENTER')\n\
mf:SetWidth(300) mf:SetHeight(80) mf:SetPoint('CENTER', 0, 0)\n\
smf = CreateFrame('ScrollingMessageFrame', 'MsgBlockScroll')\n\
smf:SetWidth(300) smf:SetHeight(80) smf:SetPoint('TOPLEFT')",
smf:SetWidth(300) smf:SetHeight(80) smf:SetPoint('TOPLEFT', 0, 0)",
)
.unwrap();