diff options
author | Andrew den Exter <andrew.den.exter@jollamobile.com> | 2013-09-27 14:26:48 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-01 01:50:49 +0200 |
commit | a8b27d974a4ced654a4566b6a9822ed92956a2d2 (patch) | |
tree | e6ac77a3cf040c8a342f0ae8c3098dcae58fcd78 /src/quick | |
parent | 23793482e9b187441203fb629b459245c504dfba (diff) |
Fix PathView stealing mouse grab from its child items.
Apply the improvements that have been applied to Flickables handling of
child items over time to PathView to bring its behavior back in line.
Task-number: QTBUG-33699
Change-Id: I76a412d75c48f9cf2f12f5f6f1aa01ff62d06364
Reviewed-by: Joona Petrell <joona.petrell@jollamobile.com>
Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquickpathview.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/quick/items/qquickpathview.cpp b/src/quick/items/qquickpathview.cpp index 54388ead3c..823885c089 100644 --- a/src/quick/items/qquickpathview.cpp +++ b/src/quick/items/qquickpathview.cpp @@ -1764,37 +1764,48 @@ bool QQuickPathView::sendMouseEvent(QMouseEvent *event) QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; + if (grabber == 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 stealThisEvent = d->stealMouse; - if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab())) { - QMouseEvent mouseEvent(event->type(), localPos, event->windowPos(), event->screenPos(), - event->button(), event->buttons(), event->modifiers()); - mouseEvent.setAccepted(false); + if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab() || grabberDisabled)) { + QScopedPointer<QMouseEvent> mouseEvent(QQuickWindowPrivate::cloneMouseEvent(event, &localPos)); + mouseEvent->setAccepted(false); - switch (mouseEvent.type()) { + switch (mouseEvent->type()) { case QEvent::MouseMove: - d->handleMouseMoveEvent(&mouseEvent); + d->handleMouseMoveEvent(mouseEvent.data()); break; case QEvent::MouseButtonPress: - d->handleMousePressEvent(&mouseEvent); + d->handleMousePressEvent(mouseEvent.data()); stealThisEvent = d->stealMouse; // Update stealThisEvent in case changed by function call above break; case QEvent::MouseButtonRelease: - d->handleMouseReleaseEvent(&mouseEvent); + d->handleMouseReleaseEvent(mouseEvent.data()); break; default: break; } grabber = c->mouseGrabberItem(); - if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) + if ((grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) || grabberDisabled) { grabMouse(); + } - return d->stealMouse; + const bool filtered = stealThisEvent || grabberDisabled; + if (filtered) { + event->setAccepted(false); + } + return filtered; } else if (d->timer.isValid()) { d->timer.invalidate(); d->fixOffset(); } - if (event->type() == QEvent::MouseButtonRelease) + if (event->type() == QEvent::MouseButtonRelease || (grabber && grabber->keepMouseGrab() && !grabberDisabled)) { d->stealMouse = false; + } return false; } |