Rio
adr/0092-theme-picker.mdRaw Markdown · GitHub ↗

ADR-0092: The theme menu becomes a bounded picker

  • Status: Accepted
  • Date: 2026-09-10
  • Deciders: jka
  • Decision: D92

Context

After ADR-0074 one unbounded, data-driven menu remained: the Theme cascade, which grows with every theme installed from a repository. The Preferences window's theme dropdown (ADR-0058) was a second menu over the same list. An over-tall Tk menu can unpost on hover on X11, and rio does not patch Tk's menus (ADR-0059).

Decision

Both are replaced with the bounded picker of ADR-0074, generalised as pick_dialog {title rows ?initial?}: rows are {payload label}, the result is the chosen payload or empty. The dialog sizes itself to its content within limits (6–16 rows, 28–72 columns) and preselects initial, the current choice.

  • View ▸ Theme… is a command that opens the picker.
  • Preferences ▸ View shows the current theme on a button labelled with the theme name and an ellipsis, which opens the same picker.
  • The list is built when the dialog opens (theme_pick_rows), so installs and removals need no menu refresh.

Alternatives considered

A picker with a colour swatch or live preview per row. Drawing each row in its theme's colours needs one theme.get per theme on every opening, which is many round trips over a possibly remote channel for a rarely used control. It would also need a second dialog widget, since only a text widget can show several colours in one row. It remains a roadmap candidate.

Consequences

  • No menu in rio is both data-driven and unbounded.
  • One dialog serves tab switching, tab comparison and theme choice.
  • The X11 menu behaviour stays documented in CAVEATS.md as the reason menus remain grouped.