aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickmousearea.cpp10
-rw-r--r--tests/auto/quick/qquickmousearea/data/setDragOnPressed.qml18
-rw-r--r--tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp49
3 files changed, 72 insertions, 5 deletions
diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp
index d2c9dd9162..1d768a531a 100644
--- a/src/quick/items/qquickmousearea.cpp
+++ b/src/quick/items/qquickmousearea.cpp
@@ -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
index 0000000000..fc57319d75
--- /dev/null
+++ b/tests/auto/quick/qquickmousearea/data/setDragOnPressed.qml
@@ -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
+}
diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
index 476ce8144a..2457ba727a 100644
--- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
+++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
@@ -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);