aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickmousearea
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2020-06-29 10:48:27 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2020-06-29 14:21:39 +0200
commit192609f2f8c2f5d8b48716af2166aaa8ad67e80b (patch)
tree6c7eca89ef002b646f08539b59f243936971604f /tests/auto/quick/qquickmousearea
parent53730c5da89dbfa085778749a3ebd438970ab2c2 (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/auto/quick/qquickmousearea')
-rw-r--r--tests/auto/quick/qquickmousearea/data/selfDrag.qml25
-rw-r--r--tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp72
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;