diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-02-16 10:48:37 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-02-23 18:26:46 +0000 |
commit | 59c753bc75c7cfd4068fbbba3c25e1f54c46f4c0 (patch) | |
tree | 8998c236fe9ac9796a0b05f1501b2442b6d5c02a /src | |
parent | e53510944169ac9f6753e0d14e1b24a24ff7bd9a (diff) |
QQuickWindowPrivate::deliverTouchCancelEvent: deliver to handlers too
Now that onGrabChanged() is unified, we have a means to tell the
handler when it loses its grab due to a touch event being canceled.
Change-Id: Idf3649242233ac7fb8c1fa80ad257ee14b861090
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/handlers/qquickpointerhandler_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquickevents.cpp | 16 | ||||
-rw-r--r-- | src/quick/items/qquickevents_p_p.h | 5 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 15 |
4 files changed, 23 insertions, 14 deletions
diff --git a/src/quick/handlers/qquickpointerhandler_p.h b/src/quick/handlers/qquickpointerhandler_p.h index b5da8cba1f..24a058275d 100644 --- a/src/quick/handlers/qquickpointerhandler_p.h +++ b/src/quick/handlers/qquickpointerhandler_p.h @@ -115,6 +115,7 @@ private: bool m_hadKeepTouchGrab : 1; // some handlers override target()->setKeepTouchGrab(); this remembers previous state friend class QQuickEventPoint; + friend class QQuickWindowPrivate; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index a7ab0f01b0..bbea32f905 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -681,16 +681,26 @@ void QQuickEventPoint::setGrabberPointerHandler(QQuickPointerHandler *grabber, b */ void QQuickEventPoint::cancelExclusiveGrab() { - if (m_exclusiveGrabber.isNull()) { + if (m_exclusiveGrabber.isNull()) qWarning("cancelGrab: no grabber"); + else + cancelExclusiveGrabImpl(); +} + +void QQuickEventPoint::cancelExclusiveGrabImpl(QTouchEvent *cancelEvent) +{ + if (m_exclusiveGrabber.isNull()) return; - } if (Q_UNLIKELY(lcPointerGrab().isDebugEnabled())) { qCDebug(lcPointerGrab) << pointDeviceName(this) << "point" << hex << m_pointId << pointStateString(this) << ": grab (exclusive)" << m_exclusiveGrabber << "-> nullptr"; } - if (auto handler = grabberPointerHandler()) + if (auto handler = grabberPointerHandler()) { handler->onGrabChanged(handler, CancelGrabExclusive, this); + } else if (auto item = grabberItem()) { + if (cancelEvent) + QCoreApplication::sendEvent(item, cancelEvent); + } m_exclusiveGrabber.clear(); } diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h index 455648a743..d046480f25 100644 --- a/src/quick/items/qquickevents_p_p.h +++ b/src/quick/items/qquickevents_p_p.h @@ -320,6 +320,9 @@ public: void setPassiveGrabbers(const QVector<QPointer <QQuickPointerHandler> > &grabbers) { m_passiveGrabbers = grabbers; } void clearPassiveGrabbers() { m_passiveGrabbers.clear(); } +protected: + void cancelExclusiveGrabImpl(QTouchEvent *cancelEvent = nullptr); + private: QVector2D estimatedVelocity() const; @@ -339,6 +342,8 @@ private: bool m_grabberIsHandler : 1; int m_reserved : 29; + friend class QQuickWindowPrivate; + Q_DISABLE_COPY(QQuickEventPoint) }; diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 0cd9357b9a..3089e3c2fa 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -1927,23 +1927,16 @@ bool QQuickWindowPrivate::deliverTouchCancelEvent(QTouchEvent *event) Q_Q(QQuickWindow); // A TouchCancel event will typically not contain any points. - // Deliver it to all items that have active touches. + // Deliver it to all items and handlers that have active touches. QQuickPointerEvent *pointerEvent = QQuickPointerDevice::touchDevice(event->device())->pointerEvent(); - QVector<QObject *> grabbers = pointerEvent->exclusiveGrabbers(); - - for (QObject *grabber: qAsConst(grabbers)) { - if (QQuickItem *grabberItem = qmlobject_cast<QQuickItem *>(grabber)) - QCoreApplication::sendEvent(grabberItem, event); - else //if (QQuickPointerHandler *grabberHandler = qmlobject_cast<QQuickPointerHandler *>(grabber)) -// grabberHandler->handlePointerEvent() - qWarning("unexpected: can't deliver touch cancel to a PointerHandler (yet?)"); - } + for (int i = 0; i < pointerEvent->pointCount(); ++i) + pointerEvent->point(i)->cancelExclusiveGrabImpl(event); touchMouseId = -1; touchMouseDevice = nullptr; if (q->mouseGrabberItem()) q->mouseGrabberItem()->ungrabMouse(); - // The next touch event can only be a TouchBegin so clean up. + // The next touch event can only be a TouchBegin, so clean up. pointerEvent->clearGrabbers(); return true; } |