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.
pull/1/head
Konstantinos Sideris 7 years ago
parent 9dcdd70a35
commit 9d763c4de9
  1. 6
      include/timeline/TimelineView.h
  2. 13
      src/timeline/TimelineView.cc

@ -27,13 +27,14 @@
#include <QStyle> #include <QStyle>
#include <QStyleOption> #include <QStyleOption>
#include <mtx.hpp> #include <mtx/events.hpp>
#include <mtx/responses/messages.hpp>
#include "MatrixClient.h" #include "MatrixClient.h"
#include "ScrollBar.h"
#include "TimelineItem.h" #include "TimelineItem.h"
class FloatingButton; class FloatingButton;
class ScrollBar;
struct DescInfo; struct DescInfo;
// Contains info about a message shown in the history view // Contains info about a message shown in the history view
@ -122,6 +123,7 @@ private:
void updateLastSender(const QString &user_id, TimelineDirection direction); void updateLastSender(const QString &user_id, TimelineDirection direction);
void notifyForLastEvent(); void notifyForLastEvent();
void readLastEvent() const; void readLastEvent() const;
bool isScrollbarActivated() { return scroll_area_->verticalScrollBar()->value() != 0; }
QString getLastEventId() const; QString getLastEventId() const;
QString getEventSender(const mtx::events::collections::TimelineEvents &event) const; QString getEventSender(const mtx::events::collections::TimelineEvents &event) const;

@ -21,7 +21,6 @@
#include "FloatingButton.h" #include "FloatingButton.h"
#include "RoomMessages.h" #include "RoomMessages.h"
#include "ScrollBar.h"
#include "timeline/TimelineView.h" #include "timeline/TimelineView.h"
#include "timeline/widgets/AudioItem.h" #include "timeline/widgets/AudioItem.h"
@ -83,12 +82,18 @@ TimelineView::sliderRangeChanged(int min, int max)
void void
TimelineView::fetchHistory() 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; isPaginationInProgress_ = true;
client_->messages(room_id_, prev_batch_token_); client_->messages(room_id_, prev_batch_token_);
paginationTimer_->start(500); paginationTimer_->start(1500);
return; return;
} }

Loading…
Cancel
Save