X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatview.cpp;h=cc5009b9f9675ea6a1fb25bf66e7509760e4772f;hp=ddec8fbec439cb0d96eaf5a60c21f516fe378173;hb=56288a13972bf8466b57c9d5d1ec382fc7e287cc;hpb=e19eef8ec30a926e5a847a7570bb966bc86f602e diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index ddec8fbe..cc5009b9 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -55,8 +55,6 @@ void ChatView::init(MessageFilter *filter) { _bufferContainer = 0; _currentScaleFactor = 1; _invalidateFilter = false; - _markerLineVisible = true; - _markedLine = 0; setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); @@ -123,6 +121,8 @@ bool ChatView::event(QEvent *event) { void ChatView::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); + // FIXME: do we really need to scroll down on resize? + // we can reduce viewport updates if we scroll to the bottom allready at the beginning verticalScrollBar()->setValue(verticalScrollBar()->maximum()); scene()->updateForViewport(viewport()->width(), viewport()->height()); @@ -130,6 +130,8 @@ void ChatView::resizeEvent(QResizeEvent *event) { _lastScrollbarPos = verticalScrollBar()->maximum(); verticalScrollBar()->setValue(verticalScrollBar()->maximum()); + + checkChatLineCaches(); } void ChatView::adjustSceneRect() { @@ -222,6 +224,7 @@ bool chatLinePtrLessThan(ChatLine *one, ChatLine *other) { return one->row() < other->row(); } +// TODO: figure out if it's cheaper to use a cached list (that we'd need to keep updated) QSet ChatView::visibleChatLines(Qt::ItemSelectionMode mode) const { QSet result; foreach(QGraphicsItem *item, items(viewport()->rect().adjusted(-1, -1, 1, 1), mode)) { @@ -238,7 +241,7 @@ QList ChatView::visibleChatLinesSorted(Qt::ItemSelectionMode mode) c return result; } -ChatLine *ChatView::lastVisibleChatLine() const { +ChatLine *ChatView::lastVisibleChatLine(bool ignoreDayChange) const { if(!scene()) return 0; @@ -250,7 +253,7 @@ ChatLine *ChatView::lastVisibleChatLine() const { QSet visibleLines = visibleChatLines(Qt::ContainsItemBoundingRect); foreach(ChatLine *line, visibleLines) { - if(line->row() > row) + if(line->row() > row && (ignoreDayChange? line->msgType() != Message::DayChange : true)) row = line->row(); } @@ -261,42 +264,27 @@ ChatLine *ChatView::lastVisibleChatLine() const { } void ChatView::setMarkerLineVisible(bool visible) { - if(visible != _markerLineVisible) { - _markerLineVisible = visible; - } + scene()->setMarkerLineVisible(visible); } -void ChatView::setMarkedLine(ChatLine *line) { - if(_markedLine == line) - return; - +void ChatView::setMarkerLine(MsgId msgId) { if(!scene()->isSingleBufferScene()) return; - if(line) { - BufferId bufId = scene()->singleBufferId(); - Client::setMarkerLine(bufId, line->msgId()); - } + BufferId bufId = scene()->singleBufferId(); + Client::setMarkerLine(bufId, msgId); } -void ChatView::markerLineSet(BufferId buffer, MsgId msg) { +void ChatView::markerLineSet(BufferId buffer, MsgId msgId) { if(!scene()->isSingleBufferScene() || scene()->singleBufferId() != buffer) return; - ChatLine *newLine = scene()->chatLine(msg); - if(_markedLine == newLine) - return; - - ChatLine *oldLine = _markedLine; - _markedLine = newLine; - - if(oldLine) - oldLine->update(); + scene()->setMarkerLine(msgId); + scene()->setMarkerLineVisible(true); +} - if(newLine) { - setMarkerLineVisible(true); - newLine->update(); - } +void ChatView::jumpToMarkerLine(bool requestBacklog) { + scene()->jumpToMarkerLine(requestBacklog); } void ChatView::addActionsToMenu(QMenu *menu, const QPointF &pos) { @@ -338,3 +326,29 @@ void ChatView::invalidateFilter() { _invalidateFilter = true; } } + +void ChatView::scrollContentsBy(int dx, int dy) { + QGraphicsView::scrollContentsBy(dx, dy); + checkChatLineCaches(); +} + +void ChatView::setHasCache(ChatLine *line, bool hasCache) { + if(hasCache) + _linesWithCache.insert(line); + else + _linesWithCache.remove(line); +} + +void ChatView::checkChatLineCaches() { + qreal top = mapToScene(viewport()->rect().topLeft()).y() - 10; // some grace area to avoid premature cleaning + qreal bottom = mapToScene(viewport()->rect().bottomRight()).y() + 10; + QSet::iterator iter = _linesWithCache.begin(); + while(iter != _linesWithCache.end()) { + ChatLine *line = *iter; + if(line->pos().y() + line->height() < top || line->pos().y() > bottom) { + line->clearCache(); + iter = _linesWithCache.erase(iter); + } else + ++iter; + } +}