Improve read markers by fixing detection of first and last visible event and updating event markers on new messages
Fixes #60
This commit is contained in:
@@ -98,18 +98,24 @@ Kirigami.ScrollablePage {
|
|||||||
|
|
||||||
model: !isLoaded ? undefined : sortedMessageEventModel
|
model: !isLoaded ? undefined : sortedMessageEventModel
|
||||||
|
|
||||||
onContentYChanged: {
|
onContentYChanged: updateReadMarker()
|
||||||
|
onCountChanged: updateReadMarker()
|
||||||
|
|
||||||
|
function updateReadMarker() {
|
||||||
if(!noNeedMoreContent && contentY - 5000 < originY)
|
if(!noNeedMoreContent && contentY - 5000 < originY)
|
||||||
currentRoom.getPreviousContent(20);
|
currentRoom.getPreviousContent(20);
|
||||||
const index = eventToIndex(currentRoom.readMarkerEventId)
|
const index = eventToIndex(currentRoom.readMarkerEventId)
|
||||||
if(index === -1)
|
if(index === -1) {
|
||||||
return
|
return
|
||||||
if(firstVisibleIndex() === -1 || lastVisibleIndex() === -1)
|
}
|
||||||
|
if(firstVisibleIndex() === -1 || lastVisibleIndex() === -1) {
|
||||||
return
|
return
|
||||||
|
}
|
||||||
if(index < firstVisibleIndex() && index > lastVisibleIndex()) {
|
if(index < firstVisibleIndex() && index > lastVisibleIndex()) {
|
||||||
currentRoom.readMarkerEventId = sortedMessageEventModel.data(sortedMessageEventModel.index(lastVisibleIndex(), 0), MessageEventModel.EventIdRole)
|
currentRoom.readMarkerEventId = sortedMessageEventModel.data(sortedMessageEventModel.index(lastVisibleIndex(), 0), MessageEventModel.EventIdRole)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageEventModel {
|
MessageEventModel {
|
||||||
id: messageEventModel
|
id: messageEventModel
|
||||||
|
|
||||||
@@ -540,12 +546,24 @@ Kirigami.ScrollablePage {
|
|||||||
|
|
||||||
function firstVisibleIndex() {
|
function firstVisibleIndex() {
|
||||||
let center = messageListView.x + messageListView.width / 2;
|
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() {
|
function lastVisibleIndex() {
|
||||||
let center = messageListView.x + messageListView.width / 2;
|
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) {
|
function openMessageContext(author, message, eventId, toolTip, model) {
|
||||||
|
|||||||
Reference in New Issue
Block a user