From 8376105936bc3c4045efca35febb65bd431f476a Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 7 Sep 2026 19:28:30 +0200 Subject: [PATCH] =?UTF-8?q?fix(vtank):=20slice=207=20round=20F=20item=206?= =?UTF-8?q?=20=E2=80=94=20Buffs=20gap,=20Loot=20Editor=20Back,=20Route=20c?= =?UTF-8?q?ount=20column?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three small resemblance-re-check nits. Buffs: the extras strip (toggles/Difficulty/Rebuff/Buff button, no VTank counterpart) stayed at its pre-Round-D x=332 while Round D item 4's own +128 right-anchor shift moved the Blacklisted Buff Families list from x=524 to x=652 — an 8px left margin against a 138px right margin. Discovered a hard geometric ceiling while fixing this: Extra Buff Spells never moves (anchor="left top bottom", pinned x=4..324) but Blacklisted Buff Families tracks the growing right edge, sitting at x=524 at the panel's own tested FLOOR (856x236) and x=652 at the 984-wide enlarged default — a 128px swing. A single fixed-position strip can only be centered against ONE of those widths; centering against the 984 default (tried x=397 first) put the strip's right edge 55px inside where the list sits at the floor — a real overlap the existing ResolvedMainPanelHasNoOverlapOrOutOfBoundsChildAtThisSize pin (856x236 case) caught immediately. x=333 is the widest safe position (9px margins against the floor's 324..524 gap) — 1px from where fix round B item 2 already had it. The residual 984-default asymmetry (~9/137, barely changed from ~8/138) is an accepted, unavoidable- without-a-redesign limitation, the same "dead margin, polish later" trade already accepted for six other tabs at this size. Coverage moved from y=213 (anchored to the group's bottom edge, a real 55px empty hole once the panel grew past its original 194-tall size) to sit directly under the Buff button row (y=176, no anchor). Loot Editor: dropped the leftover standalone "Back" button — the window's own OS-level title bar already closes it, matching every other plugin popup (Advanced Options included) since round D. CloseLootEditor stays real, still called by ToggleLootEditorVisible. Route: the waypoint grid's count column (declared width="30") was the grid's LAST column, so docs/plugin-ui-markup.md's own "Width semantics" rule made that declared width never validated/used — it silently absorbed whatever remainder was left (33px normally, but only 17px once the scrollbar's 16px reservation ate into the list's own 370px width, since 337+30 already exceeded 370-16=354). A trailing filler column alone wasn't sufficient — proved by a targeted mutation below — since even non-last, a truly fixed 30px column still gets clamped by the same 354px ceiling. The real text column narrows 337->324 (324+30=354, exactly matching the scrollbar-reduced width) so the count column gets its full 30px whether or not the scrollbar shows. Every new/changed pin shown to fail against a targeted mutation first: LootEditorHasNoLeftoverBackButton failed with the button re-inserted, then passed once removed. RouteShapedGrid_CountColumnStaysThirtyPxWhen TheListScrolls (a synthetic list matching Route's real 370/324/30/* shape, 9 rows forcing the scrollbar, reflecting into UiMarkupList's own _cachedLayout) failed both against the original 2-column 337/30 shape (17px, reproducing the reported squeeze) AND against filler-only-no- narrowing (also 17px, proving the filler alone isn't the fix), then passed at exactly 30px once both changes landed together. BuffsExtrasStripIsCenteredAtThePanelsFloorAndCoverageSitsUnderTheButtonRow and its App-side resolved-tree counterpart BuffsExtrasStripStaysCenteredAndNonOverlappingAtTheFloor pin the floor-centered position and the Coverage gap. MossTank suite 725 -> 726 (one new pin); App markup/plugin filter 260 -> 262 (two new pins). Co-Authored-By: Claude Fable 5.1 --- src/AcDream.Plugins.MossTank/MossTankPanel.cs | 12 ++ .../mosstank-loot-editor.xml | 13 ++- src/AcDream.Plugins.MossTank/mosstank.xml | 104 +++++++++++++----- .../UI/MarkupListColumnsTests.cs | 52 +++++++++ .../MossTankMarkupBuildOverRealFilesTests.cs | 67 +++++++++++ .../MossTankMarkupContractTests.cs | 96 ++++++++++++++++ 6 files changed, 312 insertions(+), 32 deletions(-) diff --git a/src/AcDream.Plugins.MossTank/MossTankPanel.cs b/src/AcDream.Plugins.MossTank/MossTankPanel.cs index 696e9a54..84c359c1 100644 --- a/src/AcDream.Plugins.MossTank/MossTankPanel.cs +++ b/src/AcDream.Plugins.MossTank/MossTankPanel.cs @@ -1040,6 +1040,18 @@ internal sealed partial class MossTankPanel // PluginCore.cs:3576-3599 — any cell click deletes the waypoint). public IReadOnlyList RouteWaypointTextColumn => _routeRows; public IReadOnlyList RouteWaypointCountColumn => _routeWaypointCounts; + // Round F item 6 (resemblance re-check: "Route's count column + // squeezes to 17 when the list scrolls"): RouteWaypointCountColumn + // was the grid's LAST column, so docs/plugin-ui-markup.md's own + // "Width semantics" rule made its declared width="30" NEVER validated + // or used — it silently absorbed whatever remainder was left instead + // (33px normally, but only 17px once the scrollbar's own 16px + // reservation ate into that remainder). A trailing filler column + // (empty items) now sits after it so the count column is no longer + // last and keeps its own real, always-honored 30px width — the same + // fix as the Monsters grid's MonsterFillerColumn. + public IReadOnlyList RouteWaypointFillerColumn => Array.Empty(); + public Action RouteWaypointFillerClick => static _ => { }; public Action DeleteRouteWaypointAt => DeleteRouteWaypointAtCore; public Action SelectNearestRouteWaypoint => SelectNearestRouteWaypointCore; // VTank's own cmbNavType captions read Circular/Linear/Follow/Once diff --git a/src/AcDream.Plugins.MossTank/mosstank-loot-editor.xml b/src/AcDream.Plugins.MossTank/mosstank-loot-editor.xml index be38d697..97c213f7 100644 --- a/src/AcDream.Plugins.MossTank/mosstank-loot-editor.xml +++ b/src/AcDream.Plugins.MossTank/mosstank-loot-editor.xml @@ -13,11 +13,20 @@ panel, registered as a THIRD AddPanel call from MossTankPlugin.cs with ShowInSidePanel=false (VTank's popup has no independent shelf entry). This panel's own visible="{LootEditorVisible}" binding is the SAME flag the - checkbox flips and this popup's own "Back" button clears + checkbox flips and CloseLootEditor clears (CloseLootEditor => _lootEditorVisible = false) — closing the popup unchecks the box for free (see mosstank-advanced.xml's comment for why no new host show/hide API was needed). + Round F item 6 (resemblance re-check: "Loot Editor: drop the leftover + 'Back' button — the window closes from its title bar like the + others"): the standalone "Back" button bound directly to + CloseLootEditor is gone — the window's own OS-level title bar already + closes it, the same shape every other plugin popup (Advanced Options + included) has used with no Back button of its own since round D. + CloseLootEditor stays real: ToggleLootEditorVisible (the Profiles-tab + "Show Editor" checkbox's own close path) still calls it directly. + Fix round A also replaced the "↑"/"↓" text buttons (MoveLootRuleUp/Down) with the same DAT move-up/move-down icon glyphs the Monsters grid already uses (0x060028FC / 0x060028FD) — the retail default UI font (0x40000000) @@ -40,8 +49,6 @@ --> -