From 63a76b63e02ac00a8615ec2a38dfa6bf3fab8c4c Mon Sep 17 00:00:00 2001 From: Adrestie Date: Wed, 23 Sep 2026 01:42:05 +0200 Subject: [PATCH] Feuille : seule la case de guerre porte les epees Les trois cases partagent le meme fond, checkbox-minimal, mais pas la meme coche. AtWarCheckbox porte Interface/Buttons/UI-CheckBox-SwordCheck -- deux epees croisees, en 32 posees a (3, -5) -- tandis que MakeInactiveCheckbox et WatchFactionCheckbox prennent checkmark-minimal, centre. Les epees avaient ete donnees aux trois. Co-Authored-By: Claude Opus 5 (1M context) --- data/addon/ForeverUI/ReputationTab.lua | 35 +++++++++++++++++++------- docs/AMELIORATIONS.md | 1 + tools/test_addon.py | 11 ++++++++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/data/addon/ForeverUI/ReputationTab.lua b/data/addon/ForeverUI/ReputationTab.lua index 83b302c..d77585e 100644 --- a/data/addon/ForeverUI/ReputationTab.lua +++ b/data/addon/ForeverUI/ReputationTab.lua @@ -780,6 +780,7 @@ local CASE_INTITULE_L = 158 local CASE_INTITULE_X = 2 local ATLAS_CASE = "checkbox-minimal" +local ATLAS_COCHE = "checkmark-minimal" local ATLAS_SEPARATEUR = "ui-character-info-scrollline" local COCHE = "Interface\\Buttons\\UI-CheckBox-SwordCheck" local COCHE_COTE = 32 @@ -790,13 +791,23 @@ local detail -- LES TROIS CASES DU CLIENT, reposees et rhabillees. Leur logique reste la -- leur : ce sont elles qui declarent la guerre, rangent une faction parmi -- les inactives, ou la suivent sur la barre du bas. +-- LES EPEES N'APPARTIENNENT QU'A LA GUERRE. +-- +-- RELEVE -- camelot/ReputationFrame.xml, les trois CheckButton. Toutes ont +-- le meme fond, checkbox-minimal, mais pas la meme coche : +-- AtWarCheckbox Interface/Buttons/UI-CheckBox-SwordCheck, 32 x 32 +-- posee a TOPLEFT (3, -5) -- deux epees croisees +-- MakeInactiveCheckbox checkmark-minimal +-- WatchFactionCheckbox checkmark-minimal +-- Les deux dernieres ont aussi checkmark-minimal-disabled quand la case est +-- grisee ; 3.3.5 n'en grise aucune ici, on n'en a pas besoin. local CASES = { - { nom = "ReputationDetailAtWarCheckBox", rouge = true }, + { nom = "ReputationDetailAtWarCheckBox", rouge = true, epees = true }, { nom = "ReputationDetailInactiveCheckBox" }, { nom = "ReputationDetailMainScreenCheckBox" }, } -local function habillerCase(case, rouge) +local function habillerCase(case, rouge, epees) if not case or case.foreverHabillee then return end @@ -816,13 +827,19 @@ local function habillerCase(case, rouge) ForeverUI.SetAtlas(fond, ATLAS_CASE) fond:SetPoint("CENTER", case, "CENTER", 0, 0) - -- LA COCHE EST UN FICHIER, pas un atlas : camelot lui donne - -- UI-CheckBox-SwordCheck, que 3.3.5 possede deja. + -- LA COCHE. Celle de la guerre est un FICHIER -- deux epees croisees, + -- UI-CheckBox-SwordCheck, que 3.3.5 possede deja -- posee en 32 a + -- (3, -5). Les deux autres sont un atlas, checkmark-minimal, centre. local coche = case:CreateTexture(nil, "OVERLAY") - coche:SetTexture(COCHE) - coche:SetWidth(COCHE_COTE) - coche:SetHeight(COCHE_COTE) - coche:SetPoint("TOPLEFT", case, "TOPLEFT", COCHE_X, COCHE_Y) + if epees then + coche:SetTexture(COCHE) + coche:SetWidth(COCHE_COTE) + coche:SetHeight(COCHE_COTE) + coche:SetPoint("TOPLEFT", case, "TOPLEFT", COCHE_X, COCHE_Y) + else + ForeverUI.SetAtlas(coche, ATLAS_COCHE) + coche:SetPoint("CENTER", case, "CENTER", 0, 0) + end case.foreverCoche = coche local intitule = _G[case:GetName() .. "Text"] @@ -1021,7 +1038,7 @@ local function monterDetail(hote) for _, decrit in ipairs(CASES) do local case = _G[decrit.nom] if case then - habillerCase(case, decrit.rouge) + habillerCase(case, decrit.rouge, decrit.epees) case:SetParent(cadre) case:ClearAllPoints() if precedente then diff --git a/docs/AMELIORATIONS.md b/docs/AMELIORATIONS.md index da242a4..bdf24ec 100644 --- a/docs/AMELIORATIONS.md +++ b/docs/AMELIORATIONS.md @@ -752,6 +752,7 @@ toujours le client qui tient la liste, la sélection et les infobulles. | **L'icône d'onglet perdait un tiers de sa surface** | `fillToInterior` est vrai pour ces onglets, et `UpdateIconInterior` en tire deux gestes : `SetTexCoord(0.03125, 0.96875, …)` et `SetSize(extent, extent)` avec `interiorExtent` valant 50 par défaut. L'onglet faisant 55 de large, l'icône en prend 50 — tout l'intérieur, moins le bord. Elle était à 32. | | **Le masque est cuit dans l'image** | La source découpe l'icône par `common-sidetab-mask`, une `MaskTexture` que 3.3.5 n'a pas. Ce que le client ne sait pas faire à l'écran, `tools/cuire_masque.py` le fait avant : l'alpha du masque est multiplié dans celui de l'icône. La géométrie vient de la source, pas d'une estimation — onglet 55 × 55, masque 55 × 60 ancré au centre, icône 50 × 50 en (−3, 0) rognée à 0,03125 — et hors du masque le wrap `CLAMPTOBLACKADDITIVE` donne zéro. Deux dossiers : `icons/` garde l'export brut, qui est la provenance et l'entrée de la cuisson ; `TabIcons/` porte les versions cuites, et c'est celles-là qu'on affiche. Relancer l'outil refait les secondes à partir des premières, sans wow.export. | | **L'onglet de réputation, repris de camelot** | `ReputationFrame.xml` donne la liste — `TOPLEFT (10, −40)` et `BOTTOMRIGHT (−25, 15)` sur le volet gauche, deux traits `UI-Character-Info-ScrollLine-Long` centrés sur son haut et son bas — et les gabarits : entrée de 30, barre de 160 × 29 héritée de `ColoredProgressBarTemplate`, fond `common-stat-bar-bg`, remplissage `common-stat-bar-white` **teinté** et haut de 15. 3.3.5 a les mêmes pièces sous d'autres noms : quinze `ReputationBar` ancrées une fois dans le XML, que `ReputationFrame_Update` ne fait que remplir — on peut donc les reposer une fois pour toutes, et se greffer après lui pour teindre. | +| **Les épées n'appartiennent qu'à la guerre** | Les trois cases partagent le même fond, `checkbox-minimal`, mais pas la même coche : `AtWarCheckbox` porte `Interface/Buttons/UI-CheckBox-SwordCheck` — deux épées croisées, en 32 posées à `(3, −5)` — tandis que `MakeInactiveCheckbox` et `WatchFactionCheckbox` prennent `checkmark-minimal`, centré. Les épées avaient été données aux trois. | | **Un texte ne revient à la ligne que s'il a une boîte** | La description n'avait que son bord haut et ses deux côtés : sans bas, une description un peu longue n'avait nulle part où aller et disparaissait entièrement. Elle a maintenant ses quatre bords — du bas de la jauge au haut des trois cases — et se replie dedans. | | **`GameFontNormal` est doré, pas blanc** | camelot déclare `fontName = GameFontNormal` sur son `ScrollingFontTemplate`, mais en 3.3.5 cet objet de police est celui des **titres**, en or. Le blanc y est `GameFontHighlight`, et c'est ce que montre la référence. | | **Un `` n'est pas une région** | `ReputationDetailFrame` porte un fond de fenêtre déclaré en `` — `UI-DialogBox-Background` et `UI-DialogBox-Border`, avec ses marges et sa taille de tuile. Il ne figure pas dans `GetRegions` : le balayage des textures ne l'atteignait pas et son cadre gris restait à l'écran. `SetBackdrop(nil)` l'enlève, comme pour les listes de menu. **À vérifier sur tout cadre du client que l'on reprend** : les deux façons de poser un fond demandent deux gestes différents. | diff --git a/tools/test_addon.py b/tools/test_addon.py index 0f139a5..20ba488 100644 --- a/tools/test_addon.py +++ b/tools/test_addon.py @@ -2827,6 +2827,17 @@ def main(): assert cases[1].points[1][5] == -2, "BOTTOMLEFT (0, -2)" assert all(c.shown for c in cases), "les trois paraissent pour une faction" + # LES EPEES N APPARTIENNENT QU A LA GUERRE : les deux autres cases + # portent checkmark-minimal, comme la source le declare. + print(" coches : guerre=%s | inactive=%s | barre=%s" % ( + cases[0].foreverCoche.texture, cases[1].foreverCoche.texture, + cases[2].foreverCoche.texture)) + assert "SwordCheck" in (cases[0].foreverCoche.texture or ""), "At War garde ses deux epees" + for c in (cases[1], cases[2]): + assert "SwordCheck" not in (c.foreverCoche.texture or ""), "Move to Inactive et Show as Experience Bar prennent une coche" + assert c.foreverCoche.points[1][1] == "CENTER", "checkmark-minimal se centre sur la case" + assert cases[0].foreverCoche.width == 32, "la coche de guerre fait 32, posee a (3, -5)" + # UN EN-TETE N A PAS DE DETAIL. lua.execute("SetSelectedFaction(1)") g.ForeverUI.ReputationDetail()