diff options
author | Martin Jones <martin.jones@nokia.com> | 2012-03-05 15:07:27 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-05 23:31:48 +0100 |
commit | 3f62886ac84b31c5c8f90205583dc65e811ad20b (patch) | |
tree | 5e78818004f64e491621265d7af8a73ee5b9712c /tests/auto/quick/qquickmousearea | |
parent | 43ffdc3fc02eb058d7d458cb16a9c3cf07ea68eb (diff) |
Handle MouseArea.enabled = false after mouse is pressed.
Currently this leaves the MouseArea in a broken state,
i.e. still in pressed state, and the next press after
it is re-enabled is ignored.
In this case we now allow subsequent mouse move or
release events to continue. Following the release,
no further press will be accepted.
Change-Id: I65a890da90e2166ad568505fffdbd3db6c97165b
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
Diffstat (limited to 'tests/auto/quick/qquickmousearea')
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index 0fb82a66bc..4375e835aa 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -72,6 +72,7 @@ private slots: void hoverPosition(); void hoverPropagation(); void hoverVisible(); + void disableAfterPress(); private: QQuickView *createView(); @@ -801,6 +802,110 @@ void tst_QQuickMouseArea::hoverVisible() delete canvas; } +void tst_QQuickMouseArea::disableAfterPress() +{ + QQuickView *canvas = createView(); + canvas->setSource(testFileUrl("dragging.qml")); + canvas->show(); + canvas->requestActivateWindow(); + QTest::qWait(20); + QVERIFY(canvas->rootObject() != 0); + + QQuickMouseArea *mouseArea = canvas->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); + QQuickDrag *drag = mouseArea->drag(); + QVERIFY(mouseArea != 0); + QVERIFY(drag != 0); + + QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QQuickMouseEvent*))); + QSignalSpy mousePressSpy(mouseArea, SIGNAL(pressed(QQuickMouseEvent*))); + QSignalSpy mouseReleaseSpy(mouseArea, SIGNAL(released(QQuickMouseEvent*))); + + // target + QQuickItem *blackRect = canvas->rootObject()->findChild<QQuickItem*>("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == drag->target()); + + QVERIFY(!drag->active()); + + QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100)); + + QTRY_COMPARE(mousePressSpy.count(), 1); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 50.0); + QCOMPARE(blackRect->y(), 50.0); + + // First move event triggers drag, second is acted upon. + // This is due to possibility of higher stacked area taking precedence. + + QTest::mouseMove(canvas, QPoint(111,111)); + QTest::qWait(50); + QTest::mouseMove(canvas, QPoint(122,122)); + + QTRY_COMPARE(mousePositionSpy.count(), 2); + + QVERIFY(drag->active()); + QCOMPARE(blackRect->x(), 72.0); + QCOMPARE(blackRect->y(), 72.0); + + mouseArea->setEnabled(false); + + // move should still be acted upon + QTest::mouseMove(canvas, QPoint(133,133)); + QTest::qWait(50); + QTest::mouseMove(canvas, QPoint(144,144)); + + QTRY_COMPARE(mousePositionSpy.count(), 4); + + QVERIFY(drag->active()); + QCOMPARE(blackRect->x(), 94.0); + QCOMPARE(blackRect->y(), 94.0); + + QVERIFY(mouseArea->pressed()); + QVERIFY(mouseArea->hovered()); + + QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(144,144)); + + QTRY_COMPARE(mouseReleaseSpy.count(), 1); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 94.0); + QCOMPARE(blackRect->y(), 94.0); + + QVERIFY(!mouseArea->pressed()); + QVERIFY(!mouseArea->hovered()); // since hover is not enabled + + // Next press will be ignored + blackRect->setX(50); + blackRect->setY(50); + + mousePressSpy.clear(); + mousePositionSpy.clear(); + mouseReleaseSpy.clear(); + + QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100)); + QTest::qWait(50); + QCOMPARE(mousePressSpy.count(), 0); + + QTest::mouseMove(canvas, QPoint(111,111)); + QTest::qWait(50); + QTest::mouseMove(canvas, QPoint(122,122)); + QTest::qWait(50); + + QCOMPARE(mousePositionSpy.count(), 0); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 50.0); + QCOMPARE(blackRect->y(), 50.0); + + QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(122,122)); + QTest::qWait(50); + + QCOMPARE(mouseReleaseSpy.count(), 0); + + delete canvas; +} + QTEST_MAIN(tst_QQuickMouseArea) #include "tst_qquickmousearea.moc" |