fix #381: Options-panel footer needs an opaque backing field

Root cause: a live-DAT probe found retail authors NO backing element
behind the Character/Chat/Config tabs' Apply/Reset/Defaults footer —
each page root has exactly five children (the row ListBox, its
scrollbar, and the three buttons) with zero direct-state media on the
root itself. Scrolled row content therefore bled through visibly
between/behind the three buttons; the bleed-through is a rendering gap
in our own composition, not a missing import.

Fix: new minimal widget UiSolidSpriteFill tiles
RetailChromeSprites.CenterFill (the SAME panel-background sprite the
Options window's own chrome already draws behind everything, not an
invented color) across the footer strip's rect, derived from the three
buttons' own resolved Top/Height and z-ordered strictly behind every
other child so it can never intercept input or occlude the buttons.
Register row AP-205 records the synthesis. Regressed by
OptionsPanelControllerTests.
Bind_SynthesizesOneOpaqueFooterBacking_PerPageWithApplyResetDefaults,
which pins exactly one backing field per page, sized from the live
button rects, z-ordered behind every sibling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-11 23:01:43 +02:00
parent 2a248c0d48
commit a31fd631ad
7 changed files with 234 additions and 17 deletions

View file

@ -38,16 +38,35 @@ button starts in, what media that state resolves) — before fixing.
## #381 — Options-panel footer (Apply/Reset/Defaults) needs an opaque backing field; list content shows through between the buttons
**Status:** OPEN — filed 2026-08-11 at Campaign OP gate 4 (user report).
The Apply/Reset/Defaults row draws its three buttons directly over the
page content, so scrolled rows/text remain visible between and behind
them. Retail's tabs give that footer strip its own solid rectangular
field (no border) that occludes the content underneath. Fix: an opaque
borderless backing panel behind the footer button row on every page that
has the three buttons (Character/Chat/Config, and the equivalent strip on
Configure Keyboard if its authored layout shows the same bleed-through).
Check first whether the authored LayoutDescs carry such a field element
we fail to draw (preferred: draw the authored one) before synthesizing.
**Status:** ROOT-CAUSED + FIXED (this commit) — pending the user's
re-gate. Filed 2026-08-11 at Campaign OP gate 4 (user report).
**ROOT CAUSE — confirmed a genuine acdream synthesis, retail authors no
backing element either.** A live-DAT probe dumped the Character/Chat/
Config page roots' (`0x100001F9`/`0x100001FF`/`0x1000050A`) full
top-level child inventory: each has EXACTLY five children — the row
ListBox, its scrollbar, and the three physical buttons — with ZERO
direct-state media on the page root itself. Retail's own footer strip has
no authored backdrop; the bleed-through was a rendering gap, not a
missing import. **Fix:** a new minimal widget, `UiSolidSpriteFill`, tiles
`RetailChromeSprites.CenterFill` (the SAME panel-background sprite the
Options window's own chrome already draws behind everything, not an
invented color) across the footer strip's rect (derived from the three
buttons' own resolved Top/Height, spanning the full page width),
z-ordered strictly behind every other child so it can never occlude the
buttons. Register row AP-205 records the synthesis (Configure Keyboard
was NOT touched — its own footer strip was not probed and is out of this
fix's scope; file a follow-up if it shows the same bleed-through).
Regressed by
`tests/AcDream.App.Tests/UI/Layout/OptionsPanelControllerTests.cs`
(`Bind_SynthesizesOneOpaqueFooterBacking_PerPageWithApplyResetDefaults`
— pins exactly one backing field per page, sized from the live button
rects, z-ordered behind every sibling).
**Re-gate (§OP4/OP5/OP6, "the list does not clip/overlap the Apply/
Reset/Defaults buttons" steps): scrolled content should no longer be
visible through or around the three footer buttons on any of the three
tabs.**
## #380 — Chat tab: the two opacity sliders are missing their retail row captions

File diff suppressed because one or more lines are too long

View file

@ -205,7 +205,12 @@ TrySetOption` seam every other Options-panel consumer already uses.
FAILURE shape, not a crash, but still worth flagging which row).
2. **Scroll the list** via the scrollbar. All 50+6 rows are reachable;
the list does not clip or overlap the Apply/Reset/Defaults buttons at
the bottom.
the bottom. **Gate-4 re-test note (#381):** the footer strip behind the
three buttons previously had NO backing — scrolled row text/content was
visible bleeding through between and behind Apply/Reset/Defaults. The
footer now has an opaque backing field; report if any content is still
visible through or around the three buttons (this applies identically
on the Chat and Config tabs' own footer strips, OP5/OP6 below).
3. **Confirm the checkboxes reflect your character's actual state**
e.g. if you have `IgnoreAllegianceRequests` on from a prior session,
its row should show checked on open (seeded from the live server bit
@ -411,7 +416,9 @@ chat windows already read when deciding which lines to show.
cleanly at the panel's bottom edge — scrolling reveals the rest
smoothly. A block that disappears ENTIRELY while its header stays (the
pre-fix void your gate-3 screenshot review caught) is a regression —
report it.
report it. **Gate-4 re-test note (#381):** see the Character-tab (OP4)
step 2 note — the SAME opaque-footer-backing fix applies to this tab's
own Apply/Reset/Defaults strip.
3. **Look closely at a row whose mask covers MULTIPLE underlying message
types** (Gameplay, Combat, Allegiance, or Fellowship — the composite-mask
rows per the research doc) versus a single-bit row (e.g. "Error" or
@ -590,7 +597,8 @@ should show no caption.
invented English when a string fails to resolve).
2. **Scroll the list** via the scrollbar. All 27 rows are reachable; the
list does not clip or overlap the Apply/Reset/Defaults buttons at the
bottom.
bottom. **Gate-4 re-test note (#381):** see the Character-tab (OP4)
step 2 note above — the SAME opaque-footer-backing fix applies here.
### Live rows — audio