Launcher grid with icons, themes, Settings in groups, the website's colours #97

Merged
twisla merged 6 commits from launcher-grid into main 2026-10-09 22:25:50 +00:00
Owner

The look of the firmware: a Launcher of icons, colour themes, and Settings in groups.

Closes #9
Closes #10

  • Launcher (#9): a 4 x 3 grid of 32 x 32 icons with the selected App's name under it. The icons are the website's own, doubled, plus two drawn the same way for SSH and the Shell; they are PNGs in assets/icons, turned into arrays by scripts/make_icons.py, which CI checks. An orange dot marks an App with something going on (unread IRC messages, a Track recording, a Capture running, an SSH session open). Settings > Display > Launcher keeps the list.
  • Themes (#10): seven, each dark and light: roro9stack (the website's, the default), Catppuccin, Dracula, Nord, ANSI terminal, Gruvbox, Solarized. Every colour is one the RGB332 frame buffer holds exactly, so they are the nearest the screen can do, not exact copies. test_palette checks exactness and contrast for all 14 palettes.
  • The website's colours on every screen, as the default theme: cyan accent, slate Status Bar, a selected row in cyan with dark text.
  • Settings in five groups: This device, Display, GNSS and radio, Network, System. The docs and messages name the new paths.
  • Fix, SSH App: its bottom-line messages were cleared the moment they were set, so a refused connection looked like Enter did nothing.

Tested

  • 592 host tests pass; the firmware builds; the site check is clean.
  • On the device, by screenshot: the Launcher in all 14 palettes; every App in the default theme; eight screens in Gruvbox light; Catppuccin dark; the Settings groups; the SSH message after the fix.
  • Not looked at: the Launcher's badge dot, the List option, dialogs and Toasts outside the default theme, most Apps in 12 of the palettes, the Setup screens.

🤖 Generated with Claude Code

https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk

The look of the firmware: a Launcher of icons, colour themes, and Settings in groups. Closes #9 Closes #10 - **Launcher (#9):** a 4 x 3 grid of 32 x 32 icons with the selected App's name under it. The icons are the website's own, doubled, plus two drawn the same way for SSH and the Shell; they are PNGs in `assets/icons`, turned into arrays by `scripts/make_icons.py`, which CI checks. An orange dot marks an App with something going on (unread IRC messages, a Track recording, a Capture running, an SSH session open). Settings > Display > Launcher keeps the list. - **Themes (#10):** seven, each dark and light: roro9stack (the website's, the default), Catppuccin, Dracula, Nord, ANSI terminal, Gruvbox, Solarized. Every colour is one the RGB332 frame buffer holds exactly, so they are the nearest the screen can do, not exact copies. `test_palette` checks exactness and contrast for all 14 palettes. - **The website's colours** on every screen, as the default theme: cyan accent, slate Status Bar, a selected row in cyan with dark text. - **Settings in five groups:** This device, Display, GNSS and radio, Network, System. The docs and messages name the new paths. - **Fix, SSH App:** its bottom-line messages were cleared the moment they were set, so a refused connection looked like Enter did nothing. ## Tested - 592 host tests pass; the firmware builds; the site check is clean. - On the device, by screenshot: the Launcher in all 14 palettes; every App in the default theme; eight screens in Gruvbox light; Catppuccin dark; the Settings groups; the SSH message after the fix. - Not looked at: the Launcher's badge dot, the List option, dialogs and Toasts outside the default theme, most Apps in 12 of the palettes, the Setup screens. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
twisla added 6 commits 2026-10-09 22:22:59 +00:00
The bottom-line message (a malformed address, not enough memory, a
session still closing) is timed from millis() when a key sets it, and
update() compared that with the pass's own time, read before the keys
were handled. The unsigned difference wrapped, so the message was
cleared before it was ever drawn: Enter on a new connection that was
refused looked like it did nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
The theme takes the website's palette, each a colour the RGB332 frame
buffer holds exactly: cyan for the accent, a selected row and a chosen
button in cyan with dark blue text, a slate Status Bar (the grey it
asked for was shown as a dull olive), the website's orange for
warnings and its pink for messages. "Good" (a Fix, the quietest
channel) keeps a green of its own, which the website doesn't have.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
The Launcher shows the Apps as a 4 x 3 grid of 32 x 32 icons, the
selected one's name under it (issue #9). The icons are the website's
own, doubled, and two drawn the same way for SSH and the Shell; they
are PNGs in assets/icons, turned into arrays by scripts/make_icons.py,
which CI checks. The selected tile is the website's: dark blue on cyan,
with notched corners.

- GridModel (lib/ui, host-tested) holds the selection and the scrolling.
- App::badge(): a dot on the tile for unread IRC messages, a Track
  recording, a Capture running, an SSH session open.
- Settings > Launcher: Grid or List.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
The selected icon was dark blue on its cyan tile, which read as black:
it is the Status Bar's slate now. The App's name under the grid is
white instead of cyan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
Settings > Theme and Settings > Light or dark pick the colours of every
screen (issue #10): roro9stack (the website's, the default), Catppuccin,
Dracula, Nord, ANSI terminal, Gruvbox and Solarized.

- A palette is 14 roles (lib/ui/src/palette.h). theme::kText and the
  others are now references into the one in use, so the Apps are
  unchanged; the main loop applies it when a Setting changes.
- Every colour is one the RGB332 frame buffer holds exactly: the themes'
  own were rounded, and those that fell together or lost contrast were
  picked by hand. test_palette checks exactness and 18 contrast ratios
  for each palette.
- The Sky view's constellation colours come from the theme.
- `theme [0-6] [light|dark]` on the consoles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
Settings: its rows in five groups
Site / build (pull_request) Successful in 10s
CI / build (pull_request) Successful in 2m22s
0c52613b72
Settings had grown to 21 rows in one list. It opens on five groups (This
device, Display, GNSS and radio, Network, System); Enter opens one, Back
returns to the groups, and Back from the groups leaves Settings.

SettingsMenu holds the groups and which one is open (host-tested: every
setting is in exactly one group). The guide, the how-tos, the README,
the scripts' messages and the firmware's own name the new paths, such as
"Settings > System > Firmware".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
twisla merged commit fd534af971 into main 2026-10-09 22:25:50 +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: twisla/roro9stack#97