Three more from the Deck: a setting wired to nothing, a grid missing its last row, and a bar put down wherever there was room #275

Merged
enricobuehler merged 1 commits from worktree-console-ui-followups into main 2026-08-16 22:12:29 +00:00
Owner

Follow-ups to #273, all three reported from the same Steam Deck after testing that build. Gate-green on top of current main (fmt, clippy -D warnings, plain non-test build, 174 tests) and the visual one confirmed in a rendered 1280×800 screenshot.

The collections setting was wired to nothing

"Even if I have the collections enabled in the settings, they don't actually get shown when opening the library."

LibraryScreen::collections_upgrade was written, documented, and unit-tested for its decision — and then nothing ever called it. It carried an #[allow(dead_code)], which is exactly what stopped the compiler from saying so, and its own tests passed throughout because they called it directly. The setting was on, the shelf agreed it should stand aside, and the library opened on the shelf anyway.

The call belongs in the shell's per-frame sync and nowhere else: a screen cannot replace itself. The shelf can answer the question, because it holds the library and the settings; only the shell owns the stack. Guarded on a settled transition, because mid-flight the stack's top is not yet what the user is looking at, and swapping under a push they have already reversed with B would land them on the collections of a host they just backed out of.

The new test drives Shell::sync and asserts on the stack — the shelf was never the broken part, so a test that asked the shelf would have gone on passing. Verified to fail with the one wiring call removed, reproducing the reported symptom exactly.

The grid lost its last row

"The grid view is cut off at the bottom."

The mirror of the top inset fixed in #273 — and that fix is what made this visible. The content ended at the last row's card bottom, so at maximum scroll that card sat exactly flush with the viewport's clip and lost its focus scale, its shadow and its label. The air has to be part of content_h rather than of the viewport, because content_h is the only thing the scroll clamp knows about.

The sort/view bar

"I don't like the top bar for switching the sorting & view type, please redesign it — one of the worst parts is the not centered view switch, the ugly looking focus indicator (dark bg, border)."

The arrangement group used to start at the band's midpoint. That is neither centred nor trailing: it read as a control put down wherever there was room. Both groups are now anchored to the edge they belong to — the sort leads at the heading's inset, the arrangement trails at the controller chip's, and the shoulders that change it are the trailing pair of buttons, so the hand and the eye agree. The band becomes the same two-anchor structure as the row above it.

The focus indicator was a glass panel, a brand hairline and a halo — the console's recipe for a floating surface, applied to a strip that sits flat in the field. Hence the dark slab with a line round it, and worse on the six pale palettes where the glass turns to frost over an already-light field. It is an accent wash now and nothing else: no border, no halo, no glass. The accent is palette-derived, so 14 % reads at both poles without the strip ever becoming an object.

One defect introduced and caught in the same pass, by looking rather than by testing: the gap between a caption and its pills was never explicit — it came from TabStrip's leading inset, which only appears when the rect it is handed has slack. A trailing group's rect is exactly as wide as its pills, so the gap silently vanished and "VIEW" ended up touching the first pill, while the leading group kept a gap by accident. Both groups now space their caption themselves and both are handed exactly-sized rects, so neither depends on that side effect for its position.

Verification limits

The grid-bottom fix has no screenshot witness — the dump has no scrolled-to-bottom grid scene, so it is verified by arithmetic and by the unfiltered case being unchanged. Same for the collection-grid case. Both want the Deck, which is where they were found.

