From e807ad990841e74900304697c7267926995ea203 Mon Sep 17 00:00:00 2001 From: James Graham Date: Sun, 31 Dec 2023 17:47:27 +0000 Subject: [PATCH] Improve the unread marker behaviour The fixes include: - improving the timer to make it more reliable - making sure a read marker is added when changin rooms, this is needed when the messages have already been loaded. - increase the default timer to 10s to avoid the read marker disappearing and being re-added when a message arrive in quick succession. BUG: 465300 --- src/models/messageeventmodel.cpp | 6 ++++++ src/qml/TimelineView.qml | 23 ++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/models/messageeventmodel.cpp b/src/models/messageeventmodel.cpp index 851ca8d3a..69f2a5e49 100644 --- a/src/models/messageeventmodel.cpp +++ b/src/models/messageeventmodel.cpp @@ -253,6 +253,12 @@ void MessageEventModel::setRoom(NeoChatRoom *room) lastReadEventId.clear(); } endResetModel(); + + // After reset put a read marker in if required. + // This is needed when changing back to a room that has already loaded messages. + if (room) { + moveReadMarker(m_currentRoom->lastFullyReadEventId()); + } } int MessageEventModel::refreshEvent(const QString &eventId) diff --git a/src/qml/TimelineView.qml b/src/qml/TimelineView.qml index 239bb228a..32f3d7a01 100644 --- a/src/qml/TimelineView.qml +++ b/src/qml/TimelineView.qml @@ -102,6 +102,7 @@ QQC2.ScrollView { interval: 1000 onTriggered: { root.roomChanging = false + markReadIfVisibleTimer.reset() } } onAtYEndChanged: if (!root.roomChanging) { @@ -273,19 +274,19 @@ QQC2.ScrollView { target: root.timelineModel function onRowsInserted() { - markReadIfVisibleTimer.restart() + markReadIfVisibleTimer.reset() } } Timer { id: markReadIfVisibleTimer - interval: 1000 - onTriggered: { - if (loading || !root.currentRoom.readMarkerLoaded || !applicationWindow().active) { - restart() - } else { - messageListView.markReadIfVisible() - } + running: messageListView.allUnreadVisible() && applicationWindow().active && (root.currentRoom.timelineSize > 0 || root.currentRoom.allHistoryLoaded) + interval: 10000 + onTriggered: root.currentRoom.markAllMessagesAsRead() + + function reset() { + restart() + running = Qt.binding(function() { return messageListView.allUnreadVisible() && applicationWindow().active && (root.currentRoom.timelineSize > 0 || root.currentRoom.allHistoryLoaded) }) } } @@ -364,12 +365,12 @@ QQC2.ScrollView { return index; } - // Mark all messages as read if all unread messages are visible to the user - function markReadIfVisible() { + function allUnreadVisible() { let readMarkerRow = eventToIndex(root.currentRoom.readMarkerEventId) if (readMarkerRow >= 0 && readMarkerRow < firstVisibleIndex() && messageListView.atYEnd) { - root.currentRoom.markAllMessagesAsRead() + return true } + return false } function setHoverActionsToDelegate(delegate) {