diff options
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 30 | ||||
-rw-r--r-- | src/quick/items/qquickflickable_p.h | 2 |
2 files changed, 19 insertions, 13 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 0333f6b9bd..e69c6a8d59 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -2235,21 +2235,28 @@ void QQuickFlickablePrivate::cancelInteraction() } } -bool QQuickFlickable::sendMouseEvent(QQuickItem *item, QMouseEvent *event) +/*! + QQuickFlickable::filterMouseEvent checks filtered mouse events and potentially steals them. + + This is how flickable takes over events from other items (\a receiver) that are on top of it. + It filters their events and may take over (grab) the \a event. + Return true if the mouse event will be stolen. + \internal +*/ +bool QQuickFlickable::filterMouseEvent(QQuickItem *receiver, QMouseEvent *event) { Q_D(QQuickFlickable); QPointF localPos = mapFromScene(event->windowPos()); - QQuickWindow *c = window(); - QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; - if (grabber == this && d->stealMouse) { + Q_ASSERT_X(receiver != this, "", "Flickable received a filter event for itself"); + if (receiver == this && d->stealMouse) { // we are already the grabber and we do want the mouse event to ourselves. return true; } - bool grabberDisabled = grabber && !grabber->isEnabled(); + bool receiverDisabled = receiver && !receiver->isEnabled(); bool stealThisEvent = d->stealMouse; - if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab() || grabberDisabled)) { + if ((stealThisEvent || contains(localPos)) && (!receiver || !receiver->keepMouseGrab() || receiverDisabled)) { QScopedPointer<QMouseEvent> mouseEvent(QQuickWindowPrivate::cloneMouseEvent(event, &localPos)); mouseEvent->setAccepted(false); @@ -2259,7 +2266,7 @@ bool QQuickFlickable::sendMouseEvent(QQuickItem *item, QMouseEvent *event) break; case QEvent::MouseButtonPress: d->handleMousePressEvent(mouseEvent.data()); - d->captureDelayedPress(item, event); + d->captureDelayedPress(receiver, event); stealThisEvent = d->stealMouse; // Update stealThisEvent in case changed by function call above break; case QEvent::MouseButtonRelease: @@ -2269,15 +2276,14 @@ bool QQuickFlickable::sendMouseEvent(QQuickItem *item, QMouseEvent *event) default: break; } - grabber = qobject_cast<QQuickItem*>(c->mouseGrabberItem()); - if ((grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) || grabberDisabled) { + if ((receiver && stealThisEvent && !receiver->keepMouseGrab() && receiver != this) || receiverDisabled) { d->clearDelayedPress(); grabMouse(); } else if (d->delayedPressEvent) { grabMouse(); } - const bool filtered = stealThisEvent || d->delayedPressEvent || grabberDisabled; + const bool filtered = stealThisEvent || d->delayedPressEvent || receiverDisabled; if (filtered) { event->setAccepted(true); } @@ -2286,7 +2292,7 @@ bool QQuickFlickable::sendMouseEvent(QQuickItem *item, QMouseEvent *event) d->lastPosTime = -1; returnToBounds(); } - if (event->type() == QEvent::MouseButtonRelease || (grabber && grabber->keepMouseGrab() && !grabberDisabled)) { + if (event->type() == QEvent::MouseButtonRelease || (receiver && receiver->keepMouseGrab() && !receiverDisabled)) { // mouse released, or another item has claimed the grab d->lastPosTime = -1; d->clearDelayedPress(); @@ -2306,7 +2312,7 @@ bool QQuickFlickable::childMouseEventFilter(QQuickItem *i, QEvent *e) case QEvent::MouseButtonPress: case QEvent::MouseMove: case QEvent::MouseButtonRelease: - return sendMouseEvent(i, static_cast<QMouseEvent *>(e)); + return filterMouseEvent(i, static_cast<QMouseEvent *>(e)); case QEvent::UngrabMouse: if (d->window && d->window->mouseGrabberItem() && d->window->mouseGrabberItem() != this) { // The grab has been taken away from a child and given to some other item. diff --git a/src/quick/items/qquickflickable_p.h b/src/quick/items/qquickflickable_p.h index 318b8ce473..610bfd1427 100644 --- a/src/quick/items/qquickflickable_p.h +++ b/src/quick/items/qquickflickable_p.h @@ -275,7 +275,7 @@ protected: void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; void mouseUngrabEvent() Q_DECL_OVERRIDE; - bool sendMouseEvent(QQuickItem *item, QMouseEvent *event); + bool filterMouseEvent(QQuickItem *receiver, QMouseEvent *event); bool xflick() const; bool yflick() const; |