From 1d3d61ed773cfc319dc029457f3bd321e807d66d Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Sun, 23 May 2021 18:24:55 +0200 Subject: [PATCH] Fix loading events when scrolling or opening a room for the first time Fix #362 (cherry picked from commit bae7813f68808b148120d26b9df479586c114fda) --- imports/NeoChat/Page/RoomPage.qml | 25 +++++++++++++------------ src/messageeventmodel.cpp | 14 ++++++++++++++ src/messageeventmodel.h | 3 +++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/imports/NeoChat/Page/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml index e65d3acc7..675467d9a 100644 --- a/imports/NeoChat/Page/RoomPage.qml +++ b/imports/NeoChat/Page/RoomPage.qml @@ -232,20 +232,17 @@ Kirigami.ScrollablePage { model: !isLoaded ? undefined : sortedMessageEventModel - onContentYChanged: fetchMoreContent() - - function fetchMoreContent() { - if(!noNeedMoreContent && contentY - 5000 < originY) { - currentRoom.getPreviousContent(20); - } - } - MessageEventModel { id: messageEventModel room: currentRoom } + // HACK: The view should do this automatically but doesn't. + onAtYBeginningChanged: if (atYBeginning && messageEventModel.canFetchMore(messageEventModel.index(0, 0))) { + messageEventModel.fetchMore(messageEventModel.index(0, 0)); + } + QQC2.Popup { anchors.centerIn: parent @@ -596,7 +593,11 @@ Kirigami.ScrollablePage { DelegateChoice { roleValue: "other" - delegate: Item {} + delegate: Rectangle { + height: 10 + width: ListView.view.width + color: "red" + } } } @@ -646,10 +647,10 @@ Kirigami.ScrollablePage { } Component.onCompleted: { - updateReadMarker() if (currentRoom) { - if (currentRoom.timelineSize < 20) - currentRoom.getPreviousContent(50) + if (currentRoom.timelineSize < 20) { + currentRoom.getPreviousContent(50); + } } positionViewAtBeginning(); diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index 6be20e2b3..3bf970347 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -370,6 +370,20 @@ int MessageEventModel::rowCount(const QModelIndex &parent) const } +bool MessageEventModel::canFetchMore(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + + return m_currentRoom && !m_currentRoom->eventsHistoryJob() && !m_currentRoom->allHistoryLoaded(); +} + +void MessageEventModel::fetchMore(const QModelIndex &parent) +{ + Q_UNUSED(parent); + m_currentRoom->getPreviousContent(20); +} + + inline QVariantMap userAtEvent(NeoChatUser *user, NeoChatRoom *room, const RoomEvent &evt) { Q_UNUSED(evt) diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index df0723a99..4ecdb439f 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -76,6 +76,9 @@ private: [[nodiscard]] QDateTime makeMessageTimestamp(const Quotient::Room::rev_iter_t &baseIt) const; [[nodiscard]] static QString renderDate(const QDateTime ×tamp); + bool canFetchMore(const QModelIndex &parent) const override; + void fetchMore(const QModelIndex &parent) override; + void refreshLastUserEvents(int baseTimelineRow); void refreshEventRoles(int row, const QVector &roles = {}); int refreshEventRoles(const QString &eventId, const QVector &roles = {});