diff --git a/include/TimelineView.h b/include/TimelineView.h index 67ea28b2..b50970b9 100644 --- a/include/TimelineView.h +++ b/include/TimelineView.h @@ -111,12 +111,16 @@ private: bool isInitialized = false; bool isTimelineFinished = false; bool isInitialSync = true; + bool isPaginationScrollPending_ = false; - const int SCROLL_BAR_GAP = 300; + const int SCROLL_BAR_GAP = 400; int scroll_height_ = 0; int previous_max_height_ = 0; + int oldPosition_; + int oldHeight_; + QList pending_msgs_; QSharedPointer client_; }; diff --git a/src/TimelineView.cc b/src/TimelineView.cc index 5cd59fe5..412b9520 100644 --- a/src/TimelineView.cc +++ b/src/TimelineView.cc @@ -58,6 +58,15 @@ void 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_; + + scroll_area_->verticalScrollBar()->setValue(oldPosition_ + diff); + } } void TimelineView::scrollDown() @@ -88,17 +97,14 @@ void TimelineView::sliderMoved(int position) return; // Prevent user from moving up when there is pagination in progress. - if (isPaginationInProgress_) { - scroll_area_->verticalScrollBar()->setValue(SCROLL_BAR_GAP); + // TODO: Keep a map of the event ids to filter out duplicates. + if (isPaginationInProgress_) return; - } isPaginationInProgress_ = true; - scroll_height_ = scroll_area_->verticalScrollBar()->value(); - previous_max_height_ = scroll_area_->verticalScrollBar()->maximum(); // FIXME: Maybe move this to TimelineViewManager to remove the extra calls? - client_.data()->messages(room_id_, prev_batch_token_); + client_->messages(room_id_, prev_batch_token_); } } @@ -130,11 +136,15 @@ void TimelineView::addBackwardsEvents(const QString &room_id, const RoomMessages // Reverse again to render them. std::reverse(items.begin(), items.end()); + oldPosition_ = scroll_area_->verticalScrollBar()->value(); + oldHeight_ = scroll_widget_->size().height(); + for (const auto &item : items) addTimelineItem(item, TimelineDirection::Top); prev_batch_token_ = msgs.end(); isPaginationInProgress_ = false; + isPaginationScrollPending_ = true; } TimelineItem *TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection direction)