Ensure Flickable moving and flicking properties are correct.
authorMartin Jones <martin.jones@nokia.com>
Fri, 3 Feb 2012 03:09:17 +0000 (13:09 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 7 Feb 2012 02:54:04 +0000 (03:54 +0100)
Flicking, then touching to stop the flick should set flicking
property to false.  Moving or flicking vertically should not
set flickingHorizontally, and vise-versa.

Change-Id: Iee42a92ffff2707f0691ffa285dec514b47c9986
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
src/quick/items/qquickflickable.cpp
tests/auto/qtquick2/qquickflickable/tst_qquickflickable.cpp

index 6215500..7d497fb 100644 (file)
@@ -303,14 +303,14 @@ void QQuickFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExt
         else
             timeline.accel(data.move, v, deceleration, maxDistance);
         timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
-        if (!hData.flicking && q->xflick()) {
+        if (!hData.flicking && q->xflick() && (&data == &hData)) {
             hData.flicking = true;
             emit q->flickingChanged();
             emit q->flickingHorizontallyChanged();
             if (!vData.flicking)
                 emit q->flickStarted();
         }
-        if (!vData.flicking && q->yflick()) {
+        if (!vData.flicking && q->yflick() && (&data == &vData)) {
             vData.flicking = true;
             emit q->flickingChanged();
             emit q->flickingVerticallyChanged();
@@ -855,8 +855,17 @@ void QQuickFlickablePrivate::handleMousePressEvent(QMouseEvent *event)
     pressPos = event->localPos();
     hData.pressPos = hData.move.value();
     vData.pressPos = vData.move.value();
-    hData.flicking = false;
-    vData.flicking = false;
+    bool wasFlicking = hData.flicking || vData.flicking;
+    if (hData.flicking) {
+        hData.flicking = false;
+        emit q->flickingHorizontallyChanged();
+    }
+    if (vData.flicking) {
+        vData.flicking = false;
+        emit q->flickingVerticallyChanged();
+    }
+    if (wasFlicking)
+        emit q->flickingChanged();
     lastPosTime = lastPressTime = computeCurrentTime(event);
     QQuickItemPrivate::start(velocityTime);
 }
@@ -897,7 +906,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
                     rejectY = false;
                 }
             }
-            if (!rejectY && stealMouse) {
+            if (!rejectY && stealMouse && dy != 0.0) {
                 vData.move.setValue(qRound(newY));
                 vMoved = true;
             }
@@ -929,7 +938,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
                     rejectX = false;
                 }
             }
-            if (!rejectX && stealMouse) {
+            if (!rejectX && stealMouse && dx != 0.0) {
                 hData.move.setValue(qRound(newX));
                 hMoved = true;
             }
index 4439d97..a176870 100644 (file)
@@ -456,6 +456,7 @@ void tst_qquickflickable::movingAndDragging()
     QTest::mouseMove(canvas, QPoint(70, 50));
     QTest::mouseMove(canvas, QPoint(60, 50));
 
+    QVERIFY(!flickable->isDraggingVertically());
     QVERIFY(flickable->isDraggingHorizontally());
     QVERIFY(flickable->isDragging());
     QCOMPARE(vDragSpy.count(), 0);
@@ -480,9 +481,50 @@ void tst_qquickflickable::movingAndDragging()
     QCOMPARE(hDragSpy.count(), 2);
     QCOMPARE(dragStartSpy.count(), 1);
     QCOMPARE(dragEndSpy.count(), 1);
-
     // Don't test moving because a flick could occur
 
+#ifdef Q_OS_MAC
+    QSKIP("Producing flicks on Mac CI impossible due to timing problems");
+#endif
+
+    QTRY_VERIFY(!flickable->isMoving());
+
+    vMoveSpy.clear();
+    hMoveSpy.clear();
+    moveSpy.clear();
+    QSignalSpy vFlickSpy(flickable, SIGNAL(flickingVerticallyChanged()));
+    QSignalSpy hFlickSpy(flickable, SIGNAL(flickingHorizontallyChanged()));
+    QSignalSpy flickSpy(flickable, SIGNAL(flickingChanged()));
+
+    // flick then press while it is still moving
+    // flicking == false, moving == true;
+    flick(canvas, QPoint(20,190), QPoint(20, 50), 200);
+    QVERIFY(flickable->verticalVelocity() > 0.0);
+    QVERIFY(flickable->isFlicking());
+    QVERIFY(flickable->isFlickingVertically());
+    QVERIFY(!flickable->isFlickingHorizontally());
+    QVERIFY(flickable->isMoving());
+    QVERIFY(flickable->isMovingVertically());
+    QVERIFY(!flickable->isMovingHorizontally());
+    QCOMPARE(vMoveSpy.count(), 1);
+    QCOMPARE(hMoveSpy.count(), 0);
+    QCOMPARE(moveSpy.count(), 1);
+    QCOMPARE(vFlickSpy.count(), 1);
+    QCOMPARE(hFlickSpy.count(), 0);
+    QCOMPARE(flickSpy.count(), 1);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(20, 50));
+    QTRY_VERIFY(!flickable->isFlicking());
+    QVERIFY(!flickable->isFlickingVertically());
+    QVERIFY(flickable->isMoving());
+    QVERIFY(flickable->isMovingVertically());
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(20,50));
+    QVERIFY(!flickable->isFlicking());
+    QVERIFY(!flickable->isFlickingVertically());
+    QTRY_VERIFY(!flickable->isMoving());
+    QVERIFY(!flickable->isMovingVertically());
+
     delete canvas;
 }