fix: controls console + tuner polish - #73
Merged
Merged
Conversation
Every modal action-hint footer now reads the same instrument voice:
lowercase verbs, compact glyph keys (↵ esc ↑↓ ←→ del), and a ' · '
separator. Previously each surface hand-wrote its own grammar
("Enter: Save Esc: Cancel", "↑/↓: Navigate Enter: Load", ...),
so wording drifted per overlay.
Introduce footer_hints(&[(key, verb)]) in render/panel.rs as the single
source of truth and route every footer through it: config save/browser
(live ratatui_adapter path), preset comparison, dirty guard, tuner hint,
palette editor save/load sub-dialogs, error notification, and both
chrome footer states. Collapse the two-line browser/load footers to one
line and make the palette load footer empty-aware.
A long notification (e.g. the dither dev-only toast, 53 chars) was hard clamped to the modal's 51-column message area with chars().take(...), amputating the trailing word — "…on GitHub" rendered as "…on GitH". Add a greedy word-wrap helper (wrap_words) that breaks on spaces and never mid-word (hard-breaking only a single oversized word as a last resort), and emit one message row per wrapped line. The icon stays on the first row and continuation rows align under the text. The modal's height is already content-driven, so it grows to fit.
Console: - Drop the cramped 6-cell per-row gauges from the master list; it now reads as a clean label column with readable (text_secondary) unfocused rows. - Size the panel to the active category (floored) instead of padding every category to the fattest one, so sparse categories (SYS, PRF) no longer show a tall empty void. - Tie the value state-tag to the value width instead of a fixed column gutter. - The numeric axis triangle now marks the current value (default is already shown by the notch on the bar), not a duplicate default marker. - Remove the restating placeholder description line; the header and kind widget already convey the parameter. - Center the legend strip; drop its trailing blank row and give that breathing room to the bottom of the master-detail pane instead. - Title box reads 'CONTROLS'; the active tab dot below names the category. Tuner (ambient modal): - Label and value render legibly (were muted to the point of looking disabled). - Thread ParamKind through TuneView so the affordance and footer verb match the kind: actions show a bright 'enter run' instead of a misleading 'tune' hint. - Center the footer hints across the tuner, notification, and pause cards.
- Pin the panel body to a fixed height (the tallest category, APP at 10 params) instead of sizing to the active category, so the panel no longer jumps as you cycle categories. Sparser categories pad with blank rows. - Drop the redundant '◈ <value>' widget line for enum params: the current value already renders in the value row with the cycle hint, so the second line just duplicated it (Diffusion/Gaussian, Wind, Theme, Palette, etc.).
- Align numeric detail ▲ axis marker with the gauge's default notch (round(ratio·(gw-1)), clamp to bar range) so they coincide at default instead of splitting a column apart. - Add shared value_color() helper; route both the ambient tuner value and the console numeric value through it so ParamState→color is decided in one place (console no longer uses accent_active / drops the Cli case). - Correct the stale module doc that described a dynamic-height contract and a nonexistent MIN_BODY_ROWS constant. - Remove the orphaned pub fn value_state (last caller deleted this branch). - Fix the ? keyboard-hints overlay clipping its bottom on terminals under ~40 rows: calculate_position now centers on the real rendered height and top-anchors when the overlay is taller than the terminal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nd modals Two visual-noise fixes for the windowed overlay experience: 1. Status bar now appears only when paused AND no overlay is open. Previously it showed whenever paused OR any overlay was open, cluttering the screen behind modals. on_pause() no longer expands chrome while an overlay is open, and on_modal_open() leaves the default (Minimal) base chrome collapsed instead of forcing ModalPane (persistent Expanded chrome is unchanged). 2. When a modal panel overlaps the window-frame border, the simulation and frame are wiped to a clean matte behind it so the panel is the sole focus. Panels fully contained within the sim interior leave the sim showing, so the blanking only kicks in when the frame would otherwise poke out as noise. Added FrameBuffer::fill_background and TerminalRenderer::modal_overlaps_frame, wired into both the single- and multi-species render paths. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tamirelazar
added a commit
that referenced
this pull request
Jun 26, 2026
fix: controls console + tuner polish
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Impeccable critique pass over the Controls "Instrument" surfaces (6 console categories + tuner), live-verified via the QA harness.
Console
◈ <value>line that duplicated the value already shown with the cycle hint (Gaussian, Wind, Theme, Palette, all 12 enums).CONTROLS; the active tab dot names the category.Tuner (ambient modal)
ParamKindonTuneView(actions show↵ run, not a misleading tune hint).Deferred (owner's call)
Gate: 1182 lib tests, clippy --all-targets, fmt clean.