From 9d763c4de9d4820361140adcdda3f60977da2950 Mon Sep 17 00:00:00 2001
From: Konstantinos Sideris <sideris.konstantin@gmail.com>
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 52bf01657..faada44c7 100644
--- a/include/timeline/TimelineView.h
+++ b/include/timeline/TimelineView.h
@@ -27,13 +27,14 @@
 #include <QStyle>
 #include <QStyleOption>
 
-#include <mtx.hpp>
+#include <mtx/events.hpp>
+#include <mtx/responses/messages.hpp>
 
 #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 dd51fc52b..dccc6f37c 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;
         }
 
-- 
GitLab