summaryrefslogtreecommitdiffstats
path: root/src/mainwindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainwindow.h')
-rw-r--r--src/mainwindow.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 65f9636..0eea164 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -39,6 +39,7 @@ class QPushButton;
class QComboBox;
class QPlainTextEdit;
class QSplitter;
+class QTimer;
class ThreadListModel;
class MessageView;
@@ -117,6 +118,15 @@ private:
void tagSelected(const QStringList &add, const QStringList &remove,
const QString &description);
+ /// Starts, restarts or cancels the mark-read timer for a newly opened
+ /// thread. Cancels outright for a thread that is not unread, so an already
+ /// read thread never schedules a write that would change nothing.
+ void scheduleMarkRead(const ThreadSummary &thread);
+
+ /// Removes `unread` from the thread the timer was armed for, if it is still
+ /// the one on screen.
+ void markCurrentThreadRead();
+
/// Sends a tag change for a set of threads without touching the undo stack.
/// Both tagSelected() and ThreadTagCommand route through this.
void sendThreadTagChange(const QStringList &threadIds,
@@ -168,6 +178,18 @@ private:
QString m_lastQuery;
QString m_currentThreadId;
+ /// Marks the open thread read once it has been on screen long enough.
+ ///
+ /// Single-shot and RESTARTED on every selection change, never stacked:
+ /// arrowing down a list must mark only the thread still selected when it
+ /// fires, not each one passed through.
+ QTimer *m_markReadTimer = nullptr;
+
+ /// The thread m_markReadTimer will mark read. Compared against the current
+ /// selection when it fires, so a timer that outlives its thread does
+ /// nothing rather than marking the wrong one.
+ QString m_markReadThreadId;
+
/// The optimistic update awaiting confirmation, kept so a worker error can
/// put the model back. Only the most recent one: mutations are sent from
/// the UI thread one user action at a time.