diff options
author | Martin Jones <martin.jones@jollamobile.com> | 2013-08-12 13:28:17 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-19 02:50:29 +0200 |
commit | 566afc2d2e4156712ffec081715f12307cf46628 (patch) | |
tree | b4f6f77c6898077659fee0c9f449b889f2678880 /tests/auto/quick/qquickflickable | |
parent | 180180d19545665efbf0f939778845a44cb92003 (diff) |
Dragging MouseArea nested in Flickable does not work with touch to mouse
A MouseArea with a drag target nested in a Flickable does not work.
This is due to QQuickWindow calling childMouseEventFilter() twice -
once in sendFilteredTouchEvent() and later in sendEvent().
Since childMouseEventFilter() has already been called, deliver the
mouse event directly in sendFilteredTouchEvent().
Task-number: QTBUG-32920
Change-Id: I22acee3c66ee6c06e71c9c876fb02dbcb6119a8d
Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
Diffstat (limited to 'tests/auto/quick/qquickflickable')
-rw-r--r-- | tests/auto/quick/qquickflickable/tst_qquickflickable.cpp | 69 |
1 files changed, 42 insertions, 27 deletions
diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp index a8055b3467..dd9fa47d81 100644 --- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp @@ -94,9 +94,10 @@ private slots: void flickTwiceUsingTouches(); void nestedStopAtBounds(); void nestedStopAtBounds_data(); + void nestedMouseAreaUsingTouch(); private: - void flickWithTouch(QWindow *window, QTouchDevice *touchDevice); + void flickWithTouch(QWindow *window, QTouchDevice *touchDevice, const QPoint &from, const QPoint &to); QQmlEngine engine; }; @@ -1268,13 +1269,13 @@ void tst_qquickflickable::flickTwiceUsingTouches() QVERIFY(flickable != 0); QCOMPARE(flickable->contentY(), 0.0f); - flickWithTouch(window, touchDevice); + flickWithTouch(window, touchDevice, QPoint(100, 400), QPoint(100, 240)); qreal contentYAfterFirstFlick = flickable->contentY(); qDebug() << "contentYAfterFirstFlick " << contentYAfterFirstFlick; QVERIFY(contentYAfterFirstFlick > 50.0f); - flickWithTouch(window, touchDevice); + flickWithTouch(window, touchDevice, QPoint(100, 400), QPoint(100, 240)); // In the original bug, that second flick would cause Flickable to halt immediately qreal contentYAfterSecondFlick = flickable->contentY(); @@ -1284,34 +1285,19 @@ void tst_qquickflickable::flickTwiceUsingTouches() delete window; } -void tst_qquickflickable::flickWithTouch(QWindow *window, QTouchDevice *touchDevice) +void tst_qquickflickable::flickWithTouch(QWindow *window, QTouchDevice *touchDevice, const QPoint &from, const QPoint &to) { QTest::touchEvent(window, touchDevice) - .press(0, QPoint(100, 400), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 380), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 360), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 340), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 320), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 300), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 280), window); - QTest::qWait(1); - QTest::touchEvent(window, touchDevice) - .move(0, QPoint(100, 260), window); + .press(0, from, window); QTest::qWait(1); + QPoint diff = to - from; + for (int i = 1; i <= 8; ++i) { + QTest::touchEvent(window, touchDevice) + .move(0, from + i*diff/8, window); + QTest::qWait(1); + } QTest::touchEvent(window, touchDevice) - .release(0, QPoint(100, 240), window); + .release(0, to, window); QTest::qWait(1); } @@ -1384,6 +1370,35 @@ void tst_qquickflickable::nestedStopAtBounds() QTRY_VERIFY(!outer->isMoving()); } +void tst_qquickflickable::nestedMouseAreaUsingTouch() +{ + QTouchDevice *touchDevice = new QTouchDevice; + touchDevice->setName("Fake Touchscreen"); + touchDevice->setType(QTouchDevice::TouchScreen); + touchDevice->setCapabilities(QTouchDevice::Position); + QWindowSystemInterface::registerTouchDevice(touchDevice); + + QQuickView *window = new QQuickView; + window->setSource(testFileUrl("nestedmousearea.qml")); + window->show(); + QVERIFY(window->rootObject() != 0); + + QQuickFlickable *flickable = qobject_cast<QQuickFlickable*>(window->rootObject()); + QVERIFY(flickable != 0); + + QCOMPARE(flickable->contentY(), 50.0f); + flickWithTouch(window, touchDevice, QPoint(100, 300), QPoint(100, 200)); + + // flickable should not have moved + QCOMPARE(flickable->contentY(), 50.0); + + // draggable item should have moved up + QQuickItem *nested = window->rootObject()->findChild<QQuickItem*>("nested"); + QVERIFY(nested->y() < 100.0); + + delete window; +} + QTEST_MAIN(tst_qquickflickable) #include "tst_qquickflickable.moc" |