summaryrefslogtreecommitdiffstats
path: root/docs/superpowers
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-09 09:37:42 +0200
committerDanilo M. <danix@danix.xyz>2026-08-09 09:37:42 +0200
commitaa8f50d7f3455a3c4e9ad147283bd85f1d752fc9 (patch)
treea4273363a8a40a644a75a195809cb8c7ecff1783 /docs/superpowers
parentd213bbffa9f77e78dc21c80308b48b522b0d5a8b (diff)
downloadqtmaildir-aa8f50d7f3455a3c4e9ad147283bd85f1d752fc9.tar.gz
qtmaildir-aa8f50d7f3455a3c4e9ad147283bd85f1d752fc9.zip
docs: record items 56 and 57 from the user's notes
Two notes added since this morning's pass, both presentation. 56: icons are inconsistent across the interface. The mechanism is not missing, it is partial: the themeIcons table covers eight actions and about twenty others get nothing, so adjacent menu entries disagree. The names are not the obstacle either, probed against this desktop's theme and every name a full set would need resolves. The second half of the note, that buttons should honour "Icon only", is a real override: the hardcoded setToolButtonStyle defeats the desktop's own setting. 57: rename the Flag action to Important or Starred. Label only. The notmuch tag stays `flagged`, since it is wire format that neomutt and the user's saved queries also read. The star glyph already ships in the list column. Recorded that "Important" can take a free accelerator while "Starred" collides with Mark &spam. The first draft of 56 claimed there were no icons at all, which was wrong: it missed the table at mainwindow.cpp:902 by grepping for the call site rather than reading the setup. Corrected before commit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'docs/superpowers')
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md112
1 files changed, 112 insertions, 0 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 5d175a5..33d6a61 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,6 +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 |
Sizes are rough: XS under an hour, S a sitting, M a session.
@@ -3387,6 +3389,116 @@ must go behind the same "no saved state" check as the geometry.
geometry is saved; the reported case is a user-sized window, so widening the
default fixes nothing.
+## 56. No action carries an icon, so the toolbar reserves space for nothing
+
+**Observed (user, 2026-08-09):** "icons inconsistency. All buttons should have
+them, at least in the main window interface. Better if also the popups have
+them." And: "Buttons should honor the 'Icon only' option."
+
+**Cause, verified in code.** The mechanism exists and is used; it simply does not
+cover most actions. `src/mainwindow.cpp:902-919` holds a `themeIcons` table
+mapping action names to freedesktop icon names and calls `setIcon()` for each,
+guarded so a name the theme lacks leaves the action with text alone. It covers
+**eight** actions: `sync`, `archive`, `delete`, `undo`, `spam`, `flag`, `quit`,
+`focus_query`.
+
+Everything else registered through `MainWindow::addAction()`
+(`src/mainwindow.cpp:598`) gets none, and there are roughly twenty of them:
+`toggle_unread`, `mark_all_read`, `edit_tags`, `select_all`, `clear_pane`,
+`clear_selection`, `zoom_in`, `zoom_out`, `zoom_reset`, `toggle_html`,
+`load_remote`, `message_details`, `complete_query`, `next_thread`,
+`prev_thread`, `open_thread`. That is the reported inconsistency: adjacent
+entries in one menu, some with an icon and some without, which reads worse than
+none having one.
+
+The toolbar is `setToolButtonStyle(Qt::ToolButtonTextBesideIcon)`
+(`src/mainwindow.cpp:948`), so an action without an icon lays out an empty slot
+beside its text.
+
+**The names are not the obstacle.** Probed against this desktop's theme
+(`Material-Black-Plum-Suru`) with a throwaway Qt program: the eight in use all
+resolve, and so do `mail-mark-unread`, `view-refresh`, `edit-select-all`,
+`zoom-in`, `zoom-out`, `zoom-original`, `tag`, `mail-message-new`, `edit-clear`
+and `help-about`. So the missing icons are missing because no name was assigned,
+not because the theme lacks art. On another desktop the guard already handles a
+name that does not resolve.
+
+**The "Icon only" half is separate, and is a genuine override.** Qt takes the
+desktop's toolbar button style from the platform theme, and the hardcoded
+`setToolButtonStyle()` at line 948 **overrides** the user's choice, so an "Icon
+only" setting cannot take effect. Honouring it means dropping that call, or
+reading `QApplication::style()->styleHint(QStyle::SH_ToolButtonStyle)` instead of
+asserting a style. This is the smaller of the two halves and is independent of
+the first.
+
+**Dialogs are a third case.** `QDialogButtonBox` standard buttons take their
+icons from the platform style, so whether Ok and Cancel carry one is a style
+question rather than something this code decides.
+
+**Approach.** Extend the existing `themeIcons` table to the remaining actions,
+and stop overriding the toolbar button style. No new mechanism is needed; the
+table and its null guard already do the work.
+
+**Constraints.**
+
+- Keep the null-icon guard. It is what makes a theme without a given name
+ degrade to text rather than to an empty slot.
+- Prefer theme names over shipped art. Per-action bitmaps in `src/resources.qrc`
+ would grow the package for something the desktop already provides; that file
+ currently carries only the application icon and two subsetted fonts.
+- Item 3 (done) added the buttons and menu entries. This is decoration on top of
+ that: no action should be added, removed or rebound here.
+- `flag` already maps to `mail-mark-important`, which agrees with item 57's
+ proposed rename. Do the two together if 57 is picked up.
+
+**Verification.** `test_mainwindow` can assert that every action in `m_actions`
+has a non-null icon. Note what that test does and does not prove: it passes only
+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.
+
+## 57. "Flag" would read better as "Important" or "Starred"
+
+**Observed (user, 2026-08-09):** "Flagged to be renamed as 'Important' or
+'Starred', with a ⭐ as icon."
+
+**Cause.** Naming, not a defect. The action is created as `tr("&Flag")` at
+`src/mainwindow.cpp:684` and applies the tag through
+`tagSelected({ QStringLiteral("flagged") }, {}, tr("Flag"))` at
+`src/mainwindow.cpp:686`, the second `tr("Flag")` being the undo-stack
+description the user sees in the Undo entry.
+
+**The rename must not reach the tag.** `flagged` is a notmuch tag, and notmuch
+tags are wire format: `src/types.h:37` tests for it, `src/tagcolors.cpp:31`
+colours it, `src/threadlistmodel.cpp:145` lists it among the tags a row shows
+another way, and the user's own `neomutt` and saved queries refer to it. Renaming
+the tag would rewrite the mail store and desynchronise every other tool. Only the
+**label** changes: the action text, the undo description, and any prose that says
+"flag".
+
+**The star already exists.** `ThreadListModel::flagGlyph()`
+(`src/threadlistmodel.cpp:62`) returns a solid star, with a `*` fallback when the
+system font cannot draw it, and the flag column already paints it
+(`src/threadlistmodel.cpp:213`). So the icon half of the note is shipped for the
+list; what is missing is an icon on the *action*, which is item 56's business.
+
+**Approach.** Pick one of "Important" or "Starred" and change the action text,
+the undo description, and the keyboard-shortcut reference entry. Ask the user
+which word: they offered two and the choice is theirs, and it should agree with
+whatever the icon depicts (a star suggests "Starred").
+
+**Constraints.**
+
+- Every changed string is inside `tr()` and must stay there.
+- The accelerator `&F` is taken from "Flag" and a new word needs a new one. The
+ Message menu currently holds `&Archive`, `&Delete`, `Mark &spam`, `Toggle
+ &unread`, `Mark all &read`, `Edit &tags`, `&Flag`
+ (`src/mainwindow.cpp:864-871`), so **"Important" can take `&I` freely, while
+ "Starred" collides with `Mark &spam` on `&S`** and would need a letter from
+ inside the word. A small argument for "Important".
+- `src/tagdialog.cpp:211` mentions `flagged` in a comment about token completion.
+ That is the tag, not a label, and must not be touched.
+
## Deferred, unsized, or split out
Items noted while triaging but not part of the original list. Same numbering