aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-14 12:28:49 +0200
committerDanilo M. <danix@danix.xyz>2026-08-14 12:28:49 +0200
commit183ed3f087146614270fb0253374aa94aa9e4775 (patch)
treed95e5e877a9f5fede40e5003e8205eddd6b5e43b /docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
parent74c1b90e287d5128249ec0e3390123a7147e8659 (diff)
downloadqtmaildir-183ed3f087146614270fb0253374aa94aa9e4775.tar.gz
qtmaildir-183ed3f087146614270fb0253374aa94aa9e4775.zip
docs: design searching from the message pane as item 85
Item 78 asked for a tagging rule built from something visible in a message. Brainstorming narrowed it: a saved query can already be promoted to a rule, so the road from "I see something interesting" to "a rule tags it" exists as search, save, promote. Searching is the missing step and the safe one, since a query costs nothing when it is wrong while a rule runs unattended against real mail. The search half splits out as item 85. Five surfaces gain a context menu with Search for this and Add to search: subject, date and From/To/Cc in the header, tag chips, body selection, and every header per message in the details dialog, which is rebuilt as rows rather than one text box. Item 78 stays open carrying the rule shortcut alone.
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.md40
1 files changed, 39 insertions, 1 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 ac830fa..f562e97 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
@@ -142,13 +142,14 @@ taking that too literally.
| 75 | The tagging rules window forgets its size and its column widths | persistence | S | **done** 2026-08-13, shipped in 0.17.0. The window-kind question is left open, see the closed-items file |
| 76 | Every field in the rules dialog is free text, so a rule is easy to get wrong | workflow | M | **done** 2026-08-13, shipped in 0.17.0. See `specs/2026-08-13-rule-builder-design.md` |
| 77 | No way to see what a rule would collect, in the thread list | workflow | S | **done** 2026-08-13, shipped in 0.17.0 |
-| 78 | No way to build a rule from something visible in a message | workflow | M | open; wants 76 first, so the created rule lands in a form that can hold it |
+| 78 | No way to build a rule from something visible in a message | workflow | M | open, narrowed 2026-08-14; the search half split out as item 85, which is the road a rule is made from. Revisit once 85 has been used |
| 80 | A rule with many conditions squeezes the rule list to one visible row | defect | XS | **done** 2026-08-13, shipped in 0.17.0. Follows item 76 |
| 79 | Opening the rules dialog and saving destroys the first rule | defect | XS | **fixed on `rule-builder`** 2026-08-13, unreleased. Shipped in 0.16.0; damaged one real rule, repaired by hand |
| 81 | No way to turn a saved query into a tagging rule | workflow | S | **done** 2026-08-14, unreleased; see `specs/2026-08-14-query-to-rule-design.md` |
| 82 | A saved query cannot be edited, unpinned or deleted from the UI | defect | S | **done** 2026-08-13, shipped in 0.18.0. Right-click offers Edit, Pin/Unpin and Delete |
| 83 | A rule named with spaces is written to the file and dropped by every reader | defect | S | **done** 2026-08-14, unreleased. The name is sanitised into an id, save validates, a bad id loads for repair |
| 84 | A config problem blocks `test_mainwindow` on a modal nobody can dismiss | testing | S | open; measured 2026-08-14, `showWarnings()` calls `QMessageBox::warning` from the constructor |
+| 85 | Nothing on screen can be searched for by right-clicking it | workflow | M | open; designed 2026-08-14, see `specs/2026-08-14-search-from-message-design.md`. Split from 78; rebuilds the details dialog as rows |
Sizes are rough: XS under an hour, S a sitting, M a session.
@@ -557,6 +558,43 @@ here.
**Size: S.** The diagnosis is the expensive part and it is already done.
+## 85. Nothing on screen can be searched for by right-clicking it
+
+**Observed (2026-08-14).** The user asked, while discussing item 78, to be able
+to right-click a sender, a subject, a date, a tag chip or a piece of selected
+body text and be offered a search built from it, both replacing the query bar
+and narrowing what is already in it. The narrowing case is the one that decides
+the shape: a query returning a thousand threads is refined by adding a second
+condition, and today that means retyping a query the user never typed.
+
+**Cause.** Not a defect, unbuilt. `MessageView` has no context menu on any
+surface, and `TagStrip` paints chips with no hit test and no signals.
+
+**Approach.** Designed 2026-08-14. **Read
+`specs/2026-08-14-search-from-message-design.md` rather than planning from this
+entry.**
+
+Three constraints decide whether to open the spec. **This is search only, and
+that is the point**: item 78's rule shortcut is deliberately left out, because a
+saved query can already be promoted to a rule and searching is the missing step
+on that road, as well as the safe one. **The details dialog is rebuilt as rows**,
+which the user wanted anyway, and its value labels must stay explicitly
+`Qt::PlainText`: the current `QPlainTextEdit` is a deliberate protection against
+markup in header values that come from strangers. And **Add to search
+parenthesises both sides**, because the bar may hold a hand-written `or` and
+`a or b AND c` binds the wrong way, silently widening a search meant to narrow.
+
+**Constraints.** The thread list is out of scope and the reason is worth
+keeping: a row's `authors` comes from `notmuch_thread_get_authors` and is a
+display summary reading `Alice, Bob`, so a `from:` built from it matches
+nothing. Item 78's own approach line assumed otherwise.
+
+A mis-quoted query is not an error to notmuch, it matches zero, so the quoting
+helper is tested against the constructed string rather than against a provoked
+failure.
+
+**Size: M.**
+
## Deferred, unsized, or split out
Items noted while triaging but not part of the original list. Same numbering