diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-04 10:39:47 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-04 12:54:41 +0200 |
| commit | f762e4ca0051a7a34123b5a526696f2feb5c6e03 (patch) | |
| tree | af4f3932946ae8937dd8f81ddaf95686e37105ca /README.md | |
| parent | 1a8fdb48140cb40243bd46bff94d39f610d70ef3 (diff) | |
| download | qtmaildir-f762e4ca0051a7a34123b5a526696f2feb5c6e03.tar.gz qtmaildir-f762e4ca0051a7a34123b5a526696f2feb5c6e03.zip | |
feat(message): show From/To/Cc and add a details dialog
MimeParser has filled To and Cc all along and HtmlBuilder simply never
interpolated them, so both were parsed on every message and then
discarded. The header strip showed the subject and a message count and
nothing else, which is item 2 of the usability backlog.
The header now adapts to what it can say honestly. A thread holding one
message shows From, To and Cc under the subject, where every field is
unambiguous. A thread holding several keeps showing the subject and the
count alone: the recipient differs message to message, and once the user
has replied there is no single address the thread is addressed to, so
naming one would be a guess presented as a fact. Per-message detail is
what the dialog is for.
That dialog lists Subject, From, To, Cc, Date and Message-Id for every
message, numbered when there is more than one, in a read-only plain-text
widget. Plain text is the security decision, not a stylistic one: these
values come from strangers and the dialog exists to show them verbatim,
so the format that cannot interpret markup is the right one. The header
label is RichText and every value interpolated into it is escaped, since
an unescaped From injects into the application's own chrome rather than
into the sandboxed page.
Reached by a Details... button beside the subject and by Ctrl+Shift+D.
Both, because a shortcut alone restates the complaint this backlog opened
with. The binding is shifted because Ctrl+D is delete, and the
destructive action keeps the key it already had rather than being moved
to make room.
An empty Cc omits its row instead of printing a label with nothing after
it. Both header shapes were rendered to PNG and inspected, not only
asserted.
The new button also exposed a latent flaw in an older test:
attachmentButtonLabels() identified attachment buttons by excluding the
one other button's label, so it counted the details button as an
attachment as soon as one existed. It now finds the bar by object name
and reads only its children.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -237,6 +237,18 @@ an attachment, so it is visible without opening the thread. It comes from the `attachment` tag notmuch applies while indexing, not from parsing the message, and costs no extra query. +## Message details + +The strip above the message pane says what it can say without guessing. A +thread holding **one message** shows its From, To and Cc under the subject. +A thread holding **several** shows the subject and the message count only: +From, To and Cc differ from message to message, and once you have replied there +is no single recipient the thread is addressed to, so naming one would be a +guess dressed as a fact. + +The **Details...** button beside the subject, or `Ctrl+Shift+D`, opens the full +headers of every message in the thread, numbered, as read-only plain text. + Under the message pane, one **Attachments (N)** button opens a list of the thread's attachments: which message each came from, its filename and its size, with a **Save** for each. With more than one, **Save all** writes them into a @@ -272,6 +284,7 @@ Defaults, all rebindable through `[keys]`: | `Ctrl+Space` | `complete_query` | Focus the query bar and offer completions | | `Ctrl+H` | `toggle_html` | Switch the thread between HTML and plain text | | `Ctrl+M` | `load_remote` | Load remote images for the current thread | +| `Ctrl+Shift+D` | `message_details` | Show the full headers of every message in the thread | | `Ctrl+Z` | `undo` | Undo the last tag change | | `Ctrl+G` | `sync` | Run the configured sync command | | `Ctrl+Q` | `quit` | Quit | |
