diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-02-10 10:01:39 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-02-17 13:22:52 +0000 |
commit | e9a2155cfd76666043dee8c034708a0149f3e2e6 (patch) | |
tree | 1cbf4282fd29c50c22d1b915927f6a42ad972613 /src/quick/handlers/qquickpointerhandler.cpp | |
parent | 7042cfd9cb1b552c5fd753b6912439ce604eb1a0 (diff) |
DragHandler: keep the grab (prevent stealing) when dragging
Whenever the DragHandler gets an exclusive grab, it needs to prevent
a parent Flickable (for example) from taking over that grab. Since
it waits until the drag threshold is exceeded in an allowed dragging
direction, this does not prevent the Flickable from being draggable
in the other direction.
We restore the state of keepTouchGrab and keepMouseGrab when ungrabbing.
Change-Id: Id9d456c99322e0cb6996d1f690b38fcd6becc6f9
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/quick/handlers/qquickpointerhandler.cpp')
-rw-r--r-- | src/quick/handlers/qquickpointerhandler.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/quick/handlers/qquickpointerhandler.cpp b/src/quick/handlers/qquickpointerhandler.cpp index 641324e61e..90d07b5d6d 100644 --- a/src/quick/handlers/qquickpointerhandler.cpp +++ b/src/quick/handlers/qquickpointerhandler.cpp @@ -62,6 +62,8 @@ QQuickPointerHandler::QQuickPointerHandler(QObject *parent) , m_enabled(true) , m_active(false) , m_targetExplicitlySet(false) + , m_hadKeepMouseGrab(false) + , m_hadKeepTouchGrab(false) { } @@ -92,12 +94,20 @@ void QQuickPointerHandler::setExclusiveGrab(QQuickEventPoint *point, bool grab) { QQuickPointerHandler *oldGrabber = point->grabberPointerHandler(); if (grab && oldGrabber != this) { + if (target()) { + m_hadKeepMouseGrab = target()->keepMouseGrab(); + m_hadKeepTouchGrab = target()->keepTouchGrab(); + } if (oldGrabber) oldGrabber->handleGrabCancel(point); point->setGrabberPointerHandler(this, true); onGrabChanged(point); // emit grabChanged(point); // TODO maybe } else if (!grab && oldGrabber == this) { + if (auto tgt = target()) { + tgt->setKeepMouseGrab(m_hadKeepMouseGrab); + tgt->setKeepTouchGrab(m_hadKeepTouchGrab); + } point->setGrabberPointerHandler(nullptr, true); onGrabChanged(point); // emit grabChanged(point); // TODO maybe |