X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Ftreeviewtouch.cpp;h=74799b3f62f09e6d2bc4461ee5420d45f0d341a7;hp=adfb91727be3456ca988b40a1720da692d7e678a;hb=ab7ef4d24f62b5848b628482b7762ebfc0b53e1a;hpb=de2c1a4f9bbae7070cf8fd8247db765a23d28a9c diff --git a/src/uisupport/treeviewtouch.cpp b/src/uisupport/treeviewtouch.cpp index adfb9172..74799b3f 100644 --- a/src/uisupport/treeviewtouch.cpp +++ b/src/uisupport/treeviewtouch.cpp @@ -1,67 +1,81 @@ /*************************************************************************** -* Copyright (C) 2005-2015 by the Quassel Project * -* devel@quassel-irc.org * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) version 3. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License for more details. * -* * -* You should have received a copy of the GNU General Public License * -* along with this program; if not, write to the * -* Free Software Foundation, Inc., * -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -***************************************************************************/ + * Copyright (C) 2005-2018 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + #include "treeviewtouch.h" -#include -#include +#include #include +#include + TreeViewTouch::TreeViewTouch(QWidget *parent) - : QTreeView(parent) + : QTreeView(parent) { - setAttribute(Qt::WA_AcceptTouchEvents); + setAttribute(Qt::WA_AcceptTouchEvents); } bool TreeViewTouch::event(QEvent *event) { - if (event->type() == QEvent::TouchBegin && _lastTouchStart < QDateTime::currentMSecsSinceEpoch() - 1000) { //(slow) double tab = normal behaviour = select multiple. 1000 ok? - _touchScrollInProgress = true; - _lastTouchStart = QDateTime::currentMSecsSinceEpoch(); - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - return true; - } + if (event->type() == QEvent::TouchBegin && ((QTouchEvent*)event)->device()->type()==QTouchDevice::TouchScreen) { + // Register that we may be scrolling, set the scroll mode to scroll-per-pixel + // and accept the event (return true) so that we will receive TouchUpdate and TouchEnd/TouchCancel + _touchScrollInProgress = true; + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + return true; + } - if (event->type() == QEvent::TouchUpdate && _touchScrollInProgress) { - QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); - verticalScrollBar()->setValue(verticalScrollBar()->value() - (p.pos().y() - p.lastPos().y())); - return true; - } + if (event->type() == QEvent::TouchUpdate && _touchScrollInProgress) { + QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); + 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. + double dx = qAbs(p.lastPos().x() - p.pos().x()); + double dy = qAbs(p.lastPos().y() - p.pos().y()); + if (dx > dy) { + _touchScrollInProgress = false; + } + _firstTouchUpdateHappened = true; + } + // Apply touch movement to scrollbar + verticalScrollBar()->setValue(verticalScrollBar()->value() - (p.pos().y() - p.lastPos().y())); + return true; + } -#if QT_VERSION >= 0x050000 - if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { -#else - if (event->type() == QEvent::TouchEnd) { -#endif - _touchScrollInProgress = false; - return true; - } + if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { + // End scroll and reset variables + _touchScrollInProgress = false; + _firstTouchUpdateHappened = false; + return true; + } - return QTreeView::event(event); + return QTreeView::event(event); } -void TreeViewTouch::mousePressEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mousePressEvent(event); + +void TreeViewTouch::mousePressEvent(QMouseEvent *event) { + if (!_touchScrollInProgress) + QTreeView::mousePressEvent(event); } -void TreeViewTouch::mouseMoveEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mouseMoveEvent(event); + +void TreeViewTouch::mouseMoveEvent(QMouseEvent *event) { + if (!_touchScrollInProgress) + QTreeView::mouseMoveEvent(event); };