diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-06-29 10:48:27 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-06-29 14:21:39 +0200 |
commit | 192609f2f8c2f5d8b48716af2166aaa8ad67e80b (patch) | |
tree | 6c7eca89ef002b646f08539b59f243936971604f /tests | |
parent | 53730c5da89dbfa085778749a3ebd438970ab2c2 (diff) |
Fix MouseArea mouseX/mouseY coordinates while dragging
When MouseArea is not anchored with the usual anchors.fill: parent,
such that its position is not 0,0, calculating mouseX/mouseY as
d->lastScenePos - mapToScene(position()) was wrong. It could be
d->lastScenePos - mapToScene(QPointF()), but instead we use
mapFromScene(d->lastScenePos) as in a few other places.
Amends 8068e7b98cde09565efe27585b84e120f9c5ea99.
Pick-to: 5.15
Fixes: QTBUG-85111
Task-number: QTBUG-75993
Change-Id: If1440d05ec3b75d9f9f4802fbc361756fadb559e
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quick/qquickmousearea/data/selfDrag.qml | 25 | ||||
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 72 |
2 files changed, 94 insertions, 3 deletions
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; |