X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fchatview.cpp;h=f8fb586627ea77ab02828d5265a20f3886d308c9;hb=c01c1ad4823a3e49c9526c19560dd5ce4fe30cb8;hp=eb800007c307af269d50ac67bb5bca6b95173518;hpb=c1cf157116de7fc3da96203aa6f03c38c7ebb650;p=quassel.git diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index eb800007..f8fb5866 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2018 by the Quassel Project * + * Copyright (C) 2005-2020 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,6 +20,8 @@ #include "chatview.h" +#include + #include #include #include @@ -33,6 +35,7 @@ #include "messagefilter.h" #include "qtui.h" #include "qtuistyle.h" +#include "util.h" ChatView::ChatView(BufferId bufferId, QWidget* parent) : QGraphicsView(parent) @@ -97,8 +100,7 @@ bool ChatView::event(QEvent* event) case Qt::Key_Down: case Qt::Key_PageUp: case Qt::Key_PageDown: - if (!verticalScrollBar()->isVisible()) { - scene()->requestBacklog(); + if (requestBacklogForScroll()) { return true; } default: @@ -142,8 +144,7 @@ bool ChatView::event(QEvent* event) if (event->type() == QEvent::Wheel || (event->type() == QEvent::TouchBegin && ((QTouchEvent*)event)->device()->type() == QTouchDevice::TouchScreen) || event->type() == QEvent::TouchUpdate) { - if (!verticalScrollBar()->isVisible()) { - scene()->requestBacklog(); + if (requestBacklogForScroll()) { return true; } } @@ -291,8 +292,8 @@ QSet ChatView::visibleChatLines(Qt::ItemSelectionMode mode) const QList ChatView::visibleChatLinesSorted(Qt::ItemSelectionMode mode) const { - QList result = visibleChatLines(mode).toList(); - qSort(result.begin(), result.end(), chatLinePtrLessThan); + QList result = visibleChatLines(mode).values(); + std::sort(result.begin(), result.end(), chatLinePtrLessThan); return result; } @@ -406,6 +407,23 @@ void ChatView::setHasCache(ChatLine* line, bool hasCache) _linesWithCache.remove(line); } +bool ChatView::requestBacklogForScroll() +{ + if (!verticalScrollBar()->isVisible()) { + // Not able to scroll, fetch backlog + // + // Future improvement: continue fetching backlog in chunks until the scrollbar is visible, + // or the beginning of the buffer has been reached. + scene()->requestBacklog(); + // Backlog has been requested + return true; + } + else { + // Scrollbar already visible, no backlog requested + return false; + } +} + void ChatView::checkChatLineCaches() { qreal top = mapToScene(viewport()->rect().topLeft()).y() - 10; // some grace area to avoid premature cleaning