X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Ftreeviewtouch.cpp;h=13db59dbfdbbcc7cf4585675a7d45259aaf5d680;hp=6b795f51efa84d37aaab87b4c6e371a548037807;hb=d57c91811b8f989bcaa4d5a238c65e9ffcc3b1d4;hpb=eb1db9563e94831770974fcbdb864d855c73017a diff --git a/src/uisupport/treeviewtouch.cpp b/src/uisupport/treeviewtouch.cpp index 6b795f51..13db59db 100644 --- a/src/uisupport/treeviewtouch.cpp +++ b/src/uisupport/treeviewtouch.cpp @@ -24,52 +24,57 @@ #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) { - _touchScrollInProgress = true; - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - return true; - } + if (event->type() == QEvent::TouchBegin) { + // 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); - if (!_firstTouchUpdateHappened) { - double dx = abs(p.lastPos().x() - p.pos().x()); - double dy = abs(p.lastPos().y() - p.pos().y()); - if (dx > dy) { - _touchScrollInProgress = false; - } - _firstTouchUpdateHappened = true; - } - 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 = abs(p.lastPos().x() - p.pos().x()); + double dy = abs(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) { + if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { #else if (event->type() == QEvent::TouchEnd) { #endif - _touchScrollInProgress = false; - _firstTouchUpdateHappened = false; - return true; - } + // 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); + if (!_touchScrollInProgress) + QTreeView::mousePressEvent(event); } void TreeViewTouch::mouseMoveEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mouseMoveEvent(event); + if (!_touchScrollInProgress) + QTreeView::mouseMoveEvent(event); };