Skip to content

feat(#311): a cleanup and navigation pass over the UI - #312

Merged
octalide merged 11 commits into
devfrom
feat/311
Oct 4, 2026
Merged

octalide merged 11 commits into
devfrom
feat/311

Conversation

@octalide

@octalide octalide commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Closes #311
Closes #307

Plan

  • fix: shape and brush options in the World tab combine and can't be deselected #307 first, as its own commit. blit keys a button by its label. The boundary's and the walls' gesture groups offered the same four labels in the World panel's one id scope, so each pair was one widget sharing hover, press and the chosen look. Each group now keys its buttons under its own scope, and each lights its choice only while its tool is up. The selection's Clear collided the same way with the world's Clear.
  • One control kind per meaning (cellar.look):
    • An exclusive choice is one keyed button group with the choice lit: look.choice, which is blit's button_grid under its own id scope, or segmented for one row.
    • An on/off setting is a toggle. Region picking becomes one.
    • An action is a button.
  • World tab by task, in three folding blit sections:
    • Shape: a line saying what the world is now, then Topology, the Boundary tool (W), and Size with Set size and Unbound. Unbound stays in place, disabled when there is nothing to remove.
    • Walls (L): gesture, what a wall holds, brush radius.
    • Select and fill: the Selection (V) operations and the boundary toggle, then Randomize (R) with its target, area and density, and the Randomize and Clear world (C) buttons.
    • A tool's heading names its key and lights while the tool is up. Its usage note shows only then.
  • Tool controls come with the tool. Taking up the bounds, wall or select tool from the toolbar or a key brings the World tab to the front of its dock, opens that tool's section and scrolls it to the top. A tool taken up inside the panel leaves the panel where it is.
  • Toolbar fits 1280 px in every state. The engine choice, HashLife's step and going to a generation move into a popup off one button that names the engine and its step. Esc closes the popup, as it closes the state picker. The speed slider is narrower, and the state picker is as wide as the rule's last state needs.
  • Shortcuts shown. A tooltip names the key of every control that has one: run, tools, state picker, help, randomize, clear, the selection's operations, grid lines, frame, screenshot, rotate and flip. The key reference lists the keys by area (Run, Tools, World, Selection, View, Window) in two columns that fit the window. Its Esc line now says what fix: Esc closes the application #308 made Esc do.
  • Rule panel: headings over presets, rule string and neighbourhood. A preset's full name shows in its tooltip.
  • Stamp: Rotate and Flip buttons under the pattern's preview (Z, X).
  • Stats (as the coordinator asked after feat: show the measured rate and step time beside the set speed #310): the default layout gives the stats 40% of the right side instead of 30%, so every row shows at 1280x800. The stats show only an identification in progress and its result. The how-to note moved to the Identify button's tooltip.

Audit (before)

Captures at 1280x800 under a headless kwin are in the worktree, in out/before/ and out/after/. The panels and tabs were opened with an uncommitted hook.

where finding done
World One long list under five small dim headings (Bounds, Boundary, Walls, Randomize, Selection) with no grouping. Boundary drawing sits between the topology and the size fields that belong with it. Walls start below the fold. Three sections by task
World The boundary's and the walls' gestures shared widget ids, so choices combined and could not be moved off (#307). The boundary's choice was lit even with another tool up. Keyed apart, lit only with the tool
World "Rectangle" is cut to "Rectan..." in the three-column boundary grid. Two columns, matching the walls
World The size fields take two rows. "Remove" appears and disappears, which shifts the layout. Fields share a row. Unbound is always there, disabled when idle
World Randomize's Clear clears the whole world, and its id collided with the selection's Clear. "Clear world", keyed apart
World Region picking is a button whose label flips: an on/off mode drawn as an action. Toggle
World No usage note is tied to its tool. The boundary's note shows with any tool. Notes only while the tool is up
Toolbar, right dock Taking up Bounds or Walls (toolbar, W, L) leaves their controls wherever the right dock is. Rule is in front by default, and the controls sit below the World tab's fold. Reveal
Toolbar Wraps at 1280 px with HashLife (step and go to take a second row) and under a rule of more than two states (Panels and Settings drop to a second row). Engine popup, narrower speed, sized state picker
All No control shows its key. Tooltips and tool headings
Help 31 keys in one unordered column. It is taller than the window (top and bottom cut off), and descriptions run past the card's edge. By area, two columns, fitted text
Rule Preset names are cut ("Gray-Scott sp...", "Hydrogemini...") with no way to read them. Nothing separates presets, string and neighbourhood. Tooltips, headings
Patterns The stamp's rotate and flip have keys (Z, X) but no control. Buttons under the preview
Stats The bottom rows (device, pool) are clipped at 1280x800, more so after #310 added rows. Taller default share
View "Frame the fill" frames what Randomize would fill. Kept in View: it moves the camera. Its key F is in its tooltip
Toolbar The Settings button duplicates the Panels menu's Settings item. Kept: the one panel that starts closed and floats
Select and fill The selection's "Random fill" duplicates Randomize with the Selection target. Kept: the same command, one beside the selection's other operations with its key Ctrl R

Decided

  • "Deselect" for fix: shape and brush options in the World tab combine and can't be deselected #307 means the lit choice follows the tool. Each gesture group lights its choice only while its tool is up, and shows none otherwise. The topology and the boundary's Add, Subtract and Intersect are settings, so their choice always shows.
  • Reveal only touches an open World panel. It never reopens a closed panel and never shows panels hidden with Tab.
  • The engine popup replaces the toolbar's engine segmented control and HashLife row. The button reads "Chunks" or "HashLife 2^k".
  • A layout kept from an earlier version keeps its stats height. Only the default layout and Reset layout get the new 40% share.
  • Labels: "Pick a region", "Unbound", "Clear world", "Select and fill", "Draw walls", "A wall holds", "Size in cells".

Ran

  • mach fmt --check ., mach build ., mach build . -p release, and under a headless kwin the full mach test .. New tests:
    • draw__the_boundary_and_wall_choices_are_apart_and_each_shows_its_own: chooses and switches in each group, with no id collisions.
    • draw__a_tool_taken_up_by_key_brings_its_controls_into_view.
    • The escape test now covers the engine popup.
  • Before and after captures of every panel, the help, the toolbar in its states (chunks with many states, HashLife, both) and the World tab with each tool up, all at 1280x800.

blit keys a button by its label, and the boundary's and the walls' gesture
groups both offer Rectangle, Ellipse, Polygon and Freehand in the World
panel's one id scope. Each pair of buttons shared an id, so their hover,
press and chosen look were one widget's: a choice in one group lit the
same label in the other, and the boundary's choice could not be moved off
while the walls drew theirs over it. The selection's Clear collided the same
way with the world's.

Each group now keys its buttons under its own scope, and the boundary's
choice is lit only while the bounds tool is the tool, as the walls' already
was, so each group shows exactly the choice in effect.
… view

The World tab is three folding sections: Shape (what the world is now, its
topology, the boundary tool and its size), Walls, and Fill and select
(randomize, clearing the world and the selection). An exclusive choice is
one keyed group (look.choice), a tool's heading names its key and lights
while it is the tool, and its usage note shows only then. Region picking is
a toggle, and Remove bounds stays in place, disabled with nothing to remove.

Taking the bounds, wall or select tool up from the toolbar or a key brings
the World tab to the front of its dock with that tool's section open and
scrolled to the top. A tool taken up in the panel leaves it where it is.

Controls with a key name it in their tooltip (look.key_tip).
The engine choice, HashLife's step and going to a generation move into a
popup off one button naming the engine and its step, which took a second
row before. The speed slider is narrower and the state picker is as wide as
the rule's last state needs. Play, step, reset and the tools name their
keys in their tooltips.
The pattern's preview has Rotate and Flip for the stamp (Z, X). The
selection's operations name their keys in their tooltips. The rule panel
has headings over its presets, its string and its neighbourhood, and a
preset cut to fit its button reads whole in its tooltip.
@octalide
octalide marked this pull request as ready for review October 4, 2026 04:34
@octalide
octalide merged commit aa3f5e4 into dev Oct 4, 2026
2 checks passed
@octalide
octalide deleted the feat/311 branch October 4, 2026 04:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: a cleanup and navigation pass over the UI fix: shape and brush options in the World tab combine and can't be deselected

1 participant