From: Martin Jones Date: Fri, 3 Feb 2012 03:09:17 +0000 (+1000) Subject: Ensure Flickable moving and flicking properties are correct. X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=60a6f896906c3b03d75562519044fa81ee9c4bc1;p=konrad%2Fqtdeclarative.git Ensure Flickable moving and flicking properties are correct. 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 --- diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 6215500..7d497fb 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -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; } diff --git a/tests/auto/qtquick2/qquickflickable/tst_qquickflickable.cpp b/tests/auto/qtquick2/qquickflickable/tst_qquickflickable.cpp index 4439d97..a176870 100644 --- a/tests/auto/qtquick2/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/qtquick2/qquickflickable/tst_qquickflickable.cpp @@ -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; }