diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-07 12:03:14 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-07 12:03:14 +0200 |
| commit | 5a4d8f5f021dc98b2a7cc471125aa3040c02675c (patch) | |
| tree | 181eccf726124f39ae6a1c14734cfa18ac42ed9f /CHANGELOG.md | |
| parent | 0a9ef3c77c7c593f3568f25761aad5d1f55e0e33 (diff) | |
| download | qtmaildir-5a4d8f5f021dc98b2a7cc471125aa3040c02675c.tar.gz qtmaildir-5a4d8f5f021dc98b2a7cc471125aa3040c02675c.zip | |
feat(tags): mark every thread in the view read, in one undoable step
An action removing "unread" from every thread in the current view,
on the toolbar, the Message menu and Ctrl+Shift+U. It deliberately
ignores the selection, which makes it the one action in the window
that does, and it routes through the same funnel as every other tag
change, so it is one write rather than one per thread.
Disabled until the query reports its total. Threads arrive in batches,
so before then the model holds only what has landed, and an action
saying "all" must not silently skip the rest. A greyed control says
"not yet" without needing a dialog or a stall the user cannot see.
The state is also set at registration, since QAction starts enabled
and a window that has not run a query has nothing to act on.
Two things came out differently from the plan, both forced by existing
code. It carries a default binding, because everyActionHasAShortcut
requires every registered action to have one: an unbound action is
unreachable from the keyboard, and that invariant is deliberate, so the
action was given Ctrl+Shift+U rather than the invariant relaxed. And
only the threads that are actually unread are sent, because sending the
rest would inflate the pending-edit count with writes that change
nothing, and the quit prompt reads that count. A view with nothing
unread does nothing, pushes no command and says so: an undo entry that
restores nothing is worse than none, since it absorbs a Ctrl+Z meant
for the previous action.
undoDepthForTesting() is new and exists for a reason worth recording:
undo->isEnabled() cannot answer "was a command pushed", because the
undo QAction is always enabled and tests canUndo() when triggered. The
first version of the no-op test asserted on it and passed against a
mutant with the unread filter removed.
Closes item 43.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'CHANGELOG.md')
| -rw-r--r-- | CHANGELOG.md | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fb7650..94ae6c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,39 @@ point at which they are stable. ## [Unreleased] +### Added + +- **Mark all read**, on the toolbar, the Message menu and `Ctrl+Shift+U`. It + acts on every thread in the current view rather than the selection, as one + write and one undo entry, so a single `Ctrl+Z` puts back a view of 400 + threads. It stays disabled until the query has reported its total: threads + arrive in batches, and an action that says "all" must not run against + whatever happened to have loaded. A view with nothing unread does nothing and + says so, rather than pushing an undo entry that restores nothing. +- **The status bar says which account is syncing**, then that notmuch is + reindexing, instead of "Syncing..." for the whole run. The account name and + the progress both come from mbsync's own output as it streams. + +### Changed + +- **The sync script runs `mbsync -V`.** Without it mbsync prints nothing at all + until it exits, then a single summary line, so a run of over a minute was + silent and there was nothing for the status bar to report. This is not a + buffering problem and `stdbuf` does not help. + +### Fixed + +- **A message whose HTML body carries a `Content-Id` renders**, instead of + opening blank with the app reporting no HTML part. A content id makes a part + referenceable, not undisplayable, and setting one on the body is legal and + common in bulk-sender output. +- **Removing a tag suggests only the tags the selected threads carry**, rather + than every tag in the database. Adding still reaches the whole vocabulary, + since naming a tag that does not exist yet is what that field is for. +- **A sync that finishes quickly no longer loses its own progress.** The + per-run reset happened after the process launched, so a run that delivered + its output before control returned wiped the state those lines had produced. + ## [0.10.0] - 2026-08-06 Tag edits no longer stall the window when a background sync is running, and |
