X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatview.cpp;h=95ee9a18b8dd27c4de37edd603794414548cd77d;hp=7197a24edcfc2a07eb71708b126089d14b937910;hb=900cce213a6ed000b7131a05a0dec7d04b35b023;hpb=b65b9f7615165e8700a44d59b7275a55558dd45b diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index 7197a24e..95ee9a18 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -40,7 +40,7 @@ ChatView::ChatView(BufferId bufferId, QWidget *parent) { QList filterList; filterList.append(bufferId); - MessageFilter *filter = new MessageFilter(Client::messageModel(), filterList, this); + auto *filter = new MessageFilter(Client::messageModel(), filterList, this); init(filter); } @@ -55,10 +55,11 @@ ChatView::ChatView(MessageFilter *filter, QWidget *parent) 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); @@ -71,29 +72,29 @@ 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) { 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: @@ -108,7 +109,39 @@ bool ChatView::event(QEvent *event) } } - if (event->type() == QEvent::Wheel) { + 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 (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { + // End scroll and reset settings to default + setDragMode(QGraphicsView::NoDrag); + setInteractive(true); + _firstTouchUpdateHappened = false; + return true; + } + + if (event->type() == QEvent::TouchUpdate) { + if (!_firstTouchUpdateHappened) { + // After the first movement of a Touch-Point, calculate the distance in both axis + // and if the point moved more horizontally abort scroll. + QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); + double dx = qAbs(p.lastPos().x() - p.pos().x()); + double dy = qAbs(p.lastPos().y() - p.pos().y()); + if (dx > dy) { + setDragMode(QGraphicsView::NoDrag); + setInteractive(true); + } + _firstTouchUpdateHappened = true; + } + // Applying the movement happens automatically by the drag-mode + } + 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; @@ -229,11 +262,11 @@ void ChatView::verticalScrollbarChanged(int newPos) MsgId ChatView::lastMsgId() const { if (!scene()) - return MsgId(); + return {}; QAbstractItemModel *model = scene()->model(); if (!model || model->rowCount() == 0) - return MsgId(); + return {}; return model->index(model->rowCount() - 1, 0).data(MessageModel::MsgIdRole).value(); } @@ -246,7 +279,7 @@ MsgId ChatView::lastVisibleMsgId() const if (line) return line->msgId(); - return MsgId(); + return {}; } @@ -261,7 +294,7 @@ 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); + auto *line = qgraphicsitem_cast(item); if (line) result.insert(line); } @@ -280,11 +313,11 @@ QList ChatView::visibleChatLinesSorted(Qt::ItemSelectionMode mode) c ChatLine *ChatView::lastVisibleChatLine(bool ignoreDayChange) const { if (!scene()) - return 0; + return nullptr; QAbstractItemModel *model = scene()->model(); if (!model || model->rowCount() == 0) - return 0; + return nullptr; int row = -1; @@ -297,7 +330,7 @@ ChatLine *ChatView::lastVisibleChatLine(bool ignoreDayChange) const if (row >= 0) return scene()->chatLine(row); - return 0; + return nullptr; } @@ -336,7 +369,7 @@ void ChatView::jumpToMarkerLine(bool requestBacklog) 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();