diff options
Diffstat (limited to 'docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md')
| -rw-r--r-- | docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md | 64 |
1 files changed, 64 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 32888a2..8c55aad 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 @@ -263,6 +263,7 @@ taking that too literally. | 187 | There is no Spam view beside Trash | workflow | M | open, 2026-08-29, from the notes; **shape settled 2026-08-29** after two corrections and three decisions from the user. Spam works like Trash: path-based, a mandatory per-account `spam` key, and Mark spam MOVES the file. Every account can now reach a spam folder, the three Gmail ones having gained `[Gmail]/Spam` in `.mbsyncrc` this session. Grew from S to M: the move path, the origin tag and a cleanup pass are three parts, and it changes what an existing action does. See the entry | | 188 | Does Empty trash respect the account selector? | question | XS | **answered 2026-08-29** by reading the code, no work needed. It does: `MainWindow::emptyTrash()` (`mainwindow.cpp:6567`) reads `m_accountBox->currentData()` and uses `allTrashQuery()` only for All accounts, and the confirmation names which. Recorded so the notes' question has an answer rather than sitting open | | 189 | The message bar carries only Reply, Forward and Delete | presentation | S | **done 2026-08-29**, unreleased. Star and Archive joined the bar's ordinary branch, Archive leaving the main toolbar as Delete did. `mark_all_read` deliberately did NOT move, at the user's decision: it is the one action that ignores the selection. Item 140's toolbar test listed `archive` as a list-wide action and had to be corrected, which is the classification this item changed. Section in the closed file. Original entry: Asks for Star (`flag`) and Archive on the bar, and raises Mark all read as a question. Two of the three are selection-scoped and fit the bar's rule as it stands; **`mark_all_read` does not**, since it deliberately ignores the selection and acts on every row in the view, which is the one action in the window that does. Needs a decision from the user on that one and on whether Archive LEAVES the main toolbar the way Delete did | +| 190 | Mark spam is not on the message bar, and its icon was never chosen for one | presentation | XS | open, 2026-09-06, from the notes. The bar's ordinary branch carries Reply, Forward, Star, Archive, Delete after item 189 and `spam` is not among them, though it meets the bar's rule (selection-scoped, undoable). Two halves: put it on the bar, and settle the icon, which the note asks to be "a bug, or a skull, or something that signifies bad/evil" and which is `mail-mark-junk` today, chosen for a menu where the label carries the meaning. **Paired with 187**, which changes what the action DOES (moves the file); ordering is the user's call | Sizes are rough: XS under an hour, S a sitting, M a session. @@ -907,6 +908,69 @@ composer window and do not touch `KeyMap`, so nothing here interacts with item assert the current spec behaviour and would be replaced rather than extended. +--- + +## 190. Mark spam is not on the message bar, and its icon was never chosen for one + +**Observed (user, from the notes):** "add \"mark as spam\" to the message pane +toolbar. Use a bug as the icon (or a skull, or something that signifies +bad/evil)." + +**Cause, verified in the code.** Two independent halves, and neither is a +regression. + +The action exists and has since the first toolbar: `addAction("spam", tr("Mark +&spam"), ...)` at `mainwindow.cpp:1768` writes `spam` and removes `inbox` +through `tagSelected()`. It is reachable from the Message menu +(`mainwindow.cpp:2062`) and the thread context menu (`:2223`), and it carries a +shortcut, `Ctrl+Shift+S` (`keymap.cpp:151`). What it has never been on is the +message pane's own bar: `refreshBarActions()` fills the ordinary branch with +exactly `reply`, `forward`, `flag`, `archive`, `delete` (`mainwindow.cpp:2387`), +and item 189 added Star and Archive there without raising spam. + +It meets the bar's rule as it stands. The bar carries selection-scoped actions +with an undo behind them, which is why `mark_all_read` was kept off it under +item 189 and why Star and Archive were let on. `spam` is a `tagSelected()` call +like those two, so it qualifies on both counts today. + +The icon is the second half and is the same latent wrong choice item 189 found +in `flag`. `{ "spam", "mail-mark-junk" }` (`mainwindow.cpp:2144`) was chosen for +a MENU, where the label carries the meaning and the icon only decorates it. On +an icon-only bar the icon IS the control, which is what made Breeze's +exclamation-mark rendering of `mail-mark-important` a defect rather than a +preference. Whether `mail-mark-junk` reads as "bad/evil" on the user's theme is +a question only the user can answer by looking, and the note suggests it does +not. + +**Approach.** Add `spam` to the ordinary branch of `refreshBarActions()`. Order +is a decision, not a detail: the bar reads answer, then file, then destroy, and +spam is a filing act whose destination is hostile, so it belongs with Archive +rather than beside Delete or before Star. For the icon, offer the user the +theme names that exist rather than picking one unseen; a shipped SVG under +`assets/icons/marks/` is the fallback if no theme name reads right, but that is +the panes' convention and the bar is chrome (item 70), so it is a last resort +rather than a first move. + +**Constraints.** + +- **The trash branch must not gain it.** `everySelectedRowIsInATrashFolder()` + swaps the bar to Restore, Delete permanently and Empty trash (item 185); + marking already-trashed mail as spam is not an act the user asked for, and the + same question item 187 flags applies here from the other side. +- **The icon table forbids duplicates** for any action that can reach the + toolbar, by the test item 140 established. `mail-mark-junk` is unique today + and any replacement must stay so. +- **Item 187 changes what this action does**, from a tag write to a file move + with an origin tag. Doing 190 first puts a button on the bar whose behaviour + then changes underneath it; doing 187 first means the button arrives already + correct. Neither ordering is wrong and the user chooses, but they should not + be built in ignorance of each other. + +**Verification.** The bar's contents are a list in one function, so an assertion +on it is measurable and belongs in the same test item 189 corrected. The icon is +a visual judgement and belongs to the user, per the rule in `CLAUDE.md`: hand it +over and let them look. + ## Deferred, unsized, or split out Items noted while triaging but not part of the original list. Same numbering |
