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

View file

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