fix #371: straddling rows clip at the viewport edge instead of vanishing whole

Gate-3 screenshot review (user): 'the chat tab looks like it is missing
per window config' — Chat Window 1's header rendered over a void at the
DEFAULT scroll offset because its 260px self-sized filter block
straddled the viewport's bottom edge and UiScrollablePanel hid
straddling rows WHOLE (AP-201's predicted symptom, now user-observed at
scroll position zero, upgrading it from polish to blocking).

By fix time the UI renderer HAD everything needed: UiRenderContext's
clip stack (PushClip/PopClip with rect intersection + per-draw quad
clipping) and UiElement's ClipsChildren hook, already honored by both
the generic draw walk and hit-testing. The fix is therefore exactly the
shape the filing asked for, in the panel itself:
- ClipsChildren => true: children draw and hit-test clipped to the
  viewport rect.
- The layout cull keeps any INTERSECTING row Visible (was: fully-inside
  only), with a half-pixel margin excluding zero-overlap edge rows;
  fully-outside rows stay hidden as the cheap skip.

AP-201 retired in this commit (AP actives 142 -> 141); #371 closed; the
gate script's Chat-tab steps re-written to expect clean edge clipping
and to treat any whole-block vanish as a regression. Pinned by
StraddlingRow_StaysVisible_AndClipsInsteadOfVanishing (the exact gate-3
geometry: header + 260px straddler in a 430px viewport) and
ViewportClipsChildDrawingAndHitTesting (the clipped slice is not
clickable).

Full Release suite: 13,089 passed / 4 skipped / 0 failed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-11 17:08:21 +02:00
parent a8ce010d02
commit a59e077a66
5 changed files with 118 additions and 20 deletions

View file

@ -403,16 +403,15 @@ chat windows already read when deciding which lines to show.
block has all 13.
2. **Scroll the list.** All six sections are reachable; the block heights
visibly differ from a flat 100px box — each block is exactly tall enough
to show all of its own rows with no clipping and no dead space below the
last row (AP-195's self-sizing). **Known, registered behavior (AP-201,
OP5 review fix S2): the row viewport culls whole rows rather than
clipping them (no scissor stack yet — `UiScrollablePanel.cs`), so a
240-260px filter block that straddles the visible edge at a given scroll
position can vanish ENTIRELY at that exact offset rather than showing a
partially-clipped view. Keep scrolling a little further and the block
reappears whole. This is the registered cull-vs-clip divergence, not a
self-sizing regression — do not report a block's disappear-then-
reappear-whole behavior as a bug.**
to show all of its own rows with no dead space below the last row
(AP-195's self-sizing). **Gate-3 fix (#371, AP-201 retired): blocks now
CLIP at the viewport edges instead of vanishing whole.** At the default
scroll position you should see the Main Chat Window block in full, then
"Chat Window 1"'s header and as many of its checkboxes as fit, cut off
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.
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
@ -518,10 +517,9 @@ chat windows already read when deciding which lines to show.
- Reset/Defaults not behaving as described in 11-12.
- Any block that is STILL missing rows, or leaves a large empty gap below
its last row, once fully scrolled into view (a genuine self-sizing
regression). **Not a regression:** a block that disappears entirely at
some intermediate scroll position and reappears whole a little further —
that is the registered whole-row-cull behavior (AP-201, see step 2), not
a clipping bug.
regression). A block that disappears ENTIRELY at any scroll position is
ALSO a regression now — the gate-3 fix (#371) made straddling blocks
clip at the viewport edge instead of vanishing whole (see step 2).
- Any setting that reverts to default after a full relaunch (a persistence
regression) — remember this is local-only, so a SERVER-side relog is not
the right test here (see item 15's note).