diff options
author | Martin Jones <martin.jones@jollamobile.com> | 2013-08-12 13:28:17 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-19 02:50:29 +0200 |
commit | 566afc2d2e4156712ffec081715f12307cf46628 (patch) | |
tree | b4f6f77c6898077659fee0c9f449b889f2678880 /src | |
parent | 180180d19545665efbf0f939778845a44cb92003 (diff) |
Dragging MouseArea nested in Flickable does not work with touch to mouse
A MouseArea with a drag target nested in a Flickable does not work.
This is due to QQuickWindow calling childMouseEventFilter() twice -
once in sendFilteredTouchEvent() and later in sendEvent().
Since childMouseEventFilter() has already been called, deliver the
mouse event directly in sendFilteredTouchEvent().
Task-number: QTBUG-32920
Change-Id: I22acee3c66ee6c06e71c9c876fb02dbcb6119a8d
Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 6 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 8 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 46f95f16cb..8fef1c941e 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -982,6 +982,7 @@ void QQuickFlickablePrivate::handleMousePressEvent(QMouseEvent *event) q->setKeepMouseGrab(stealMouse); clearDelayedPress(); pressed = true; + if (hData.transitionToBounds) hData.transitionToBounds->stopTransition(); if (vData.transitionToBounds) @@ -2095,7 +2096,8 @@ bool QQuickFlickable::sendMouseEvent(QQuickItem *item, QMouseEvent *event) d->lastPosTime = -1; returnToBounds(); } - if (event->type() == QEvent::MouseButtonRelease) { + if (event->type() == QEvent::MouseButtonRelease || (grabber && grabber->keepMouseGrab() && !grabberDisabled)) { + // mouse released, or another item has claimed the grab d->lastPosTime = -1; d->clearDelayedPress(); d->stealMouse = false; @@ -2108,7 +2110,7 @@ bool QQuickFlickable::sendMouseEvent(QQuickItem *item, QMouseEvent *event) bool QQuickFlickable::childMouseEventFilter(QQuickItem *i, QEvent *e) { Q_D(QQuickFlickable); - if (!isVisible() || !isEnabled()) + if (!isVisible() || !isEnabled() || !isInteractive()) return QQuickItem::childMouseEventFilter(i, e); switch (e->type()) { case QEvent::MouseButtonPress: diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 525c3d1a0e..0ab929f9a7 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -484,7 +484,7 @@ bool QQuickWindowPrivate::translateTouchToMouse(QQuickItem *item, QTouchEvent *e item->grabMouse(); item->grabTouchPoints(QVector<int>() << touchMouseId); - q->sendEvent(item, mousePress.data()); + QQuickItemPrivate::get(item)->deliverMouseEvent(mousePress.data()); event->setAccepted(mousePress->isAccepted()); if (!mousePress->isAccepted()) { touchMouseId = -1; @@ -497,7 +497,7 @@ bool QQuickWindowPrivate::translateTouchToMouse(QQuickItem *item, QTouchEvent *e if (mousePress->isAccepted() && checkIfDoubleClicked(event->timestamp())) { QScopedPointer<QMouseEvent> mouseDoubleClick(touchToMouseEvent(QEvent::MouseButtonDblClick, p, event, item)); - q->sendEvent(item, mouseDoubleClick.data()); + QQuickItemPrivate::get(item)->deliverMouseEvent(mouseDoubleClick.data()); event->setAccepted(mouseDoubleClick->isAccepted()); if (mouseDoubleClick->isAccepted()) { return true; @@ -518,7 +518,7 @@ bool QQuickWindowPrivate::translateTouchToMouse(QQuickItem *item, QTouchEvent *e if (p.state() & Qt::TouchPointMoved) { if (mouseGrabberItem) { QScopedPointer<QMouseEvent> me(touchToMouseEvent(QEvent::MouseMove, p, event, mouseGrabberItem)); - q->sendEvent(mouseGrabberItem, me.data()); + QQuickItemPrivate::get(item)->deliverMouseEvent(me.data()); event->setAccepted(me->isAccepted()); if (me->isAccepted()) { itemForTouchPointId[p.id()] = mouseGrabberItem; // N.B. the mouseGrabberItem may be different after returning from sendEvent() @@ -548,7 +548,7 @@ bool QQuickWindowPrivate::translateTouchToMouse(QQuickItem *item, QTouchEvent *e touchMouseId = -1; if (mouseGrabberItem) { QScopedPointer<QMouseEvent> me(touchToMouseEvent(QEvent::MouseButtonRelease, p, event, mouseGrabberItem)); - q->sendEvent(mouseGrabberItem, me.data()); + QQuickItemPrivate::get(item)->deliverMouseEvent(me.data()); if (mouseGrabberItem) // might have ungrabbed due to event mouseGrabberItem->ungrabMouse(); return me->isAccepted(); |