diff options
author | Martin Jones <martin.jones@jollamobile.com> | 2014-01-08 17:04:35 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-09 00:54:55 +0100 |
commit | 8673ae8bb6d4bac01cc54638a7d617072299a808 (patch) | |
tree | d76fc05c7dfa0a9f041dd9d5afe45bf19e028c40 | |
parent | 66e72c2cf08c2d2c381c6c22e4760d0df758af52 (diff) |
Fix Flickable generated release event with pressDelay.
Map mouse position to grabber when forwarding release event due to
release before pressDelay timeout.
Task-number: QTBUG-34570
Change-Id: I7214077c9ac95f77407cf66f9dad52f577eccd79
Reviewed-by: Matthew Vogt <matthew.vogt@qinetic.com.au>
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 6 | ||||
-rw-r--r-- | tests/auto/quick/qquickflickable/data/pressDelay.qml | 14 | ||||
-rw-r--r-- | tests/auto/quick/qquickflickable/tst_qquickflickable.cpp | 23 |
3 files changed, 42 insertions, 1 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 3b592004c9..7cc37e0556 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -1234,7 +1234,11 @@ void QQuickFlickable::mouseReleaseEvent(QMouseEvent *event) d->replayDelayedPress(); // Now send the release - window()->sendEvent(window()->mouseGrabberItem(), event); + if (window()->mouseGrabberItem()) { + QPointF localPos = window()->mouseGrabberItem()->mapFromScene(event->windowPos()); + QScopedPointer<QMouseEvent> mouseEvent(QQuickWindowPrivate::cloneMouseEvent(event, &localPos)); + window()->sendEvent(window()->mouseGrabberItem(), mouseEvent.data()); + } // And the event has been consumed d->stealMouse = false; diff --git a/tests/auto/quick/qquickflickable/data/pressDelay.qml b/tests/auto/quick/qquickflickable/data/pressDelay.qml index 18a5840504..a69c4af6de 100644 --- a/tests/auto/quick/qquickflickable/data/pressDelay.qml +++ b/tests/auto/quick/qquickflickable/data/pressDelay.qml @@ -8,6 +8,11 @@ Flickable { contentHeight: 400 pressDelay: 100 + property real pressX + property real pressY + property real releaseX + property real releaseY + MouseArea { id: ma objectName: "mouseArea" @@ -16,6 +21,15 @@ Flickable { width: 240 height: 100 + onPressed: { + pressX = mouse.x + pressY = mouse.y + } + onReleased: { + releaseX = mouse.x + releaseY = mouse.y + } + Rectangle { anchors.fill: parent color: parent.pressed ? 'blue' : 'green' diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp index 794f9a8af6..86321c775e 100644 --- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp @@ -412,6 +412,29 @@ void tst_qquickflickable::pressDelay() QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(150, 150)); QCOMPARE(clickedSpy.count(),1); + // Press and release position should match + QCOMPARE(flickable->property("pressX").toReal(), flickable->property("releaseX").toReal()); + QCOMPARE(flickable->property("pressY").toReal(), flickable->property("releaseY").toReal()); + + + // Test a quick tap within the pressDelay timeout + clickedSpy.clear(); + QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(180, 180)); + + // The press should not occur immediately + QVERIFY(mouseArea->property("pressed").toBool() == false); + + QCOMPARE(clickedSpy.count(),0); + + // On release the press, release and clicked signal should be emitted + QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(180, 180)); + QCOMPARE(clickedSpy.count(),1); + + // Press and release position should match + QCOMPARE(flickable->property("pressX").toReal(), flickable->property("releaseX").toReal()); + QCOMPARE(flickable->property("pressY").toReal(), flickable->property("releaseY").toReal()); + + // QTBUG-31168 QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(150, 110)); |