Fix setting drag properties in mousePress.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Fri, 11 May 2012 01:01:33 +0000 (11:01 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 14 May 2012 03:36:33 +0000 (05:36 +0200)
Cache the dragX and dragY properties after the onPressed
signal has been emitted to allow for deferred creation of the drag
object or changes to the axis property in the handler.

Change-Id: If154e661359c82e957fcf0cbc11ccc1f75bee919
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquickmousearea.cpp
tests/auto/quick/qquickmousearea/data/setDragOnPressed.qml [new file with mode: 0644]
tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp

index d2c9dd9..1d768a5 100644 (file)
@@ -188,7 +188,7 @@ QQuickDragAttached *QQuickDrag::qmlAttachedProperties(QObject *obj)
 
 QQuickMouseAreaPrivate::QQuickMouseAreaPrivate()
 : enabled(true), hovered(false), pressed(false), longPress(false),
-  moved(false), stealMouse(false), doubleClick(false), preventStealing(false),
+  moved(false), dragX(true), dragY(true), stealMouse(false), doubleClick(false), preventStealing(false),
   propagateComposedEvents(false), drag(0)
 {
 }
@@ -696,10 +696,6 @@ void QQuickMouseArea::mousePressEvent(QMouseEvent *event)
     else {
         d->longPress = false;
         d->saveEvent(event);
-        if (d->drag) {
-            d->dragX = drag()->axis() & QQuickDrag::XAxis;
-            d->dragY = drag()->axis() & QQuickDrag::YAxis;
-        }
         if (d->drag)
             d->drag->setActive(false);
         setHovered(true);
@@ -708,6 +704,10 @@ void QQuickMouseArea::mousePressEvent(QMouseEvent *event)
         setKeepMouseGrab(d->stealMouse);
         event->setAccepted(setPressed(true));
 
+        if (d->drag) {
+            d->dragX = drag()->axis() & QQuickDrag::XAxis;
+            d->dragY = drag()->axis() & QQuickDrag::YAxis;
+        }
     }
 }
 
diff --git a/tests/auto/quick/qquickmousearea/data/setDragOnPressed.qml b/tests/auto/quick/qquickmousearea/data/setDragOnPressed.qml
new file mode 100644 (file)
index 0000000..fc57319
--- /dev/null
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+MouseArea {
+    width: 200; height: 200
+
+    Item {
+        id: dragTarget
+        objectName: "target"
+        x: 50; y: 50
+        width: 100; height: 100
+    }
+
+    onPressed: {
+        drag.target = dragTarget
+        drag.axis = Drag.XAxis
+    }
+    onReleased: drag.target = null
+}
index 476ce81..2457ba7 100644 (file)
@@ -59,6 +59,7 @@ private slots:
     void dragProperties();
     void resetDrag();
     void dragging();
+    void setDragOnPressed();
     void updateMouseAreaPosOnClick();
     void updateMouseAreaPosOnResize();
     void noOnClickedWithPressAndHold();
@@ -255,6 +256,54 @@ void tst_QQuickMouseArea::dragging()
     delete canvas;
 }
 
+void tst_QQuickMouseArea::setDragOnPressed()
+{
+    QQuickView *canvas = createView();
+
+    canvas->setSource(testFileUrl("setDragOnPressed.qml"));
+    canvas->show();
+    canvas->requestActivateWindow();
+    QTest::qWait(20);
+    QVERIFY(canvas->rootObject() != 0);
+
+    QQuickMouseArea *mouseArea = qobject_cast<QQuickMouseArea *>(canvas->rootObject());
+    QVERIFY(mouseArea);
+
+    // target
+    QQuickItem *target = mouseArea->findChild<QQuickItem*>("target");
+    QVERIFY(target);
+
+    QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100));
+
+    QQuickDrag *drag = mouseArea->drag();
+    QVERIFY(drag);
+    QVERIFY(!drag->active());
+
+    QCOMPARE(target->x(), 50.0);
+    QCOMPARE(target->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,102));
+    QTest::qWait(50);
+    QTest::mouseMove(canvas, QPoint(122,122));
+    QTest::qWait(50);
+
+    QVERIFY(drag->active());
+    QCOMPARE(target->x(), 72.0);
+    QCOMPARE(target->y(), 50.0);
+
+    QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(122,122));
+    QTest::qWait(50);
+
+    QVERIFY(!drag->active());
+    QCOMPARE(target->x(), 72.0);
+    QCOMPARE(target->y(), 50.0);
+
+    delete canvas;
+}
+
 QQuickView *tst_QQuickMouseArea::createView()
 {
     QQuickView *canvas = new QQuickView(0);