From 9d763c4de9d4820361140adcdda3f60977da2950 Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Sat, 23 Dec 2017 13:50:11 +0200 Subject: [PATCH] Don't keep fetching history on non-visible timelines If the user switched to another timeline before the current timeline filled up with messages, nheko would keep fetching history. Now it will check periodically if the timeline became visible so it can decide whether or not to stop fetching history. --- include/timeline/TimelineView.h | 6 ++++-- src/timeline/TimelineView.cc | 13 +++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/timeline/TimelineView.h b/include/timeline/TimelineView.h index 52bf0165..faada44c 100644 --- a/include/timeline/TimelineView.h +++ b/include/timeline/TimelineView.h @@ -27,13 +27,14 @@ #include #include -#include +#include +#include #include "MatrixClient.h" +#include "ScrollBar.h" #include "TimelineItem.h" class FloatingButton; -class ScrollBar; struct DescInfo; // Contains info about a message shown in the history view @@ -122,6 +123,7 @@ private: void updateLastSender(const QString &user_id, TimelineDirection direction); void notifyForLastEvent(); void readLastEvent() const; + bool isScrollbarActivated() { return scroll_area_->verticalScrollBar()->value() != 0; } QString getLastEventId() const; QString getEventSender(const mtx::events::collections::TimelineEvents &event) const; diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc index dd51fc52..dccc6f37 100644 --- a/src/timeline/TimelineView.cc +++ b/src/timeline/TimelineView.cc @@ -21,7 +21,6 @@ #include "FloatingButton.h" #include "RoomMessages.h" -#include "ScrollBar.h" #include "timeline/TimelineView.h" #include "timeline/widgets/AudioItem.h" @@ -83,12 +82,18 @@ TimelineView::sliderRangeChanged(int min, int max) void TimelineView::fetchHistory() { - bool hasEnoughMessages = scroll_area_->verticalScrollBar()->isVisible(); + if (!isScrollbarActivated() && !isTimelineFinished) { + if (!isVisible()) { + // Check again later if the timeline became visible. + // TODO: Use a backoff strategy. + paginationTimer_->start(3000); + return; + } - if (!hasEnoughMessages && !isTimelineFinished) { isPaginationInProgress_ = true; client_->messages(room_id_, prev_batch_token_); - paginationTimer_->start(500); + paginationTimer_->start(1500); + return; }