summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp25
-rw-r--r--src/mainwindow.h24
2 files changed, 49 insertions, 0 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index eb8f4c6..df7062d 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -4215,6 +4215,25 @@ void MainWindow::onThreadSelected(const QModelIndex &current,
Q_ARG(quint64, m_generation));
}
+void MainWindow::refreshDashboardDigest()
+{
+ // Not showing a conversation: the ordinary case, and nothing to refresh.
+ if (m_dashboardThreadId.isEmpty() || !m_messageView->showingDashboard())
+ return;
+
+ // No placeholder digest here, unlike the selection path: the pane is
+ // already showing this conversation, and blanking it to re-fill it would
+ // flicker the whole dashboard for a change to one number.
+ //
+ // Its own generation, bumped like any other request so a reply that
+ // arrives after the user has moved on is discarded by the guards in
+ // onThreadDigestLoaded().
+ ++m_digestGeneration;
+ QMetaObject::invokeMethod(m_worker, "loadThreadDigest", Qt::QueuedConnection,
+ Q_ARG(QString, m_dashboardThreadId),
+ Q_ARG(quint64, m_digestGeneration));
+}
+
void MainWindow::onThreadDigestLoaded(const ThreadDigest &digest,
quint64 generation)
{
@@ -4710,6 +4729,12 @@ void MainWindow::onTagsApplied(const TagChange &change)
m_pendingChange = {};
m_pendingThreadIds.clear();
+ // Item 181. HERE, where a write is CONFIRMED, and not where one is sent:
+ // the digest is rebuilt from the INDEX, so a refresh queued beside the
+ // write would race it and answer from the state before it. The dashboard
+ // covers every write for the same reason the indicator below does.
+ refreshDashboardDigest();
+
// Item 176. The ids the worker reports are the ones whose tags really
// moved, which is what the undo entry has to invert. Inverting the REQUEST
// instead turned the undo of "mark 44 read" into "mark 44 unread": 2
diff --git a/src/mainwindow.h b/src/mainwindow.h
index d7579f4..1f68733 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -645,6 +645,30 @@ private slots:
/// has moved off, or one that arrives once the pane is showing a message,
/// must not repaint anything.
void onThreadDigestLoaded(const ThreadDigest &digest, quint64 generation);
+
+ /// Re-asks the worker for the dashboard's digest, after a write that may
+ /// have changed what it draws.
+ ///
+ /// Item 181. The digest is built from the INDEX by the worker and arrived
+ /// only when a conversation was selected, so a tag write moved the model
+ /// and the card and left the pane reporting the unread count the
+ /// conversation had when it was opened. Reachable from the dashboard's own
+ /// Mark all read button, where the number sits directly above the button
+ /// that fails to move it.
+ ///
+ /// Called from BOTH write funnels, per the rule that every path a
+ /// thread-scoped write travels a message-scoped one travels too. It is
+ /// deliberately not narrowed to the writes that change what the dashboard
+ /// happens to draw today: that list is one the dashboard can outgrow
+ /// silently, and this costs a round trip only while a conversation is on
+ /// screen.
+ ///
+ /// Does nothing when the pane is not showing a dashboard, which is the
+ /// ordinary case. Re-requests rather than editing the digest in place: the
+ /// digest is a derived summary (senders, buckets, timestamps, the unread
+ /// list and its cap), and reproducing that arithmetic here would be a
+ /// second place that has to agree with the worker about what a write did.
+ void refreshDashboardDigest();
void onWorkerError(const QString &message);
void onSyncFinished(bool success, int exitCode);