diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index c42cd6e9..3651a6f1 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -93,7 +93,7 @@ Page { BusyIndicator { anchors.centerIn: parent - running: timelineManager.isInitialSync + running: timelineManager.isInitialSync || chat.model.paginationInProgress height: 200 width: 200 z: 3 diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index e3a1a781..af5bdc82 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -432,15 +432,26 @@ TimelineModel::canFetchMore(const QModelIndex &) const return false; } +void +TimelineModel::setPaginationInProgress(const bool paginationInProgress) +{ + if (m_paginationInProgress == paginationInProgress) { + return; + } + + m_paginationInProgress = paginationInProgress; + emit paginationInProgressChanged(m_paginationInProgress); +} + void TimelineModel::fetchMore(const QModelIndex &) { - if (paginationInProgress) { + if (m_paginationInProgress) { nhlog::ui()->warn("Already loading older messages"); return; } - paginationInProgress = true; + setPaginationInProgress(true); mtx::http::MessagesOpts opts; opts.room_id = room_id_.toStdString(); opts.from = prev_batch_token_.toStdString(); @@ -455,12 +466,13 @@ TimelineModel::fetchMore(const QModelIndex &) mtx::errors::to_string(err->matrix_error.errcode), err->matrix_error.error, err->parse_error); - paginationInProgress = false; + emit oldMessagesRetrieved(std::move(res)); + setPaginationInProgress(false); return; } emit oldMessagesRetrieved(std::move(res)); - paginationInProgress = false; + setPaginationInProgress(false); }); } diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index ae468c09..14276a5a 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -124,6 +124,7 @@ class TimelineModel : public QAbstractListModel Q_PROPERTY(std::vector typingUsers READ typingUsers WRITE updateTypingUsers NOTIFY typingUsersChanged) Q_PROPERTY(QString reply READ reply WRITE setReply NOTIFY replyChanged RESET resetReply) + Q_PROPERTY(bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged) public: explicit TimelineModel(TimelineViewManager *manager, @@ -208,6 +209,7 @@ public slots: } } std::vector typingUsers() const { return typingUsers_; } + bool paginationInProgress() const { return m_paginationInProgress; } QString reply() const { return reply_; } void setReply(QString newReply) @@ -246,6 +248,7 @@ signals: void eventFetched(QString requestingEvent, mtx::events::collections::TimelineEvents event); void typingUsersChanged(std::vector users); void replyChanged(QString reply); + void paginationInProgressChanged(const bool); private: DecryptionResult decryptEvent( @@ -261,6 +264,8 @@ private: mtx::http::RequestErr err); void readEvent(const std::string &id); + void setPaginationInProgress(const bool paginationInProgress); + QHash events; QSet read; QList pending; @@ -270,8 +275,8 @@ private: QString prev_batch_token_; bool isInitialSync = true; - bool paginationInProgress = false; bool decryptDescription = true; + bool m_paginationInProgress = false; QString currentId; QString reply_;