From 05955c43deda9535f9d53b649fa4bbafa3411e25 Mon Sep 17 00:00:00 2001 From: Tobias Fella Date: Wed, 9 Dec 2020 23:26:26 +0100 Subject: [PATCH] Improve read markers by fixing detection of first and last visible event and updating event markers on new messages Fixes #60 --- imports/NeoChat/Page/RoomPage.qml | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/imports/NeoChat/Page/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml index d70870e38..a15641e65 100644 --- a/imports/NeoChat/Page/RoomPage.qml +++ b/imports/NeoChat/Page/RoomPage.qml @@ -98,18 +98,24 @@ Kirigami.ScrollablePage { model: !isLoaded ? undefined : sortedMessageEventModel - onContentYChanged: { + onContentYChanged: updateReadMarker() + onCountChanged: updateReadMarker() + + function updateReadMarker() { if(!noNeedMoreContent && contentY - 5000 < originY) currentRoom.getPreviousContent(20); const index = eventToIndex(currentRoom.readMarkerEventId) - if(index === -1) + if(index === -1) { return - if(firstVisibleIndex() === -1 || lastVisibleIndex() === -1) + } + if(firstVisibleIndex() === -1 || lastVisibleIndex() === -1) { return + } if(index < firstVisibleIndex() && index > lastVisibleIndex()) { currentRoom.readMarkerEventId = sortedMessageEventModel.data(sortedMessageEventModel.index(lastVisibleIndex(), 0), MessageEventModel.EventIdRole) } } + MessageEventModel { id: messageEventModel @@ -540,12 +546,24 @@ Kirigami.ScrollablePage { function firstVisibleIndex() { let center = messageListView.x + messageListView.width / 2; - return messageListView.indexAt(center, messageListView.y + messageListView.contentY); + let index = -1 + let i = 0 + while(index === -1 && i < 100) { + index = messageListView.indexAt(center, messageListView.y + messageListView.contentY + i); + i++; + } + return index } function lastVisibleIndex() { let center = messageListView.x + messageListView.width / 2; - return messageListView.indexAt(center, messageListView.y + messageListView.contentY + messageListView.height); + let index = -1 + let i = 0 + while(index === -1 && i < 100) { + index = messageListView.indexAt(center, messageListView.y + messageListView.contentY + messageListView.height - i); + i++ + } + return index; } function openMessageContext(author, message, eventId, toolTip, model) {