From 83eb5ba0082cee15a5ca01000084c07fdb19af76 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Tue, 26 Jul 2011 16:28:19 +1000 Subject: A long press should allow onClicked if there is no onPressAndHold Fixes: QTBUG-19726 Change-Id: I896c9264c1cf408dcd533b5d6d463d53c785d787 Reviewed-on: http://codereview.qt.nokia.com/2155 Reviewed-by: Qt Sanity Bot Reviewed-by: Michael Brasser --- src/declarative/items/qsgmousearea.cpp | 2 + .../qsgmousearea/data/noclickandhold.qml | 11 +++++ .../declarative/qsgmousearea/tst_qsgmousearea.cpp | 56 ++++++++++++++++------ 3 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 tests/auto/declarative/qsgmousearea/data/noclickandhold.qml diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index c4b7fc08ca..98ba7022ea 100644 --- a/src/declarative/items/qsgmousearea.cpp +++ b/src/declarative/items/qsgmousearea.cpp @@ -803,6 +803,8 @@ void QSGMouseArea::timerEvent(QTimerEvent *event) emit pressAndHold(&me); if (!me.isAccepted()) d->propagate(&me, QSGMouseAreaPrivate::PressAndHold); + if (!me.isAccepted()) // no one handled the long press - allow click + d->longPress = false; } } } diff --git a/tests/auto/declarative/qsgmousearea/data/noclickandhold.qml b/tests/auto/declarative/qsgmousearea/data/noclickandhold.qml new file mode 100644 index 0000000000..6647de001d --- /dev/null +++ b/tests/auto/declarative/qsgmousearea/data/noclickandhold.qml @@ -0,0 +1,11 @@ +import QtQuick 2.0 + +Item { + id: root + property bool clicked: false + + MouseArea { + width: 200; height: 200 + onClicked: { root.clicked = true } + } +} diff --git a/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp b/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp index bd45c4a0d7..8e711e6ceb 100644 --- a/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp +++ b/tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp @@ -331,27 +331,53 @@ void tst_QSGMouseArea::updateMouseAreaPosOnResize() void tst_QSGMouseArea::noOnClickedWithPressAndHold() { - QSGView *canvas = createView(); - canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickandhold.qml")); - canvas->show(); - canvas->setFocus(); - QVERIFY(canvas->rootObject() != 0); + { + // We handle onPressAndHold, therefore no onClicked + QSGView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickandhold.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); - QApplication::sendEvent(canvas, &pressEvent); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QApplication::sendEvent(canvas, &pressEvent); - QVERIFY(!canvas->rootObject()->property("clicked").toBool()); - QVERIFY(!canvas->rootObject()->property("held").toBool()); + QVERIFY(!canvas->rootObject()->property("clicked").toBool()); + QVERIFY(!canvas->rootObject()->property("held").toBool()); - QTest::qWait(1000); + QTest::qWait(1000); - QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); - QApplication::sendEvent(canvas, &releaseEvent); + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QApplication::sendEvent(canvas, &releaseEvent); - QVERIFY(!canvas->rootObject()->property("clicked").toBool()); - QVERIFY(canvas->rootObject()->property("held").toBool()); + QVERIFY(!canvas->rootObject()->property("clicked").toBool()); + QVERIFY(canvas->rootObject()->property("held").toBool()); - delete canvas; + delete canvas; + } + + { + // We do not handle onPressAndHold, therefore we get onClicked + QSGView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/noclickandhold.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QApplication::sendEvent(canvas, &pressEvent); + + QVERIFY(!canvas->rootObject()->property("clicked").toBool()); + + QTest::qWait(1000); + + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QApplication::sendEvent(canvas, &releaseEvent); + + QVERIFY(canvas->rootObject()->property("clicked").toBool()); + + delete canvas; + } } void tst_QSGMouseArea::onMousePressRejected() -- cgit v1.2.3