diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 4af728d14fac568f907584304128564351f5a50f..dc7ba96c35dbd09df1e230298c82452be4b0b1c9 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -843,6 +843,7 @@ void QQuickMouseArea::ungrabMouse() // state d->pressed = 0; d->stealMouse = false; + d->doubleClick = false; setKeepMouseGrab(false); #ifndef QT_NO_DRAGANDDROP diff --git a/tests/auto/quick/qquickmousearea/data/pressedCanceled.qml b/tests/auto/quick/qquickmousearea/data/pressedCanceled.qml index 14630b89627e8a6b7f78e2d66385a3adbc26d15d..9079cbdfce2bc7393ced4945e6b56db69dde2152 100644 --- a/tests/auto/quick/qquickmousearea/data/pressedCanceled.qml +++ b/tests/auto/quick/qquickmousearea/data/pressedCanceled.qml @@ -7,7 +7,9 @@ Rectangle { width: 320; height: 240 property bool pressed:mouse.pressed property bool canceled: false - property bool released: false + property int clicked: 0 + property int doubleClicked: 0 + property int released: 0 property alias secondWindow: secondWindow Window { @@ -20,6 +22,8 @@ Rectangle { anchors.fill: parent onPressed: { root.canceled = false } onCanceled: {root.canceled = true} - onReleased: {root.released = true; root.canceled = false} + onReleased: {root.released++; root.canceled = false} + onClicked: {root.clicked++} + onDoubleClicked: {root.doubleClicked++} } } diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index 99634c55e5828ec086651faa546376151c4769f6..2fd2e039660f79a2650ecf9929e3eb768f321e14 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -88,6 +88,7 @@ private slots: void updateMouseAreaPosOnResize(); void noOnClickedWithPressAndHold(); void onMousePressRejected(); + void pressedCanceledOnWindowDeactivate_data(); void pressedCanceledOnWindowDeactivate(); void doubleClick_data() { acceptedButton_data(); } void doubleClick(); @@ -731,8 +732,19 @@ void tst_QQuickMouseArea::onMousePressRejected() QVERIFY(!window.rootObject()->property("mr1_canceled").toBool()); QVERIFY(!window.rootObject()->property("mr2_released").toBool()); } + +void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate_data() +{ + QTest::addColumn<bool>("doubleClick"); + QTest::newRow("simple click") << false; + QTest::newRow("double click") << true; +} + + void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate() { + QFETCH(bool, doubleClick); + QQuickView window; QByteArray errorMessage; QVERIFY2(initView(window, testFileUrl("pressedCanceled.qml"), true, &errorMessage), errorMessage.constData()); @@ -741,14 +753,41 @@ void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate() QVERIFY(window.rootObject() != 0); QVERIFY(!window.rootObject()->property("pressed").toBool()); QVERIFY(!window.rootObject()->property("canceled").toBool()); - QVERIFY(!window.rootObject()->property("released").toBool()); + + int expectedRelease = 0; + int expectedClicks = 0; + QCOMPARE(window.rootObject()->property("released").toInt(), expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), expectedClicks); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QGuiApplication::sendEvent(&window, &pressEvent); QVERIFY(window.rootObject()->property("pressed").toBool()); QVERIFY(!window.rootObject()->property("canceled").toBool()); - QVERIFY(!window.rootObject()->property("released").toBool()); + QCOMPARE(window.rootObject()->property("released").toInt(), expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), expectedClicks); + + if (doubleClick) { + QGuiApplication::sendEvent(&window, &releaseEvent); + QVERIFY(!window.rootObject()->property("pressed").toBool()); + QVERIFY(!window.rootObject()->property("canceled").toBool()); + QCOMPARE(window.rootObject()->property("released").toInt(), ++expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), ++expectedClicks); + + QGuiApplication::sendEvent(&window, &pressEvent); + QMouseEvent pressEvent2(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QGuiApplication::sendEvent(&window, &pressEvent2); + + QVERIFY(window.rootObject()->property("pressed").toBool()); + QVERIFY(!window.rootObject()->property("canceled").toBool()); + QCOMPARE(window.rootObject()->property("released").toInt(), expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), expectedClicks); + QCOMPARE(window.rootObject()->property("doubleClicked").toInt(), 1); + } + QWindow *secondWindow = qvariant_cast<QWindow*>(window.rootObject()->property("secondWindow")); secondWindow->setProperty("visible", true); @@ -756,22 +795,24 @@ void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate() QVERIFY(!window.rootObject()->property("pressed").toBool()); QVERIFY(window.rootObject()->property("canceled").toBool()); - QVERIFY(!window.rootObject()->property("released").toBool()); + QCOMPARE(window.rootObject()->property("released").toInt(), expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), expectedClicks); //press again QGuiApplication::sendEvent(&window, &pressEvent); QVERIFY(window.rootObject()->property("pressed").toBool()); QVERIFY(!window.rootObject()->property("canceled").toBool()); - QVERIFY(!window.rootObject()->property("released").toBool()); + QCOMPARE(window.rootObject()->property("released").toInt(), expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), expectedClicks); QTest::qWait(200); //release - QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); QGuiApplication::sendEvent(&window, &releaseEvent); QVERIFY(!window.rootObject()->property("pressed").toBool()); QVERIFY(!window.rootObject()->property("canceled").toBool()); - QVERIFY(window.rootObject()->property("released").toBool()); + QCOMPARE(window.rootObject()->property("released").toInt(), ++expectedRelease); + QCOMPARE(window.rootObject()->property("clicked").toInt(), ++expectedClicks); } void tst_QQuickMouseArea::doubleClick()