aboutsummaryrefslogtreecommitdiffstats
path: root/src/notmuchworker.h
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-08 11:13:10 +0200
committerDanilo M. <danix@danix.xyz>2026-08-08 11:13:10 +0200
commit0bbb2d2c8d75c2b4392b17214ec3ec3768305ba1 (patch)
tree9fa18a3b8ca4248c44f75ad2fed9532b135674c7 /src/notmuchworker.h
parentccd19bc04d73f802b4800aadb27a1de4d6f0ee0d (diff)
downloadqtmaildir-0bbb2d2c8d75c2b4392b17214ec3ec3768305ba1.tar.gz
qtmaildir-0bbb2d2c8d75c2b4392b17214ec3ec3768305ba1.zip
feat(ui): render a single message when its row is selected
loadMessage queries by id: and returns one MessageRef, always matched, since the user asked for that message by clicking its row and a stub would answer the wrong question. An unknown id emits an empty vector rather than an error: a stale row after a reindex is an ordinary race, not a failure worth the status bar. The signal fires even when empty so the UI handler runs instead of waiting for a reply that never comes. The branch in onThreadSelected is placed BEFORE threadAt(), which is the whole trap. threadAt takes a top-level row number and a child's row number indexes its siblings, so handing a message row's number to it loads whichever thread happens to sit at that position. Mutation-checked: with the branch disabled the test reports thread 't1' for a reply belonging to 't2', a wrong answer plausible enough to survive review. m_currentMessageId and m_currentThreadId are mutually exclusive and each clears the other, so a queued reply can tell which kind of selection it belongs to. onMessageLoaded carries a third guard onThreadLoaded does not need: a reply landing after the selection moved to a thread row would render one message where the conversation belongs. No mark-read timer for a message row in this pass. Marking one message of a thread read is a per-message tag write and the pending-edit map is keyed by thread; item 28 is the record of what happens when that count goes wrong.
Diffstat (limited to 'src/notmuchworker.h')
-rw-r--r--src/notmuchworker.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/notmuchworker.h b/src/notmuchworker.h
index 99cad04..df1799d 100644
--- a/src/notmuchworker.h
+++ b/src/notmuchworker.h
@@ -70,6 +70,13 @@ public slots:
void loadThreadTree(const QString &threadId, const QString &matchQuery,
quint64 generation);
+ /// Loads ONE message, for a message row selected in the list.
+ ///
+ /// Emits messageLoaded with an empty vector when the id is unknown, which
+ /// is an ordinary race after a reindex rather than an error worth
+ /// reporting.
+ void loadMessage(const QString &messageId, quint64 generation);
+
/// Applies tag changes. Opens the database read-write, applies, and closes
/// immediately: notmuch's write lock is exclusive process-wide, so holding
/// it would block the user's cron `notmuch new`.
@@ -117,6 +124,7 @@ signals:
void threadLoaded(const QVector<MessageRef> &messages, quint64 generation);
void threadTreeLoaded(const QVector<MessageNode> &nodes,
quint64 generation);
+ void messageLoaded(const QVector<MessageRef> &messages, quint64 generation);
void tagsApplied(const TagChange &change);
void allTagsReady(const QStringList &tags, quint64 generation);