summaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-03 14:17:09 +0200
committerDanilo M. <danix@danix.xyz>2026-08-03 14:17:09 +0200
commit1f2eddff6afcbf4c24f06e982e9169219429a2ed (patch)
treeb809a3221d32e0276a3156ac2a2a45ea7f73b825 /docs
parent188287f14f981ed3e8a08bc1514bb2ba6bb76809 (diff)
downloadqtmaildir-1f2eddff6afcbf4c24f06e982e9169219429a2ed.tar.gz
qtmaildir-1f2eddff6afcbf4c24f06e982e9169219429a2ed.zip
feat: add menus, a toolbar and a shortcut reference
Actions were a QHash of std::function dispatched by an event filter, which nothing could put in a menu. They are QActions now, bound from KeyMap so a [keys] override reaches the menus as well as the keyboard. Menu bar covers every action; the toolbar carries only Sync, Archive, Delete and Undo. Help > Keyboard shortcuts is generated from the actions, so it shows what the keys really do rather than a copy that drifts. spam and load_remote gained defaults, having been unreachable without a hand-written binding. The event filter is gone. Probing showed QAction shortcuts are dispatched before the focused widget sees the key, so they beat QAbstractItemView's type-to-search without one, and Qt already suppresses plain-letter shortcuts while an editable widget has focus. Dropping the filter's blanket guard also lets Ctrl+Q work while the query bar has focus. registeredActionNames() is derived from the actions rather than hand-maintained, so the two drift tests it needed are replaced by checks that a configured binding reaches its action. No confirmation dialogs: tag mutations still answer to undo.
Diffstat (limited to 'docs')
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md35
1 files changed, 32 insertions, 3 deletions
diff --git a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
index 8847b9b..99e26e0 100644
--- a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
+++ b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
@@ -36,13 +36,13 @@ taking that too literally.
|---|------|---------|------|--------|
| 1 | Splitter/column widths do not survive restart | persistence | S | open |
| 2 | No way to see full message details (From/To/Cc/Subject) | information | M | open |
-| 3 | Too few clickable affordances, shortcuts are the only route | discoverability | M | open |
+| 3 | Too few clickable affordances, shortcuts are the only route | discoverability | M | **done** |
| 4 | Message-pane font size does not survive restart | persistence | S | open |
| 5 | Thread list is cramped, poor readability | presentation | S | open |
| 6 | Opened message stays unread | behavior | S | open |
| 7 | HTML view should be default for HTML messages | behavior | XS | **verify first, may already be done** |
-| 8 | No buttons or menu entries for archive, undo, etc | discoverability | M | open |
-| 9 | No in-app view of configured shortcuts | discoverability | S | open |
+| 8 | No buttons or menu entries for archive, undo, etc | discoverability | M | **done** |
+| 9 | No in-app view of configured shortcuts | discoverability | S | **done** |
| 10 | Reaching an account's inbox takes two steps | workflow | S | open |
| 11 | Icon, `.desktop` file, SlackBuild | packaging | M | open |
@@ -167,6 +167,35 @@ smuggle in a "Are you sure?" for Delete.
**Verification:** the existing keymap test must still pass unchanged, proving
user bindings survive the conversion. That is the load-bearing check here.
+### Outcome (done)
+
+Built as described: menu bar, toolbar, and a generated shortcut reference.
+Four things the plan did not anticipate, all verified by probe rather than
+assumed:
+
+- **The event filter was removable, but not for the stated reason.** The plan
+ worried that `QAction` shortcuts might lose to `QAbstractItemView`'s
+ type-to-search. They do not: shortcut dispatch runs before the focused
+ widget sees the key. The filter is gone, and the thread view no longer
+ needs its own.
+- **Qt already solves the query-bar case.** A plain-letter shortcut is
+ suppressed while an editable widget has focus, so the `hasFocus()` guard
+ was unnecessary. Removing it also fixed `Ctrl+Q`, which the old filter
+ swallowed while typing a query.
+- **Three default bindings had never worked.** `N`, `F` and `G` stored the
+ unshifted key, which no keystroke emits, so `toggle_unread`, `flag` and
+ `sync` were dead in 0.1.0. Fixed in `KeyMap::normalizeSequence()` and
+ committed separately from the menu work.
+- **The drift test did become unnecessary**, as the plan hoped.
+ `registeredActionNames()` is now derived from the `QAction`s, and
+ `defaultBindings()` is the single source for the defaults. The two tests
+ that pinned the hand-maintained lists together were replaced by ones that
+ check a configured binding actually reaches its action.
+
+Defaults moved to modifier shortcuts, since a single letter cannot be a menu
+accelerator without claiming that letter window-wide. Existing `[keys]`
+entries are unaffected.
+
## 4. Message-pane font size does not survive restart
**Observed:** described as "very annoying", more so than item 1.