diff options
author | Martin Jones <martin.jones@qinetic.com.au> | 2016-09-16 17:32:58 +1000 |
---|---|---|
committer | Martin Jones <martin.jones@qinetic.com.au> | 2016-09-22 22:24:28 +0000 |
commit | e05fbf5c8bf636db5c500c3371d673de17de8c33 (patch) | |
tree | eb2acd660ed3547662948f79c5c334b5ea0930e4 | |
parent | ad48b299b7fe0bbed2749adc66725e4f12661f79 (diff) |
Fix MouseArea sticky grab with drag.filterChildren enabled
Task-number: QTBUG-56036
Change-Id: Iad776f42cc776e0d397173b3d2f3922eb7914392
Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
-rw-r--r-- | src/quick/items/qquickmousearea.cpp | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/data/nestedFlickableStopAtBounds.qml | 44 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 93 |
3 files changed, 139 insertions, 0 deletions
diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index d66e55aa12..a8a889d47b 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -666,6 +666,7 @@ void QQuickMouseArea::mousePressEvent(QMouseEvent *event) Q_D(QQuickMouseArea); d->moved = false; d->stealMouse = d->preventStealing; + d->overThreshold = false; if (!d->enabled || !(event->button() & acceptedMouseButtons())) { QQuickItem::mousePressEvent(event); } else { @@ -944,6 +945,7 @@ bool QQuickMouseArea::sendMouseEvent(QMouseEvent *event) if (!d->pressed) { // no other buttons are pressed d->stealMouse = false; + d->overThreshold = false; if (c && c->mouseGrabberItem() == this) ungrabMouse(); emit canceled(); diff --git a/tests/auto/quick/qquickmousearea/data/nestedFlickableStopAtBounds.qml b/tests/auto/quick/qquickmousearea/data/nestedFlickableStopAtBounds.qml new file mode 100644 index 0000000000..0d5b496766 --- /dev/null +++ b/tests/auto/quick/qquickmousearea/data/nestedFlickableStopAtBounds.qml @@ -0,0 +1,44 @@ +import QtQuick 2.5 + + +Rectangle { + width: 240 + height: 320 + + MouseArea { + objectName: "mouseArea" + anchors.fill: parent + + drag.target: moveable + drag.filterChildren: true + + Rectangle { + id: moveable + objectName: "moveable" + color: "red" + x: 50 + y: 80 + width: 200 + height: 200 + } + + Flickable { + objectName: "flickable" + anchors.fill: parent + contentHeight: 450 + + Rectangle { + x: 100 + y: 50 + width: 50 + height: 350 + color: "yellow" + } + + MouseArea { + width: 240 + height: 450 + } + } + } +} diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index d51c228b7c..38253f6ac8 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -117,6 +117,7 @@ private slots: void moveAndReleaseWithoutPress(); void nestedStopAtBounds(); void nestedStopAtBounds_data(); + void nestedFlickableStopAtBounds(); void containsPress_data(); void containsPress(); @@ -1736,6 +1737,98 @@ void tst_QQuickMouseArea::nestedStopAtBounds() QTest::mouseRelease(&view, Qt::LeftButton, 0, position); } +void tst_QQuickMouseArea::nestedFlickableStopAtBounds() +{ + QQuickView view; + QByteArray errorMessage; + QVERIFY2(initView(view, testFileUrl("nestedFlickableStopAtBounds.qml"), false, &errorMessage), errorMessage.constData()); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + QVERIFY(view.rootObject()); + + QQuickMouseArea *mouseArea = view.rootObject()->findChild<QQuickMouseArea*>("mouseArea"); + QVERIFY(mouseArea); + + QQuickFlickable *flickable = mouseArea->findChild<QQuickFlickable*>("flickable"); + QVERIFY(flickable); + + const int threshold = qApp->styleHints()->startDragDistance(); + + QPoint position(200, 280); + int &pos = position.ry(); + + // Drag up - should move the Flickable to end + QTest::mousePress(&view, Qt::LeftButton, 0, position); + QTest::qWait(10); + pos -= threshold * 2; + QTest::mouseMove(&view, position); + pos -= threshold * 2; + QTest::mouseMove(&view, position); + QTest::qWait(10); + pos -= 150; + QTest::mouseMove(&view, position); + QVERIFY(flickable->isDragging()); + QVERIFY(!mouseArea->drag()->active()); + QCOMPARE(flickable->isAtYEnd(), true); + QTest::mouseRelease(&view, Qt::LeftButton, 0, position); + + QTRY_VERIFY(!flickable->isMoving()); + + pos = 280; + + // Drag up again - should activate MouseArea drag + QVERIFY(!mouseArea->drag()->active()); + QTest::mousePress(&view, Qt::LeftButton, 0, position); + QTest::qWait(10); + pos -= threshold * 2; + QTest::mouseMove(&view, position); + pos -= threshold * 2; + QTest::mouseMove(&view, position); + QTest::qWait(10); + pos -= 20; + QTest::mouseMove(&view, position); + QVERIFY(mouseArea->drag()->active()); + QCOMPARE(flickable->isAtYEnd(), true); + QVERIFY(!flickable->isDragging()); + QTest::mouseRelease(&view, Qt::LeftButton, 0, position); + + // Drag to the top and verify that the MouseArea doesn't steal the grab when we drag back (QTBUG-56036) + pos = 50; + + QTest::mousePress(&view, Qt::LeftButton, 0, position); + QTest::qWait(10); + pos += threshold; + QTest::mouseMove(&view, position); + pos += threshold; + QTest::mouseMove(&view, position); + QTest::qWait(10); + pos += 150; + QTest::mouseMove(&view, position); + QVERIFY(flickable->isDragging()); + QVERIFY(!mouseArea->drag()->active()); + QCOMPARE(flickable->isAtYBeginning(), true); + QTest::mouseRelease(&view, Qt::LeftButton, 0, position); + + QTRY_VERIFY(!flickable->isMoving()); + + pos = 280; + + // Drag up again - should not activate MouseArea drag + QTest::mousePress(&view, Qt::LeftButton, 0, position); + QTest::qWait(10); + pos -= threshold; + QTest::mouseMove(&view, position); + pos -= threshold; + QTest::mouseMove(&view, position); + QTest::qWait(10); + pos -= 100; + QTest::mouseMove(&view, position); + QVERIFY(flickable->isDragging()); + QVERIFY(!mouseArea->drag()->active()); + QTest::mouseRelease(&view, Qt::LeftButton, 0, position); +} + void tst_QQuickMouseArea::containsPress_data() { QTest::addColumn<bool>("hoverEnabled"); |