diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mainwindow.cpp | 25 | ||||
| -rw-r--r-- | src/mainwindow.h | 24 |
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 ¤t, 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); |
