diff options
-rw-r--r-- | src/quick/items/qquickmousearea.cpp | 10 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/data/setDragOnPressed.qml | 18 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 49 |
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); |