diff options
-rw-r--r-- | src/quick/items/qquickmousearea.cpp | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/data/selfDrag.qml | 25 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 72 |
3 files changed, 95 insertions, 4 deletions
diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 9598684e26..b306c0ddf4 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -749,7 +749,7 @@ void QQuickMouseArea::mouseMoveEvent(QMouseEvent *event) if (d->drag->active()) { d->drag->target()->setPosition(boundedDragPos); - d->lastPos = d->lastScenePos - mapToScene(position()); + d->lastPos = mapFromScene(d->lastScenePos); } bool dragOverThresholdX = QQuickWindowPrivate::dragOverThreshold(dragPos.x() - startPos.x(), diff --git a/tests/auto/quick/qquickmousearea/data/selfDrag.qml b/tests/auto/quick/qquickmousearea/data/selfDrag.qml new file mode 100644 index 0000000000..98eaafbfcf --- /dev/null +++ b/tests/auto/quick/qquickmousearea/data/selfDrag.qml @@ -0,0 +1,25 @@ +import QtQuick 2.0 + +Rectangle { + width: 400 + height: 400 + + MouseArea { + id: ma + objectName: "ma" + width: 200 + height: 200 + + drag.target: ma + drag.minimumX: 0 + drag.maximumX: 200 + + Rectangle { + objectName: "fill" + anchors.fill: parent + color: ma.drag.active ? "tomato" : "wheat" + border.color: ma.pressed ? "red" : "transparent" + Text { text: ma.mouseX + ", " + ma.mouseY } + } + } +} diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index 1d22680261..c38ab72a7b 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -104,6 +104,7 @@ private slots: void resetDrag(); void dragging_data() { acceptedButton_data(); } void dragging(); + void selfDrag(); void dragSmoothed(); void dragThreshold_data(); void dragThreshold(); @@ -389,10 +390,10 @@ void tst_QQuickMouseArea::dragging() for (int i = 0; i < 20; i++) { p += QPoint(1, 1); QTest::mouseMove(&window, p); + QTRY_COMPARE(mouseRegion->mouseX(), relativeX); + QCOMPARE(mouseRegion->mouseY(), relativeY); } - QTRY_VERIFY(drag->active()); - QTRY_COMPARE(mouseRegion->mouseX(), relativeX); - QCOMPARE(mouseRegion->mouseY(), relativeY); + QVERIFY(drag->active()); QTest::mouseRelease(&window, button, Qt::NoModifier, p); QTRY_VERIFY(!drag->active()); @@ -400,6 +401,71 @@ void tst_QQuickMouseArea::dragging() QCOMPARE(blackRect->y(), 81.0); } +void tst_QQuickMouseArea::selfDrag() // QTBUG-85111 +{ + QQuickView window; + QByteArray errorMessage; + QVERIFY2(QQuickTest::initView(window, testFileUrl("selfDrag.qml"), true, &errorMessage), errorMessage.constData()); + + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + QVERIFY(window.rootObject() != nullptr); + + QQuickMouseArea *ma = window.rootObject()->findChild<QQuickMouseArea*>("ma"); + QVERIFY(ma != nullptr); + QQuickDrag *drag = ma->drag(); + QVERIFY(drag != nullptr); + QCOMPARE(ma, drag->target()); + + QQuickItem *fillRect = window.rootObject()->findChild<QQuickItem*>("fill"); + QVERIFY(fillRect != nullptr); + + QVERIFY(!drag->active()); + + QPoint p = QPoint(100,100); + QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, p); + + QVERIFY(!drag->active()); + QCOMPARE(ma->x(), 0); + QCOMPARE(ma->y(), 0); + + int dragThreshold = QGuiApplication::styleHints()->startDragDistance(); + + // First move event triggers drag, second is acted upon. + // move the minimum distance to activate drag + p += QPoint(dragThreshold + 1, dragThreshold + 1); + QTest::mouseMove(&window, p); + QVERIFY(!drag->active()); + + // from here on move the item + p += QPoint(1, 1); + QTest::mouseMove(&window, p); + QTRY_VERIFY(drag->active()); + QTRY_COMPARE(ma->x(), 1); + QCOMPARE(ma->y(), 1); + + p += QPoint(10, 10); + QTest::mouseMove(&window, p); + QTRY_VERIFY(drag->active()); + QTRY_COMPARE(ma->x(), 11); + QCOMPARE(ma->y(), 11); + + qreal relativeX = ma->mouseX(); + qreal relativeY = ma->mouseY(); + for (int i = 0; i < 20; i++) { + p += QPoint(1, 1); + QTest::mouseMove(&window, p); + QVERIFY(drag->active()); + QTRY_COMPARE(ma->mouseX(), relativeX); + QCOMPARE(ma->mouseY(), relativeY); + } + + QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p); + QTRY_VERIFY(!drag->active()); + QTRY_COMPARE(ma->x(), 31); + QCOMPARE(ma->y(), 31); +} + void tst_QQuickMouseArea::dragSmoothed() { QQuickView window; |