Utilize StartDragVelocity style hint in Flickable
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>
Mon, 4 Jun 2012 13:06:40 +0000 (16:06 +0300)
committerQt by Nokia <qt-info@nokia.com>
Wed, 6 Jun 2012 06:08:30 +0000 (08:08 +0200)
Change-Id: I96924b08aede57a0622ea3f7419e8f73a9f18f5d
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquickcanvas.cpp
src/quick/items/qquickcanvas_p.h
src/quick/items/qquickflickable.cpp
src/quick/items/qquickmousearea.cpp

index 619b08d..363d4cd 100644 (file)
@@ -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
 */
index 404501f..29c0d51 100644 (file)
@@ -196,6 +196,8 @@ public:
 
     mutable QQuickCanvasIncubationController *incubationController;
 
+    static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event);
+
 private:
     static void cleanupNodesOnShutdown(QQuickItem *);
 };
index a60c6e7..a80f714 100644 (file)
@@ -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;
         }
     }
index 6626389..effb73e 100644 (file)
@@ -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;
             }