A long press should allow onClicked if there is no onPressAndHold
authorMartin Jones <martin.jones@nokia.com>
Tue, 26 Jul 2011 06:28:19 +0000 (16:28 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 26 Jul 2011 07:37:52 +0000 (09:37 +0200)
Fixes: QTBUG-19726

Change-Id: I896c9264c1cf408dcd533b5d6d463d53c785d787
Reviewed-on: http://codereview.qt.nokia.com/2155
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
src/declarative/items/qsgmousearea.cpp
tests/auto/declarative/qsgmousearea/data/noclickandhold.qml [new file with mode: 0644]
tests/auto/declarative/qsgmousearea/tst_qsgmousearea.cpp

index c4b7fc0..98ba702 100644 (file)
@@ -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 (file)
index 0000000..6647de0
--- /dev/null
@@ -0,0 +1,11 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+    property bool clicked: false
+
+    MouseArea {
+        width: 200; height: 200
+        onClicked: { root.clicked = true }
+    }
+}
index bd45c4a..8e711e6 100644 (file)
@@ -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()