From d378c123159fc2731236573fb9b571dff882705e Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Mon, 4 Jun 2012 16:06:40 +0300 Subject: [PATCH] Utilize StartDragVelocity style hint in Flickable Change-Id: I96924b08aede57a0622ea3f7419e8f73a9f18f5d Reviewed-by: Martin Jones --- src/quick/items/qquickcanvas.cpp | 16 ++++++++++++++++ src/quick/items/qquickcanvas_p.h | 2 ++ src/quick/items/qquickflickable.cpp | 11 ++++++----- src/quick/items/qquickmousearea.cpp | 9 +++++---- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 619b08d..363d4cd 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -1711,6 +1711,22 @@ bool QQuickCanvasPrivate::sendFilteredMouseEvent(QQuickItem *target, QQuickItem return false; } +bool QQuickCanvasPrivate::dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event) +{ + QStyleHints *styleHints = qApp->styleHints(); + QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event); + bool dragVelocityLimitAvailable = extended + && extended->capabilities().testFlag(QTouchDevice::Velocity) + && styleHints->startDragVelocity(); + bool overThreshold = qAbs(d) > styleHints->startDragDistance(); + if (dragVelocityLimitAvailable) { + qreal velocity = axis == Qt::XAxis ? extended->velocity().x() + : extended->velocity().y(); + overThreshold |= qAbs(velocity) > styleHints->startDragVelocity(); + } + return overThreshold; +} + /*! Propagates an event to a QQuickItem on the canvas */ diff --git a/src/quick/items/qquickcanvas_p.h b/src/quick/items/qquickcanvas_p.h index 404501f..29c0d51 100644 --- a/src/quick/items/qquickcanvas_p.h +++ b/src/quick/items/qquickcanvas_p.h @@ -196,6 +196,8 @@ public: mutable QQuickCanvasIncubationController *incubationController; + static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event); + private: static void cleanupNodesOnShutdown(QQuickItem *); }; diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index a60c6e7..a80f714 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -914,10 +914,10 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) bool stealX = stealMouse; qint64 elapsedSincePress = computeCurrentTime(event) - lastPressTime; - if (q->yflick()) { qreal dy = event->localPos().y() - pressPos.y(); - if (qAbs(dy) > qApp->styleHints()->startDragDistance() || elapsedSincePress > 200) { + bool overThreshold = QQuickCanvasPrivate::dragOverThreshold(dy, Qt::YAxis, event); + if (overThreshold || elapsedSincePress > 200) { if (!vMoved) vData.dragStartOffset = dy; qreal newY = dy + vData.pressPos - vData.dragStartOffset; @@ -943,14 +943,15 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) vData.move.setValue(newY); vMoved = true; } - if (qAbs(dy) > qApp->styleHints()->startDragDistance()) + if (overThreshold) stealY = true; } } if (q->xflick()) { qreal dx = event->localPos().x() - pressPos.x(); - if (qAbs(dx) > qApp->styleHints()->startDragDistance() || elapsedSincePress > 200) { + bool overThreshold = QQuickCanvasPrivate::dragOverThreshold(dx, Qt::XAxis, event); + if (overThreshold || elapsedSincePress > 200) { if (!hMoved) hData.dragStartOffset = dx; qreal newX = dx + hData.pressPos - hData.dragStartOffset; @@ -977,7 +978,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) hMoved = true; } - if (qAbs(dx) > qApp->styleHints()->startDragDistance()) + if (overThreshold) stealX = true; } } diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 6626389..effb73e 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -746,7 +746,6 @@ void QQuickMouseArea::mouseMoveEvent(QMouseEvent *event) curLocalPos = event->windowPos(); } - const int dragThreshold = qApp->styleHints()->startDragDistance(); qreal dx = qAbs(curLocalPos.x() - startLocalPos.x()); qreal dy = qAbs(curLocalPos.y() - startLocalPos.y()); @@ -778,9 +777,11 @@ void QQuickMouseArea::mouseMoveEvent(QMouseEvent *event) d->drag->target()->setPos(dragPos); if (!keepMouseGrab()) { - if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold) - || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold) - || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) { + bool xDragged = QQuickCanvasPrivate::dragOverThreshold(dx, Qt::XAxis, event); + bool yDragged = QQuickCanvasPrivate::dragOverThreshold(dy, Qt::YAxis, event); + if ((!d->dragY && !yDragged && d->dragX && xDragged) + || (!d->dragX && !xDragged && d->dragY && yDragged) + || (d->dragX && d->dragY && (xDragged || yDragged))) { setKeepMouseGrab(true); d->stealMouse = true; } -- 2.7.4