summaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-09 09:45:32 +0200
committerDanilo M. <danix@danix.xyz>2026-08-09 09:45:32 +0200
commit2e66bb8b66df016164d44bf72a2d53b8c4a67dde (patch)
treebf4c154d21b2d998aa64104a00a5430f12aef365 /docs/superpowers/plans
parentaa8f50d7f3455a3c4e9ad147283bd85f1d752fc9 (diff)
downloadqtmaildir-2e66bb8b66df016164d44bf72a2d53b8c4a67dde.tar.gz
qtmaildir-2e66bb8b66df016164d44bf72a2d53b8c4a67dde.zip
feat(ui): icons on every action, and rename Flag to Important
Items 56 and 57, done together because both touch the action registry. 56. The complaint was inconsistency, not absence: eight of twenty-four actions had themed icons, so two adjacent entries in one menu disagreed and the toolbar laid out an empty slot for the other sixteen. The themeIcons table now covers them all. The fifteen names added were probed against a live icon theme first rather than taken from the freedesktop spec on faith, and the existing null-icon guard still lets a theme that lacks one fall back to text. The second half of the note asked that buttons honour the desktop's "Icon only" setting. They could not: the hardcoded setToolButtonStyle overrode it whatever the user had chosen. It now reads SH_ToolButtonStyle. Dropping the call entirely was tried and rejected, since a bare QToolBar defaults to ToolButtonIconOnly rather than to the platform hint, which ignores the setting just as thoroughly the other way. This is a visible change: on a desktop set to "Icon only" the toolbar now shows icons without text. 57. "Important" over "Starred", the user's pick; the Message menu already has "Mark &spam", so "Starred" would have needed an accelerator from inside the word. Changed the action text, its status tip, the undo description and the star column's tooltip, which still read "Flagged". The tag stays `flagged`. It is wire format that neomutt, the user's saved queries and ThreadSummary::isFlagged() all read, and following the label through to the tag would rewrite the mail store and desynchronise every other tool over the same Maildir. The action name stays `flag` too, since that is the key users write in [keys]. Four tests. everyActionCarriesAnIcon names every action missing one and guards against passing on an empty list; it reported all sixteen before the change. theImportantActionStillWritesTheFlaggedTag asserts on the tag the model actually received, and mutating it to `important` fails that test plus two pre-existing held-edit tests. Also adds the changelog entry for the cron-sync indicator fix, which the commit that made it omitted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'docs/superpowers/plans')
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md47
1 files changed, 45 insertions, 2 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 33d6a61..52cc023 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
@@ -113,8 +113,8 @@ taking that too literally.
| 53 | Message rows still read as a table, not as a conversation | presentation | ? | open, unspecified |
| 54 | A cron sync carries the edits but the count still says pending | correctness | S | **done** |
| 55 | In a narrow window the message pane is invisible | presentation | XS | open |
-| 56 | No action carries an icon, so the toolbar reserves space for nothing | presentation | S | open |
-| 57 | "Flag" would read better as "Important" or "Starred" | presentation | XS | open |
+| 56 | No action carries an icon, so the toolbar reserves space for nothing | presentation | S | **done** |
+| 57 | "Flag" would read better as "Important" or "Starred" | presentation | XS | **done** |
Sizes are rough: XS under an hour, S a sitting, M a session.
@@ -3457,6 +3457,29 @@ on a machine whose icon theme resolves the names, so it is an assertion about
this desktop as much as about the code, and it says nothing about whether the
icon chosen is the *right* one.
+**Built 2026-08-09, with item 57.** The `themeIcons` table now covers all 24
+registered actions; the fifteen names added were probed against a live theme
+before being written, not taken from the freedesktop spec on faith. The null
+guard is kept, so a theme missing a name still degrades to text.
+
+`setToolButtonStyle()` now reads `QStyle::SH_ToolButtonStyle` instead of
+asserting `TextBesideIcon`. Removing the call entirely was considered and
+rejected: verified empirically that a bare `QToolBar` defaults to
+`Qt::ToolButtonIconOnly` rather than to the platform hint, which would have
+ignored the user's setting just as thoroughly in the other direction.
+
+**This changes the toolbar's appearance on the developer's desktop.** Its hint
+reads `0` (`ToolButtonIconOnly`), so the toolbar shows icons without text where
+it previously showed both. That is the setting being honoured, which is what the
+note asked for, but it is a visible change rather than a silent one.
+
+Two tests: `everyActionCarriesAnIcon`, which iterates
+`KeyMap::knownActions()` and names every action missing one (it reported all
+sixteen before the change), and
+`theToolbarDoesNotOverrideTheDesktopButtonStyle`. The first carries a guard
+asserting the window really registered its actions, so it cannot pass by
+iterating an empty list.
+
## 57. "Flag" would read better as "Important" or "Starred"
**Observed (user, 2026-08-09):** "Flagged to be renamed as 'Important' or
@@ -3499,6 +3522,26 @@ whatever the icon depicts (a star suggests "Starred").
- `src/tagdialog.cpp:211` mentions `flagged` in a comment about token completion.
That is the tag, not a label, and must not be touched.
+**Built 2026-08-09, with item 56.** The user chose "Important". Changed: the
+action text to `tr("&Important")`, its status tip, the undo description to
+`tr("Mark important")`, and the flag column's tooltip
+(`src/threadlistmodel.cpp:192`), which still read "Flagged". The README's
+keybinding row and tagging prose followed.
+
+Unchanged, deliberately: the action **name** `flag`, which is the key a user
+writes in `[keys]` and whose rename would silently break every existing
+binding; the tag `flagged`; `ThreadSummary::isFlagged()`; the `[tagcolors]`
+entry; and the `Flagged = tag:flagged` saved query in the README's sample
+config, which is a user's own query name rather than one of our labels.
+
+`Ctrl+I` was already the binding, which happens to fit the new word.
+
+`theImportantActionStillWritesTheFlaggedTag` is the test that matters: it
+triggers the action and asserts on the tag the model actually received, with a
+guard proving the thread did not already carry it. Mutating the tag to
+`important` fails it, and also fails two pre-existing held-edit tests, which is
+independent confirmation that `flagged` is load-bearing across the suite.
+
## Deferred, unsized, or split out
Items noted while triaging but not part of the original list. Same numbering