Follow-ups to #273, all three reported from the same Steam Deck after testing that build. Gate-green on top of current `main` (fmt, clippy `-D warnings`, plain non-test build, 174 tests) and the visual one confirmed in a rendered 1280×800 screenshot. ## The collections setting was wired to nothing > "Even if I have the collections enabled in the settings, they don't actually get shown when opening the library." `LibraryScreen::collections_upgrade` was written, documented, and unit-tested for its **decision** — and then nothing ever called it. It carried an `#[allow(dead_code)]`, which is exactly what stopped the compiler from saying so, and its own tests passed throughout because they called it directly. The setting was on, the shelf agreed it should stand aside, and the library opened on the shelf anyway. The call belongs in the shell's per-frame sync and nowhere else: **a screen cannot replace itself.** The shelf can answer the question, because it holds the library and the settings; only the shell owns the stack. Guarded on a settled transition, because mid-flight the stack's top is not yet what the user is looking at, and swapping under a push they have already reversed with B would land them on the collections of a host they just backed out of. The new test drives `Shell::sync` and asserts on the **stack** — the shelf was never the broken part, so a test that asked the shelf would have gone on passing. Verified to fail with the one wiring call removed, reproducing the reported symptom exactly. ## The grid lost its last row > "The grid view is cut off at the bottom." The mirror of the top inset fixed in #273 — and that fix is what made this visible. The content ended at the last row's card bottom, so at maximum scroll that card sat exactly flush with the viewport's clip and lost its focus scale, its shadow and its label. The air has to be part of `content_h` rather than of the viewport, because `content_h` is the only thing the scroll clamp knows about. ## The sort/view bar > "I don't like the top bar for switching the sorting & view type, please redesign it — one of the worst parts is the not centered view switch, the ugly looking focus indicator (dark bg, border)." The arrangement group used to **start at the band's midpoint**. That is neither centred nor trailing: it read as a control put down wherever there was room. Both groups are now anchored to the edge they belong to — the sort leads at the heading's inset, the arrangement trails at the controller chip's, and the shoulders that change it are the trailing pair of buttons, so the hand and the eye agree. The band becomes the same two-anchor structure as the row above it. The focus indicator was a glass panel, a brand hairline and a halo — the console's recipe for a floating **surface**, applied to a strip that sits flat in the field. Hence the dark slab with a line round it, and worse on the six pale palettes where the glass turns to frost over an already-light field. It is an accent wash now and nothing else: no border, no halo, no glass. The accent is palette-derived, so 14 % reads at both poles without the strip ever becoming an object. One defect introduced and caught in the same pass, by looking rather than by testing: the gap between a caption and its pills was never explicit — it came from `TabStrip`'s leading inset, which only appears when the rect it is handed has slack. A trailing group's rect is exactly as wide as its pills, so the gap silently vanished and "VIEW" ended up touching the first pill, while the leading group kept a gap by accident. Both groups now space their caption themselves and both are handed exactly-sized rects, so neither depends on that side effect for its position. ## Verification limits The grid-bottom fix has no screenshot witness — the dump has no scrolled-to-bottom grid scene, so it is verified by arithmetic and by the unfiltered case being unchanged. Same for the collection-grid case. Both want the Deck, which is where they were found.
enricobuehler added 1 commit 2026-08-16 22:11:50 +00:00
fix(console): the collections setting was wired to nothing, the grid lost its last row, and the sort bar was put down wherever there was room
ci / bun-nix (pull_request) Successful in 29s
ci / docs-site (pull_request) Successful in 1m18s
ci / rust-arm64 (pull_request) Successful in 1m28s
ci / web (pull_request) Successful in 4m22s
windows-client / client (x64, , x86_64-pc-windows-msvc, C:\t) (pull_request) Successful in 7m4s
windows-client / client (arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (pull_request) Successful in 3m1s
android / android (pull_request) Successful in 14m41s
ci / rust (pull_request) Successful in 18m42s
08142744a1
Three more from the Deck.

"Even if I have the collections enabled in the settings, they don't actually get
shown when opening the library."

`LibraryScreen::collections_upgrade` was written, documented, and unit-tested for
its DECISION — and then nothing ever called it. It carried an
`#[allow(dead_code)]`, which is exactly what stopped the compiler from saying so,
and its own tests passed throughout because they called it directly. The setting
was on, the shelf agreed it should stand aside, and the library opened on the
shelf anyway.

The call belongs in the shell's per-frame sync and nowhere else: a screen cannot
replace ITSELF. The shelf can answer the question, because it holds the library
and the settings; only the shell owns the stack. It is guarded on a settled
transition, because mid-flight the stack's top is not yet what the user is looking
at, and swapping under a push they have already reversed with B would land them on
the collections of a host they just backed out of. The new test drives
`Shell::sync` and asserts on the STACK — the shelf was never the broken part, so a
test that asked the shelf would have gone on passing.

"The grid view is cut off at the bottom."

The mirror of the top inset fixed one commit ago, and that fix is what made it
visible. The content ended at the last row's card bottom, so at maximum scroll
that card sat exactly flush with the viewport's clip and lost its focus scale, its
shadow and its label. The air has to be part of `content_h` rather than of the
viewport, because `content_h` is the only thing the scroll clamp knows about.

"I don't like the top bar for switching the sorting & view type, please redesign
it — one of the worst parts is the not centered view switch, the ugly looking
focus indicator (dark bg, border)."

The arrangement group used to START at the band's midpoint. That is neither
centred nor trailing: it read as a control that had been put down wherever there
was room. Both groups are now anchored to the edge they belong to — the sort leads
at the heading's inset, the arrangement trails at the controller chip's, and the
shoulders that change it are the trailing pair of buttons, so the hand and the eye
agree. The band is the same two-anchor structure as the row above it.

The focus indicator was a glass panel, a brand hairline and a halo — the console's
recipe for a floating SURFACE, applied to a strip that sits flat in the field.
Hence the dark slab with a line round it, worse on the six pale palettes where the
glass turns to frost over an already-light field. It is an accent wash now and
nothing else: no border, no halo, no glass. The accent is palette-derived, so 14 %
reads at both poles without the strip ever becoming an object.

One defect introduced and caught in the same pass, by looking rather than by
testing: the gap between a caption and its pills was never explicit. It came from
`TabStrip`'s leading inset, which only appears when the rect it is handed has
slack — and a trailing group's rect is exactly as wide as its pills, so the gap
silently vanished and "VIEW" ended up touching the first pill, while the leading
group kept a gap by accident. Both groups now space their caption themselves and
both are handed exactly-sized rects, so neither depends on that side effect for
its position.
enricobuehler merged commit 8f577f19ab into main 2026-08-16 22:12:29 +00:00
enricobuehler deleted branch worktree-console-ui-followups 2026-08-16 22:12:39 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unom/punktfunk#275