diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2016-10-07 13:53:42 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2016-10-07 14:25:36 +0200 |
commit | 99ba991ad732f4ea8f89bd7f13d97af1686e9a8b (patch) | |
tree | 27d4b4c04511283bcbb1b961a2156b4aeeea3f86 /src/quick/items/qquickflickable.cpp | |
parent | b026715ff336f1493579145269a7323ed15b22e3 (diff) | |
parent | 57c9d6969ac474177c77d5ea59768b39620a3b2f (diff) |
Merge remote-tracking branch 'origin/5.8' into wip/pointerhandler
Change-Id: I22cb14c061dc1738fd711756a6bcabd4a25be915
Diffstat (limited to 'src/quick/items/qquickflickable.cpp')
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index d521abec6a..6160e1ca1a 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -2238,21 +2238,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); @@ -2262,7 +2269,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: @@ -2272,15 +2279,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); } @@ -2289,7 +2295,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(); @@ -2309,7 +2315,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. |