X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatview.cpp;h=132565e795f0a14927ae59aa279d5048a7c4be8e;hp=7da0847b3dd129723cf404c1f6dd888a1fe080ad;hb=52209badc8e769e50aa3019b63689dda0e79e9d0;hpb=b509e40498a11254ba39b791ee7131fd319b60ab diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index 7da0847b..132565e7 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,53 +18,54 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include "chatview.h" + +#include + #include #include #include #include #include "bufferwidget.h" +#include "chatline.h" #include "chatscene.h" -#include "chatview.h" #include "client.h" +#include "clientignorelistmanager.h" #include "messagefilter.h" #include "qtui.h" #include "qtuistyle.h" -#include "clientignorelistmanager.h" +#include "util.h" -#include "chatline.h" - -ChatView::ChatView(BufferId bufferId, QWidget *parent) - : QGraphicsView(parent), - AbstractChatView() +ChatView::ChatView(BufferId bufferId, QWidget* parent) + : QGraphicsView(parent) + , AbstractChatView() { QList filterList; filterList.append(bufferId); - MessageFilter *filter = new MessageFilter(Client::messageModel(), filterList, this); + auto* filter = new MessageFilter(Client::messageModel(), filterList, this); init(filter); } - -ChatView::ChatView(MessageFilter *filter, QWidget *parent) - : QGraphicsView(parent), - AbstractChatView() +ChatView::ChatView(MessageFilter* filter, QWidget* parent) + : QGraphicsView(parent) + , AbstractChatView() { init(filter); } - -void ChatView::init(MessageFilter *filter) +void ChatView::init(MessageFilter* filter) { - _bufferContainer = 0; + _bufferContainer = nullptr; _currentScaleFactor = 1; _invalidateFilter = false; setAttribute(Qt::WA_AcceptTouchEvents); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - setAlignment(Qt::AlignLeft|Qt::AlignBottom); + setAlignment(Qt::AlignLeft | Qt::AlignBottom); setInteractive(true); - //setOptimizationFlags(QGraphicsView::DontClipPainter | QGraphicsView::DontAdjustForAntialiasing); + // setOptimizationFlags(QGraphicsView::DontClipPainter | QGraphicsView::DontAdjustForAntialiasing); // setOptimizationFlags(QGraphicsView::DontAdjustForAntialiasing); setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); // setTransformationAnchor(QGraphicsView::NoAnchor); @@ -72,29 +73,28 @@ void ChatView::init(MessageFilter *filter) _scrollTimer.setInterval(100); _scrollTimer.setSingleShot(true); - connect(&_scrollTimer, SIGNAL(timeout()), SLOT(scrollTimerTimeout())); + connect(&_scrollTimer, &QTimer::timeout, this, &ChatView::scrollTimerTimeout); _scene = new ChatScene(filter, filter->idString(), viewport()->width(), this); - connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(adjustSceneRect())); - connect(_scene, SIGNAL(lastLineChanged(QGraphicsItem *, qreal)), this, SLOT(lastLineChanged(QGraphicsItem *, qreal))); - connect(_scene, SIGNAL(mouseMoveWhileSelecting(const QPointF &)), this, SLOT(mouseMoveWhileSelecting(const QPointF &))); + connect(_scene, &QGraphicsScene::sceneRectChanged, this, &ChatView::adjustSceneRect); + connect(_scene, &ChatScene::lastLineChanged, this, &ChatView::lastLineChanged); + connect(_scene, &ChatScene::mouseMoveWhileSelecting, this, &ChatView::mouseMoveWhileSelecting); setScene(_scene); - connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarChanged(int))); + connect(verticalScrollBar(), &QAbstractSlider::valueChanged, this, &ChatView::verticalScrollbarChanged); _lastScrollbarPos = verticalScrollBar()->maximum(); - connect(Client::networkModel(), SIGNAL(markerLineSet(BufferId, MsgId)), SLOT(markerLineSet(BufferId, MsgId))); + connect(Client::networkModel(), &NetworkModel::markerLineSet, this, &ChatView::markerLineSet); // only connect if client is synched with a core if (Client::isConnected()) - connect(Client::ignoreListManager(), SIGNAL(ignoreListChanged()), this, SLOT(invalidateFilter())); + connect(Client::ignoreListManager(), &ClientIgnoreListManager::ignoreListChanged, this, &ChatView::invalidateFilter); } - -bool ChatView::event(QEvent *event) +bool ChatView::event(QEvent* event) { if (event->type() == QEvent::KeyPress) { - QKeyEvent *keyEvent = static_cast(event); + auto* keyEvent = static_cast(event); switch (keyEvent->key()) { case Qt::Key_Up: case Qt::Key_Down: @@ -109,20 +109,17 @@ bool ChatView::event(QEvent *event) } } - if (event->type() == QEvent::TouchBegin) { + if (event->type() == QEvent::TouchBegin && ((QTouchEvent*)event)->device()->type() == QTouchDevice::TouchScreen) { // Enable scrolling by draging, disable selecting/clicking content setDragMode(QGraphicsView::ScrollHandDrag); setInteractive(false); // if scrollbar is not visible we need to request backlog below else we need to accept // the event now (return true) so that we will receive TouchUpdate and TouchEnd/TouchCancel - if (verticalScrollBar()->isVisible()) return true; + if (verticalScrollBar()->isVisible()) + return true; } -#if QT_VERSION >= 0x050000 if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { -#else - if (event->type() == QEvent::TouchEnd) { -#endif // End scroll and reset settings to default setDragMode(QGraphicsView::NoDrag); setInteractive(true); @@ -145,8 +142,9 @@ bool ChatView::event(QEvent *event) } // Applying the movement happens automatically by the drag-mode } - - if (event->type() == QEvent::Wheel || event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate) { + if (event->type() == QEvent::Wheel + || (event->type() == QEvent::TouchBegin && ((QTouchEvent*)event)->device()->type() == QTouchDevice::TouchScreen) + || event->type() == QEvent::TouchUpdate) { if (!verticalScrollBar()->isVisible()) { scene()->requestBacklog(); return true; @@ -161,8 +159,7 @@ bool ChatView::event(QEvent *event) return QGraphicsView::event(event); } - -void ChatView::resizeEvent(QResizeEvent *event) +void ChatView::resizeEvent(QResizeEvent* event) { // if view is currently scrolled to bottom, we want it that way after resizing bool atBottom = (_lastScrollbarPos == verticalScrollBar()->maximum()); @@ -170,8 +167,7 @@ void ChatView::resizeEvent(QResizeEvent *event) QGraphicsView::resizeEvent(event); // if scrolling to bottom, do it immediately. - if(atBottom) - { + if (atBottom) { // we can reduce viewport updates if we scroll to the bottom allready at the beginning verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } @@ -179,15 +175,13 @@ void ChatView::resizeEvent(QResizeEvent *event) scene()->updateForViewport(viewport()->width(), viewport()->height()); adjustSceneRect(); - if(atBottom) - { + if (atBottom) { _lastScrollbarPos = verticalScrollBar()->maximum(); verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } checkChatLineCaches(); } - void ChatView::adjustSceneRect() { // Workaround for QTBUG-6322 @@ -200,8 +194,7 @@ void ChatView::adjustSceneRect() setSceneRect(scene()->sceneRect().adjusted(0, 0, -25, 0)); } - -void ChatView::mouseMoveWhileSelecting(const QPointF &scenePos) +void ChatView::mouseMoveWhileSelecting(const QPointF& scenePos) { int y = (int)mapFromScene(scenePos).y(); _scrollOffset = 0; @@ -214,36 +207,33 @@ void ChatView::mouseMoveWhileSelecting(const QPointF &scenePos) _scrollTimer.start(); } - void ChatView::scrollTimerTimeout() { // scroll view - QAbstractSlider *vbar = verticalScrollBar(); + QAbstractSlider* vbar = verticalScrollBar(); if (_scrollOffset < 0 && vbar->value() > 0) vbar->setValue(qMax(vbar->value() + _scrollOffset, 0)); else if (_scrollOffset > 0 && vbar->value() < vbar->maximum()) vbar->setValue(qMin(vbar->value() + _scrollOffset, vbar->maximum())); } - -void ChatView::lastLineChanged(QGraphicsItem *chatLine, qreal offset) +void ChatView::lastLineChanged(QGraphicsItem* chatLine, qreal offset) { Q_UNUSED(chatLine) // disabled until further testing/discussion - //if(!scene()->isScrollingAllowed()) + // if(!scene()->isScrollingAllowed()) // return; - QAbstractSlider *vbar = verticalScrollBar(); + QAbstractSlider* vbar = verticalScrollBar(); Q_ASSERT(vbar); - if (vbar->maximum() - vbar->value() <= (offset + 5) * _currentScaleFactor) { // 5px grace area + if (vbar->maximum() - vbar->value() <= (offset + 5) * _currentScaleFactor) { // 5px grace area vbar->setValue(vbar->maximum()); } } - void ChatView::verticalScrollbarChanged(int newPos) { - QAbstractSlider *vbar = verticalScrollBar(); + QAbstractSlider* vbar = verticalScrollBar(); Q_ASSERT(vbar); // check for backlog request @@ -263,71 +253,65 @@ void ChatView::verticalScrollbarChanged(int newPos) vbar->setValue(vbar->maximum()); } - MsgId ChatView::lastMsgId() const { if (!scene()) - return MsgId(); + return {}; - QAbstractItemModel *model = scene()->model(); + QAbstractItemModel* model = scene()->model(); if (!model || model->rowCount() == 0) - return MsgId(); + return {}; return model->index(model->rowCount() - 1, 0).data(MessageModel::MsgIdRole).value(); } - MsgId ChatView::lastVisibleMsgId() const { - ChatLine *line = lastVisibleChatLine(); + ChatLine* line = lastVisibleChatLine(); if (line) return line->msgId(); - return MsgId(); + return {}; } - -bool chatLinePtrLessThan(ChatLine *one, ChatLine *other) +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 ChatView::visibleChatLines(Qt::ItemSelectionMode mode) const { - QSet result; - foreach(QGraphicsItem *item, items(viewport()->rect().adjusted(-1, -1, 1, 1), mode)) { - ChatLine *line = qgraphicsitem_cast(item); + QSet result; + foreach (QGraphicsItem* item, items(viewport()->rect().adjusted(-1, -1, 1, 1), mode)) { + auto* line = qgraphicsitem_cast(item); if (line) result.insert(line); } return result; } - -QList ChatView::visibleChatLinesSorted(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; } - -ChatLine *ChatView::lastVisibleChatLine(bool ignoreDayChange) const +ChatLine* ChatView::lastVisibleChatLine(bool ignoreDayChange) const { if (!scene()) - return 0; + return nullptr; - QAbstractItemModel *model = scene()->model(); + QAbstractItemModel* model = scene()->model(); if (!model || model->rowCount() == 0) - return 0; + return nullptr; int row = -1; - QSet visibleLines = visibleChatLines(Qt::ContainsItemBoundingRect); - foreach(ChatLine *line, visibleLines) { + QSet visibleLines = visibleChatLines(Qt::ContainsItemBoundingRect); + foreach (ChatLine* line, visibleLines) { if (line->row() > row && (ignoreDayChange ? line->msgType() != Message::DayChange : true)) row = line->row(); } @@ -335,16 +319,14 @@ ChatLine *ChatView::lastVisibleChatLine(bool ignoreDayChange) const if (row >= 0) return scene()->chatLine(row); - return 0; + return nullptr; } - void ChatView::setMarkerLineVisible(bool visible) { scene()->setMarkerLineVisible(visible); } - void ChatView::setMarkerLine(MsgId msgId) { if (!scene()->isSingleBufferScene()) @@ -354,7 +336,6 @@ void ChatView::setMarkerLine(MsgId msgId) Client::setMarkerLine(bufId, msgId); } - void ChatView::markerLineSet(BufferId buffer, MsgId msgId) { if (!scene()->isSingleBufferScene() || scene()->singleBufferId() != buffer) @@ -364,24 +345,21 @@ void ChatView::markerLineSet(BufferId buffer, MsgId msgId) scene()->setMarkerLineVisible(true); } - void ChatView::jumpToMarkerLine(bool requestBacklog) { scene()->jumpToMarkerLine(requestBacklog); } - -void ChatView::addActionsToMenu(QMenu *menu, const QPointF &pos) +void ChatView::addActionsToMenu(QMenu* menu, const QPointF& pos) { // zoom actions - BufferWidget *bw = qobject_cast(bufferContainer()); + auto* bw = qobject_cast(bufferContainer()); if (bw) { bw->addActionsToMenu(menu, pos); menu->addSeparator(); } } - void ChatView::zoomIn() { _currentScaleFactor *= 1.2; @@ -389,7 +367,6 @@ void ChatView::zoomIn() scene()->setWidth(viewport()->width() / _currentScaleFactor - 2); } - void ChatView::zoomOut() { _currentScaleFactor /= 1.2; @@ -397,15 +374,13 @@ void ChatView::zoomOut() scene()->setWidth(viewport()->width() / _currentScaleFactor - 2); } - void ChatView::zoomOriginal() { - scale(1/_currentScaleFactor, 1/_currentScaleFactor); + scale(1 / _currentScaleFactor, 1 / _currentScaleFactor); _currentScaleFactor = 1; scene()->setWidth(viewport()->width() - 2); } - void ChatView::invalidateFilter() { // if this is the currently selected chatview @@ -420,15 +395,13 @@ void ChatView::invalidateFilter() } } - void ChatView::scrollContentsBy(int dx, int dy) { QGraphicsView::scrollContentsBy(dx, dy); checkChatLineCaches(); } - -void ChatView::setHasCache(ChatLine *line, bool hasCache) +void ChatView::setHasCache(ChatLine* line, bool hasCache) { if (hasCache) _linesWithCache.insert(line); @@ -436,14 +409,13 @@ void ChatView::setHasCache(ChatLine *line, bool hasCache) _linesWithCache.remove(line); } - void ChatView::checkChatLineCaches() { - qreal top = mapToScene(viewport()->rect().topLeft()).y() - 10; // some grace area to avoid premature cleaning + 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(); + QSet::iterator iter = _linesWithCache.begin(); while (iter != _linesWithCache.end()) { - ChatLine *line = *iter; + ChatLine* line = *iter; if (line->pos().y() + line->height() < top || line->pos().y() > bottom) { line->clearCache(); iter = _linesWithCache.erase(iter);