summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-06 15:07:10 +0200
committerDanilo M. <danix@danix.xyz>2026-09-06 15:07:10 +0200
commit5843f11f6809762aab52d37fbe54dd9b1792d00c (patch)
tree5ba8bc5681f553f472d20a850358ecab0db12d64
parent04c32f7c4eb5f72247af9963fa3debdbf6eb8911 (diff)
downloadqtmaildir-5843f11f6809762aab52d37fbe54dd9b1792d00c.tar.gz
qtmaildir-5843f11f6809762aab52d37fbe54dd9b1792d00c.zip
docs: record Mark spam's absence from the message bar as item 190
The session's backlog reconcile against the user's notes found one entry with no item. Their spam note asks for two things and only the view half was recorded, as item 187: the other half asks for Mark spam on the message pane's bar, with an icon that signifies bad or evil. Verified before filing. The action exists and has since the first toolbar, reachable from the Message menu, the thread context menu and Ctrl+Shift+S, but refreshBarActions() fills the ordinary branch with reply, forward, flag, archive and delete, and item 189 added Star and Archive there without raising spam. It meets the bar's rule as it stands, being selection-scoped with an undo behind it. The icon is the same latent wrong choice item 189 found in flag: mail-mark-junk was picked 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. Paired with item 187, which changes what the action does, so the entry records why the two want thinking about together and leaves the ordering to the user. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jq9gXquUo9W4KXDagJXMmn
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md64
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