From 192609f2f8c2f5d8b48716af2166aaa8ad67e80b Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Mon, 29 Jun 2020 10:48:27 +0200 Subject: 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 Reviewed-by: Volker Hilsheimer --- tests/auto/quick/qquickmousearea/data/selfDrag.qml | 25 ++++++++ .../quick/qquickmousearea/tst_qquickmousearea.cpp | 72 +++++++++++++++++++++- 2 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 tests/auto/quick/qquickmousearea/data/selfDrag.qml (limited to 'tests/auto/quick/qquickmousearea') 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("ma"); + QVERIFY(ma != nullptr); + QQuickDrag *drag = ma->drag(); + QVERIFY(drag != nullptr); + QCOMPARE(ma, drag->target()); + + QQuickItem *fillRect = window.rootObject()->findChild("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; -- cgit v1.2.3