Improve the behaviour of jump to last unread message.

Improve the behaviour of jump to last unread message. The view will now jump as high as possible if the last unread message isn't loaded. This at least triggers more items to load which will eventually get the user to the last unread message.
This commit is contained in:
James Graham
2024-05-24 07:55:05 +00:00
parent 415cfd57e7
commit c9ddd9d513
3 changed files with 20 additions and 10 deletions

View File

@@ -69,7 +69,7 @@ NeoChatRoom::NeoChatRoom(Connection *connection, QString roomId, JoinState joinS
setHasFileUploading(false); setHasFileUploading(false);
}); });
connect(this, &Room::aboutToAddHistoricalMessages, this, &NeoChatRoom::readMarkerLoadedChanged); connect(this, &Room::addedMessages, this, &NeoChatRoom::readMarkerLoadedChanged);
const auto &roomLastMessageProvider = RoomLastMessageProvider::self(); const auto &roomLastMessageProvider = RoomLastMessageProvider::self();

View File

@@ -190,12 +190,15 @@ QQC2.ScrollView {
implicitHeight: Kirigami.Units.gridUnit * 2 implicitHeight: Kirigami.Units.gridUnit * 2
z: 2 z: 2
visible: root.currentRoom && root.currentRoom.hasUnreadMessages && root.currentRoom.readMarkerLoaded visible: root.currentRoom && root.currentRoom.hasUnreadMessages
text: root.currentRoom.readMarkerLoaded ? i18n("Jump to first unread message") : i18n("Jump to oldest loaded message")
action: Kirigami.Action { action: Kirigami.Action {
onTriggered: { onTriggered: {
if (!Kirigami.Settings.isMobile) { if (!Kirigami.Settings.isMobile) {
root.focusChatBar(); root.focusChatBar();
} }
goReadMarkerFab.textChanged()
messageListView.goToEvent(root.currentRoom.readMarkerEventId); messageListView.goToEvent(root.currentRoom.readMarkerEventId);
} }
icon.name: "go-up" icon.name: "go-up"
@@ -203,7 +206,10 @@ QQC2.ScrollView {
} }
QQC2.ToolTip { QQC2.ToolTip {
text: i18n("Jump to first unread message") id: goReadMarkerFabTooltip
text: goReadMarkerFab.text
delay: Kirigami.Units.toolTipDelay
visible: goReadMarkerFab.hovered
} }
} }
KirigamiComponents.FloatingButton { KirigamiComponents.FloatingButton {
@@ -274,6 +280,10 @@ QQC2.ScrollView {
function goToEvent(eventID) { function goToEvent(eventID) {
const index = eventToIndex(eventID); const index = eventToIndex(eventID);
if (index == -1) {
messageListView.positionViewAtEnd();
return;
}
messageListView.positionViewAtIndex(index, ListView.Center); messageListView.positionViewAtIndex(index, ListView.Center);
itemAtIndex(index).isTemporaryHighlighted = true; itemAtIndex(index).isTemporaryHighlighted = true;
} }

View File

@@ -10,22 +10,22 @@ import org.kde.kirigami as Kirigami
TimelineDelegate { TimelineDelegate {
id: root id: root
property bool isTemporaryHighlighted: false
onIsTemporaryHighlightedChanged: if (isTemporaryHighlighted) {
temporaryHighlightTimer.start();
}
contentItem: QQC2.ItemDelegate { contentItem: QQC2.ItemDelegate {
padding: Kirigami.Units.largeSpacing padding: Kirigami.Units.largeSpacing
topInset: Kirigami.Units.largeSpacing topInset: Kirigami.Units.largeSpacing
topPadding: Kirigami.Units.largeSpacing * 2 topPadding: Kirigami.Units.largeSpacing * 2
property bool isTemporaryHighlighted: false
onIsTemporaryHighlightedChanged: if (isTemporaryHighlighted) {
temporaryHighlightTimer.start();
}
Timer { Timer {
id: temporaryHighlightTimer id: temporaryHighlightTimer
interval: 1500 interval: 1500
onTriggered: isTemporaryHighlighted = false onTriggered: root.isTemporaryHighlighted = false
} }
contentItem: QQC2.Label { contentItem: QQC2.Label {