diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2023-02-09 18:52:43 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-02-10 16:12:53 +0000 |
commit | acc496945b801feac5f99a103ed05a7ba8471fb6 (patch) | |
tree | 32acaa873b1bd926a58859fd27a47cc651185ed5 | |
parent | 5044ef4d11a6bb43aa86cf499bf05a8d01d574a5 (diff) |
QQuickDeliveryAgent: fix downcast to QQuickItem
None of the code should run if the item is not a QQuickItem,
do downcast only once using qmlobject_cast for the entire block.
As a drive-by, simplify the code a bit.
Change-Id: Ib3bc511022053889149d2fca62c6674c09409606
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 706ebe7c4d654a4a341940c908c5d0cd8b817719)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/quick/util/qquickdeliveryagent.cpp | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/src/quick/util/qquickdeliveryagent.cpp b/src/quick/util/qquickdeliveryagent.cpp index fd947bc645..78a95aa33c 100644 --- a/src/quick/util/qquickdeliveryagent.cpp +++ b/src/quick/util/qquickdeliveryagent.cpp @@ -1697,50 +1697,43 @@ void QQuickDeliveryAgentPrivate::onGrabChanged(QObject *grabber, QPointingDevice handler->onGrabChanged(handler, transition, const_cast<QPointerEvent *>(event), const_cast<QEventPoint &>(point)); } - } else { + } else if (auto *grabberItem = qmlobject_cast<QQuickItem *>(grabber)) { switch (transition) { case QPointingDevice::CancelGrabExclusive: case QPointingDevice::UngrabExclusive: - if (auto *item = qmlobject_cast<QQuickItem *>(grabber)) { - bool filtered = false; - if (isDeliveringTouchAsMouse() || - point.device()->type() == QInputDevice::DeviceType::Mouse || - point.device()->type() == QInputDevice::DeviceType::TouchPad) { - QMutableSinglePointEvent e(QEvent::UngrabMouse, point.device(), point); - hasFiltered.clear(); - filtered = sendFilteredMouseEvent(&e, item, item->parentItem()); - if (!filtered) { - lastUngrabbed = item; - item->mouseUngrabEvent(); - } + if (isDeliveringTouchAsMouse() + || point.device()->type() == QInputDevice::DeviceType::Mouse + || point.device()->type() == QInputDevice::DeviceType::TouchPad) { + QMutableSinglePointEvent e(QEvent::UngrabMouse, point.device(), point); + hasFiltered.clear(); + if (!sendFilteredMouseEvent(&e, grabberItem, grabberItem->parentItem())) { + lastUngrabbed = grabberItem; + grabberItem->mouseUngrabEvent(); } - if (point.device()->type() == QInputDevice::DeviceType::TouchScreen) { - bool allReleasedOrCancelled = true; - if (transition == QPointingDevice::UngrabExclusive && event) { - for (const auto &pt : event->points()) { - if (pt.state() != QEventPoint::State::Released) { - allReleasedOrCancelled = false; - break; - } + } + if (point.device()->type() == QInputDevice::DeviceType::TouchScreen) { + bool allReleasedOrCancelled = true; + if (transition == QPointingDevice::UngrabExclusive && event) { + for (const auto &pt : event->points()) { + if (pt.state() != QEventPoint::State::Released) { + allReleasedOrCancelled = false; + break; } } - if (allReleasedOrCancelled) - item->touchUngrabEvent(); } + if (allReleasedOrCancelled) + grabberItem->touchUngrabEvent(); } break; default: break; } - auto grabberItem = static_cast<QQuickItem *>(grabber); // cannot be a handler: we checked above - if (grabberItem) { - auto itemPriv = QQuickItemPrivate::get(grabberItem); - deliveryAgent = itemPriv->deliveryAgent(); - // An item that is NOT a subscene root needs to track whether it got a grab via a subscene delivery agent, - // whereas the subscene root item already knows it has its own DA. - if (isSubsceneAgent && grabGained && (!itemPriv->extra.isAllocated() || !itemPriv->extra->subsceneDeliveryAgent)) - itemPriv->maybeHasSubsceneDeliveryAgent = true; - } + auto *itemPriv = QQuickItemPrivate::get(grabberItem); + deliveryAgent = itemPriv->deliveryAgent(); + // An item that is NOT a subscene root needs to track whether it got a grab via a subscene delivery agent, + // whereas the subscene root item already knows it has its own DA. + if (isSubsceneAgent && grabGained && (!itemPriv->extra.isAllocated() || !itemPriv->extra->subsceneDeliveryAgent)) + itemPriv->maybeHasSubsceneDeliveryAgent = true; } if (currentEventDeliveryAgent == q && event && event->device()) { |