fix(ui): #372 — Options tabs no longer blank; UiTemplateListBox viewport fills its ListBox

ROOT CAUSE (proven, not guessed): the lazily-created row viewport was
constructed 0x0 with Left|Top|Right|Bottom fill-anchors. Its first
ApplyAnchor captured mR = parentW - (0+0) = parentW, so
ComputeAnchoredRect's l&&r branch (w = parentW - mR - mL) kept it 0x0
forever. A 0-tall viewport makes UiScrollablePanel.LayoutScrollableChildren
cull every row, so Character/Chat/Config rendered blank while Gameplay
(no viewport — authored static children sized at Build) worked. This is
the exact Gameplay-vs-rest split the user's first connected gate found.

FIX: seed the viewport to the ListBox's current extent at creation, so the
fill-anchor baseline is mR = parentW - parentW = 0 and the viewport tracks
the parent. The ListBox is a static dat child sized at Build, so its extent
is authored by the time the viewport is lazily created during Bind.
Dormancy preserved — the viewport is still created only on the first row.

Reproduced RED then GREEN by UiTemplateListBoxViewportTests (viewport fills;
rows stay visible after the anchor+cull layout pass) — the layout path the
whole fixture conformance suite structurally never drove, which is why
every OP2-OP6 test was green over a live-only blank-tab failure. Full
Release suite 13,131 / 4 skips / 0 failed.

Still owed (NOT fixed here, no evidence yet): the 'only Exit Game worked'
Gameplay-buttons observation needs a re-gate (two buttons are correctly
INERT; the other four have dialog/chat effects that may have gone
unnoticed); and the 13 ID_ChatOption_TextFilter_* labels fail to resolve
(blank captions, behaviour unaffected). See #372.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-11 09:58:42 +02:00
parent c3ed32fb5a
commit 057d8cd703
3 changed files with 138 additions and 1 deletions

View file

@ -26,7 +26,44 @@ What does NOT go here:
## #372 — Options panel: Character/Chat/Config tabs render BLANK on screen and most Gameplay buttons do nothing (connected-gate failure)
**Status:** OPEN — filed 2026-08-11 at Campaign OP's first connected gate
**Status:** BLANK-TABS ROOT-CAUSED + FIXED (`c3ed32fb` probe, fix this
commit); the Gameplay-buttons observation still needs a re-gate. Filed
2026-08-11 at Campaign OP's first connected gate.
**ROOT CAUSE (blank tabs) — found + fixed.** `UiTemplateListBox` creates its
row viewport lazily (post-Build, during a page controller's `Bind`) at
**0×0** with `Left|Top|Right|Bottom` fill-anchors. The anchor system captures
its baseline from that 0-size rect (`mR = parentW (Left+Width) = parentW`),
and `UiElement.ComputeAnchoredRect`'s left+right branch then yields
`w = parentW mR mL = 0` (and `h = 0`) **permanently**. A 0-tall viewport
makes `UiScrollablePanel.LayoutScrollableChildren` cull every row
(`top + height ≤ Height` is false for any real row at Height 0), so every
ListBox-backed tab (Character/Chat/Config) draws empty. Gameplay works
because it has no viewport — its buttons are authored static children sized
at Build, so they never hit the lazy-0×0 path. **Fix:** seed the viewport to
the ListBox's current extent at creation (`UiTemplateListBox.cs` Viewport
getter), so the fill-anchor baseline is `mR = parentW parentW = 0` and the
viewport tracks the ListBox. Regressed by
`tests/AcDream.App.Tests/UI/UiTemplateListBoxViewportTests.cs` (RED→GREEN)
and the live-DAT mount probe. Every fixture conformance test stayed green
throughout — the false-negative class this issue documents — so the
regression test drives the anchor+cull layout path the suite never did.
**Still owed — the Gameplay-buttons half is NOT root-caused.** Of the seven
buttons the user found only Exit Game acting. Two (Configure Keyboard,
In-Game Help) are correctly INERT. The other four (Exit-to-CharSel confirm
dialog, Use-Mouse-Turning chat lines, Urgent Assistance / Report Abuse
failure text) have effects that may have gone unnoticed rather than failed —
no evidence either way yet. Needs a re-gate observation (per-button: does a
click produce ANY visible response) before investigating; do not guess-fix.
Separately, the live log showed all 13 `ID_ChatOption_TextFilter_*` Chat-tab
filter labels failing to resolve from string table `0x23000003` (rows render
blank-captioned by the honest-fallback path; masks/behaviour unaffected) — a
minor label-resolution bug to fix (wrong table id or key spelling for that
family), tracked here until split out.
<!-- original filing -->
**(filed OPEN)** — 2026-08-11 at Campaign OP's first connected gate
(`ACDREAM_RETAIL_UI=1`, live ACE). The user found: opening the Options panel
(F11/toolbar) shows the Gameplay tab, but switching to Character/Chat/Config
shows a BLANK page, and of the seven Gameplay buttons only **Exit Game**