diff options
author | Andrew den Exter <andrew.den.exter@jollamobile.com> | 2014-03-07 17:54:20 +1000 |
---|---|---|
committer | Andrew den Exter <andrew.den.exter@qinetic.com.au> | 2014-07-22 05:22:04 +0200 |
commit | 71a1288e3d9601d24545ab9650cd079c40766a63 (patch) | |
tree | d5ed4ed025513a9ba9cb6666f957a62fb64ac2f1 /tests/auto/quick/qquickflickable | |
parent | a8a66e51ef5d9506a5458425c7e749935afa649d (diff) |
Don't allow a filtering item to block other filtering items.
With delayed press it's possible for a filtering item to not accept a press
on the first go around but to later steal mouse grab and accept future events.
This means outer items which also filter will have received the mouse press,
but don't receive release events leading to phantom long presses or inadvertent
drags.
Task-number: QTBUG-37316
Change-Id: I2ff18df2a019f8d3a5e81a0adc2c5b5994799862
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Reviewed-by: Martin Jones <martin.jones@jollamobile.com>
Diffstat (limited to 'tests/auto/quick/qquickflickable')
-rw-r--r-- | tests/auto/quick/qquickflickable/data/nestedClickThenFlick.qml | 39 | ||||
-rw-r--r-- | tests/auto/quick/qquickflickable/tst_qquickflickable.cpp | 46 |
2 files changed, 85 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickflickable/data/nestedClickThenFlick.qml b/tests/auto/quick/qquickflickable/data/nestedClickThenFlick.qml new file mode 100644 index 0000000000..619ab6d1dc --- /dev/null +++ b/tests/auto/quick/qquickflickable/data/nestedClickThenFlick.qml @@ -0,0 +1,39 @@ +import QtQuick 2.0 + +Flickable { + property bool pressed: ma.pressed + width: 240 + height: 320 + contentWidth: 480 + contentHeight: 320 + flickableDirection: Flickable.HorizontalFlick + pressDelay: 50 + Rectangle { + anchors.fill: parent + anchors.margins: 50 + color: "yellow" + + } + + onMovingChanged: console.log("outer moving", moving) + + Flickable { + objectName: "innerFlickable" + anchors.fill: parent + flickableDirection: Flickable.VerticalFlick + contentWidth: 480 + contentHeight: 1480 + pressDelay: 50 + Rectangle { + anchors.fill: parent + anchors.margins: 100 + color: ma.pressed ? 'blue' : 'green' + } + MouseArea { + id: ma + objectName: "mouseArea" + anchors.fill: parent + } + } +} + diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp index 7cc3350b05..80aaf5895f 100644 --- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp @@ -75,6 +75,7 @@ private slots: void flickDeceleration(); void pressDelay(); void nestedPressDelay(); + void nestedClickThenFlick(); void flickableDirection(); void resizeContent(); void returnToBounds(); @@ -513,6 +514,51 @@ void tst_qquickflickable::nestedPressDelay() QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(90, 150)); } +// QTBUG-37316 +void tst_qquickflickable::nestedClickThenFlick() +{ + QScopedPointer<QQuickView> window(new QQuickView); + window->setSource(testFileUrl("nestedClickThenFlick.qml")); + QTRY_COMPARE(window->status(), QQuickView::Ready); + QQuickViewTestUtil::centerOnScreen(window.data()); + QQuickViewTestUtil::moveMouseAway(window.data()); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window.data())); + QVERIFY(window->rootObject() != 0); + + QQuickFlickable *outer = qobject_cast<QQuickFlickable*>(window->rootObject()); + QVERIFY(outer != 0); + + QQuickFlickable *inner = window->rootObject()->findChild<QQuickFlickable*>("innerFlickable"); + QVERIFY(inner != 0); + + QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(150, 150)); + + // the MouseArea is not pressed immediately + QVERIFY(outer->property("pressed").toBool() == false); + QTRY_VERIFY(outer->property("pressed").toBool() == true); + + QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(150, 150)); + + QVERIFY(outer->property("pressed").toBool() == false); + + // Dragging inner Flickable should work + QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(80, 150)); + // the MouseArea is not pressed immediately + + QVERIFY(outer->property("pressed").toBool() == false); + + QTest::mouseMove(window.data(), QPoint(80, 148)); + QTest::mouseMove(window.data(), QPoint(80, 140)); + QTest::mouseMove(window.data(), QPoint(80, 120)); + QTest::mouseMove(window.data(), QPoint(80, 100)); + + QVERIFY(outer->property("moving").toBool() == false); + QVERIFY(inner->property("moving").toBool() == true); + + QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(80, 100)); +} + void tst_qquickflickable::flickableDirection() { QQmlComponent component(&engine); |