diff options
Diffstat (limited to 'src/quicktemplates2/qquickdrawer.cpp')
-rw-r--r-- | src/quicktemplates2/qquickdrawer.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/quicktemplates2/qquickdrawer.cpp b/src/quicktemplates2/qquickdrawer.cpp index 7de548e6ff..1d89948b4d 100644 --- a/src/quicktemplates2/qquickdrawer.cpp +++ b/src/quicktemplates2/qquickdrawer.cpp @@ -427,6 +427,13 @@ bool QQuickDrawerPrivate::grabTouch(QQuickItem *item, QTouchEvent *event) static const qreal openCloseVelocityThreshold = 300; +// Overrides QQuickPopupPrivate::blockInput, which is called by +// QQuickPopupPrivate::handlePress/Move/Release, which we call in our own +// handlePress/Move/Release overrides. +// This implementation conflates two things: should the event going to the item get +// modally blocked by us? Or should we accept the event and become the grabber? +// Those are two fundamentally different questions for the drawer as a (usually) +// interactive control. bool QQuickDrawerPrivate::blockInput(QQuickItem *item, const QPointF &point) const { Q_Q(const QQuickDrawer); @@ -457,7 +464,7 @@ bool QQuickDrawerPrivate::handlePress(QQuickItem *item, const QPointF &point, ul velocityCalculator.startMeasuring(point, timestamp); if (!QQuickPopupPrivate::handlePress(item, point, timestamp)) - return false; + return interactive && popupItem == item; return true; } @@ -481,6 +488,12 @@ bool QQuickDrawerPrivate::handleMove(QQuickItem *item, const QPointF &point, ulo bool QQuickDrawerPrivate::handleRelease(QQuickItem *item, const QPointF &point, ulong timestamp) { + auto cleanup = qScopeGuard([this] { + popupItem->setKeepMouseGrab(false); + popupItem->setKeepTouchGrab(false); + pressPoint = QPointF(); + touchId = -1; + }); if (pressPoint.isNull()) return false; if (!popupItem->keepMouseGrab() && !popupItem->keepTouchGrab()) { @@ -540,14 +553,8 @@ bool QQuickDrawerPrivate::handleRelease(QQuickItem *item, const QPointF &point, } } - bool wasGrabbed = popupItem->keepMouseGrab() || popupItem->keepTouchGrab(); - popupItem->setKeepMouseGrab(false); - popupItem->setKeepTouchGrab(false); - - pressPoint = QPointF(); - touchId = -1; - - return wasGrabbed; + // the cleanup() lambda will run before return + return popupItem->keepMouseGrab() || popupItem->keepTouchGrab(); } void QQuickDrawerPrivate::handleUngrab() @@ -811,3 +818,5 @@ void QQuickDrawer::geometryChange(const QRectF &newGeometry, const QRectF &oldGe } QT_END_NAMESPACE + +#include "moc_qquickdrawer_p.cpp" |