From ac8e42b9265bbdc2b3a386e01787a6ee9cfb0180 Mon Sep 17 00:00:00 2001
From: Konstantinos Sideris <sideris.konstantin@gmail.com>
Date: Mon, 9 Oct 2017 01:32:25 +0300
Subject: [PATCH] Reduce timeline flickering

---
 include/TimelineView.h |  7 +++----
 src/TimelineView.cc    | 35 +++++++++++++++++++++--------------
 2 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/include/TimelineView.h b/include/TimelineView.h
index 9b81485d5..da73b00a6 100644
--- a/include/TimelineView.h
+++ b/include/TimelineView.h
@@ -140,10 +140,9 @@ private:
         bool isPaginationInProgress_ = false;
 
         // Keeps track whether or not the user has visited the view.
-        bool isInitialized              = false;
-        bool isTimelineFinished         = false;
-        bool isInitialSync              = true;
-        bool isPaginationScrollPending_ = false;
+        bool isInitialized      = false;
+        bool isTimelineFinished = false;
+        bool isInitialSync      = true;
 
         const int SCROLL_BAR_GAP = 400;
 
diff --git a/src/TimelineView.cc b/src/TimelineView.cc
index 032d13107..08b46fdd3 100644
--- a/src/TimelineView.cc
+++ b/src/TimelineView.cc
@@ -85,19 +85,15 @@ TimelineView::sliderRangeChanged(int min, int max)
         if (max - scroll_area_->verticalScrollBar()->value() < SCROLL_BAR_GAP)
                 scroll_area_->verticalScrollBar()->setValue(max);
 
-        if (isPaginationScrollPending_) {
-                isPaginationScrollPending_ = false;
+        int currentHeight = scroll_widget_->size().height();
+        int diff          = currentHeight - oldHeight_;
+        int newPosition   = oldPosition_ + diff;
 
-                int currentHeight = scroll_widget_->size().height();
-                int diff          = currentHeight - oldHeight_;
-                int newPosition   = oldPosition_ + diff;
+        // Keep the scroll bar to the bottom if it hasn't been activated yet.
+        if (oldPosition_ == 0 && !scroll_area_->verticalScrollBar()->isVisible())
+                newPosition = max;
 
-                // Keep the scroll bar to the bottom if it hasn't been activated yet.
-                if (oldPosition_ == 0 && !scroll_area_->verticalScrollBar()->isVisible())
-                        newPosition = max;
-
-                scroll_area_->verticalScrollBar()->setValue(newPosition);
-        }
+        scroll_area_->verticalScrollBar()->setValue(newPosition);
 }
 
 void
@@ -173,6 +169,9 @@ TimelineView::addBackwardsEvents(const QString &room_id, const RoomMessages &msg
         isTimelineFinished = false;
         QList<TimelineItem *> items;
 
+        scroll_widget_->adjustSize();
+        scroll_widget_->update();
+
         // Parse in reverse order to determine where we should not show sender's
         // name.
         auto ii = msgs.chunk().size();
@@ -195,9 +194,8 @@ TimelineView::addBackwardsEvents(const QString &room_id, const RoomMessages &msg
         for (const auto &item : items)
                 addTimelineItem(item, TimelineDirection::Top);
 
-        prev_batch_token_          = msgs.end();
-        isPaginationInProgress_    = false;
-        isPaginationScrollPending_ = true;
+        prev_batch_token_       = msgs.end();
+        isPaginationInProgress_ = false;
 
         // Exclude the top stretch.
         if (!msgs.chunk().isEmpty() && scroll_layout_->count() > 1)
@@ -465,6 +463,9 @@ TimelineView::addTimelineItem(TimelineItem *item, TimelineDirection direction)
                 scroll_layout_->addWidget(item);
         else
                 scroll_layout_->insertWidget(1, item);
+
+        scroll_widget_->adjustSize();
+        scroll_widget_->update();
 }
 
 void
@@ -488,6 +489,9 @@ TimelineView::addUserMessage(matrix::events::MessageEventType ty, const QString
         TimelineItem *view_item = new TimelineItem(ty, user_id, body, with_sender, scroll_widget_);
         scroll_layout_->addWidget(view_item);
 
+        scroll_widget_->adjustSize();
+        scroll_widget_->update();
+
         lastSender_ = user_id;
 
         PendingMessage message(txn_id, body, "", view_item);
@@ -506,6 +510,9 @@ TimelineView::addUserMessage(const QString &url, const QString &filename, int tx
         TimelineItem *view_item = new TimelineItem(image, user_id, with_sender, scroll_widget_);
         scroll_layout_->addWidget(view_item);
 
+        scroll_widget_->adjustSize();
+        scroll_widget_->update();
+
         lastSender_ = user_id;
 
         PendingMessage message(txn_id, url, "", view_item);
-- 
GitLab