From 852edb4affbe89c7b2772fe30392dfdec27b2b94 Mon Sep 17 00:00:00 2001
From: Loren Burkholder <computersemiexpert@outlook.com>
Date: Sat, 22 Jul 2023 14:52:34 -0400
Subject: [PATCH] Add mark as read entry to the roomlist right-click menu

---
 resources/qml/RoomList.qml     |  5 +++++
 src/timeline/TimelineModel.cpp | 17 +++++++++++++++--
 src/timeline/TimelineModel.h   |  2 ++
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index 92e7ef6db..20e5b95bf 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -726,6 +726,11 @@ Page {
                     destroyOnClose(roomWindow);
                 }
             }
+            Platform.MenuItem {
+                text: qsTr("Mark as read")
+                onTriggered: Rooms.getRoomById(roomContextMenu.roomid).markRoomAsRead()
+            }
+
             Platform.MenuItem {
                 text: qsTr("Room settings")
 
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 752aedb08..fddd57006 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -1283,14 +1283,21 @@ TimelineModel::updateLastMessage()
 
 void
 TimelineModel::setCurrentIndex(int index)
+{
+    setCurrentIndex(index, false);
+}
+
+void
+TimelineModel::setCurrentIndex(int index, bool ignoreInactiveState)
 {
     auto oldIndex = idToIndex(currentId);
     currentId     = indexToId(index);
     if (index != oldIndex)
         emit currentIndexChanged(index);
 
-    if (!QGuiApplication::focusWindow() || !QGuiApplication::focusWindow()->isActive() ||
-        MainWindow::instance()->windowForRoom(roomId()) != QGuiApplication::focusWindow())
+    if (!ignoreInactiveState &&
+        (!QGuiApplication::focusWindow() || !QGuiApplication::focusWindow()->isActive() ||
+         MainWindow::instance()->windowForRoom(roomId()) != QGuiApplication::focusWindow()))
         return;
 
     if (!currentId.startsWith('m')) {
@@ -1561,6 +1568,12 @@ TimelineModel::markEventsAsRead(const std::vector<QString> &event_ids)
     }
 }
 
+void
+TimelineModel::markRoomAsRead()
+{
+    setCurrentIndex(0, true);
+}
+
 void
 TimelineModel::updateLastReadId(const QString &currentRoomId)
 {
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index fd1a43960..649419202 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -386,9 +386,11 @@ public:
 
 public slots:
     void setCurrentIndex(int index);
+    void setCurrentIndex(int index, bool ignoreInactiveState);
     int currentIndex() const { return idToIndex(currentId); }
     void eventShown();
     void markEventsAsRead(const std::vector<QString> &event_ids);
+    void markRoomAsRead();
     void updateLastReadId(const QString &currentRoomId);
     void lastReadIdOnWindowFocus();
     void checkAfterFetch();
-- 
GitLab