From: Martin Jones Date: Tue, 26 Jul 2011 06:28:19 +0000 (+1000) Subject: A long press should allow onClicked if there is no onPressAndHold X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=83eb5ba0082cee15a5ca01000084c07fdb19af76;p=konrad%2Fqtdeclarative.git 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 --- diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index c4b7fc0..98ba702 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 0000000..6647de0 --- /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 bd45c4a..8e711e6 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()