switch (mouseEvent->type()) {
case QEvent::MouseMove:
+ if (d->delayedPressEvent) {
+ // A move beyond the threshold replays the press to give nested Flickables
+ // the opportunity to grab the gesture.
+ QPointF delta = event->localPos() - d->delayedPressEvent->localPos();
+ if (QQuickWindowPrivate::dragOverThreshold(qAbs(delta.x()), Qt::XAxis, event)
+ || QQuickWindowPrivate::dragOverThreshold(qAbs(delta.y()), Qt::YAxis, event)) {
+ // We replay the mouse press but the grabber we had might not be interested in the event (e.g. overlay)
+ // so we reset the grabber
+ if (c->mouseGrabberItem() == d->delayedPressTarget)
+ d->delayedPressTarget->ungrabMouse();
+ // Use the event handler that will take care of finding the proper item to propagate the event
+ QQuickWindowPrivate::get(window())->deliverMouseEvent(d->delayedPressEvent);
+ d->clearDelayedPress();
+ // continue on to handle mouse move event
+ }
+ }
d->handleMouseMoveEvent(mouseEvent.data());
break;
case QEvent::MouseButtonPress:
contentHeight: 320
flickableDirection: Flickable.HorizontalFlick
pressDelay: 50
- Flickable {
- objectName: "innerFlickable"
- flickableDirection: Flickable.VerticalFlick
- width: 480
- height: 320
- contentWidth: 480
- contentHeight: 400
- pressDelay: 10000
- Rectangle {
- y: 100
- anchors.horizontalCenter: parent.horizontalCenter
- width: 240
- height: 100
- color: ma.pressed ? 'blue' : 'green'
- MouseArea {
- id: ma
- objectName: "mouseArea"
- anchors.fill: parent
+ Rectangle {
+ x: 20
+ y: 20
+ width: 400
+ height: 300
+ color: "yellow"
+ Flickable {
+ objectName: "innerFlickable"
+ anchors.fill: parent
+ flickableDirection: Flickable.HorizontalFlick
+ contentWidth: 1480
+ contentHeight: 400
+ pressDelay: 10000
+ Rectangle {
+ y: 100
+ x: 80
+ width: 240
+ height: 100
+ color: ma.pressed ? 'blue' : 'green'
+ MouseArea {
+ id: ma
+ objectName: "mouseArea"
+ anchors.fill: parent
+ }
}
}
}
QTest::mouseRelease(window, Qt::LeftButton, 0, QPoint(150, 150));
+ // Dragging inner Flickable should work
+ QTest::mousePress(window, Qt::LeftButton, 0, QPoint(80, 150));
+ // the MouseArea is not pressed immediately
+ QVERIFY(outer->property("pressed").toBool() == false);
+
+ QTest::mouseMove(window, QPoint(60, 150));
+ QTest::mouseMove(window, QPoint(40, 150));
+ QTest::mouseMove(window, QPoint(20, 150));
+
+ QVERIFY(outer->property("moving").toBool() == false);
+ QVERIFY(inner->property("moving").toBool() == true);
+
+ QTest::mouseRelease(window, Qt::LeftButton, 0, QPoint(20, 150));
+
+ // Dragging the MouseArea in the inner Flickable should move the inner Flickable
+ QTest::mousePress(window, Qt::LeftButton, 0, QPoint(150, 150));
+ // the MouseArea is not pressed immediately
+ QVERIFY(outer->property("pressed").toBool() == false);
+
+ QTest::mouseMove(window, QPoint(130, 150));
+ QTest::mouseMove(window, QPoint(110, 150));
+ QTest::mouseMove(window, QPoint(90, 150));
+
+
+ QVERIFY(outer->property("moving").toBool() == false);
+ QVERIFY(inner->property("moving").toBool() == true);
+
+ QTest::mouseRelease(window, Qt::LeftButton, 0, QPoint(90, 150));
+
delete window;
}