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.
This commit is contained in:
Konstantinos Sideris 2017-12-23 13:50:11 +02:00
parent 9dcdd70a35
commit 9d763c4de9
2 changed files with 13 additions and 6 deletions

View file

@ -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;

View file

@ -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;
} }