diff options
Diffstat (limited to 'src/widgets/kernel/qgesturemanager.cpp')
-rw-r--r-- | src/widgets/kernel/qgesturemanager.cpp | 131 |
1 files changed, 47 insertions, 84 deletions
diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp index d0c6b882b5..edb159bbbf 100644 --- a/src/widgets/kernel/qgesturemanager.cpp +++ b/src/widgets/kernel/qgesturemanager.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "private/qgesturemanager_p.h" #include "private/qstandardgestures_p.h" @@ -51,12 +15,13 @@ #include "qgesture.h" #include "qevent.h" -#ifdef Q_OS_OSX +#ifdef Q_OS_MACOS #include "qmacgesturerecognizer_p.h" #endif #include "qdebug.h" #include <QtCore/QLoggingCategory> +#include <QtCore/QVarLengthArray> #ifndef QT_NO_GESTURES @@ -64,7 +29,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcGestureManager, "qt.widgets.gestures") -#if !defined(Q_OS_OSX) +#if !defined(Q_OS_MACOS) static inline int panTouchPoints() { // Override by environment variable for testing. @@ -85,11 +50,11 @@ static inline int panTouchPoints() #endif QGestureManager::QGestureManager(QObject *parent) - : QObject(parent), state(NotGesture), m_lastCustomGestureId(Qt::CustomGesture) + : QObject(parent), m_lastCustomGestureId(Qt::CustomGesture) { qRegisterMetaType<Qt::GestureState>(); -#if defined(Q_OS_OSX) +#if defined(Q_OS_MACOS) registerGestureRecognizer(new QMacSwipeGestureRecognizer); registerGestureRecognizer(new QMacPinchGestureRecognizer); registerGestureRecognizer(new QMacPanGestureRecognizer); @@ -105,11 +70,10 @@ QGestureManager::QGestureManager(QObject *parent) QGestureManager::~QGestureManager() { qDeleteAll(m_recognizers); - foreach (QGestureRecognizer *recognizer, m_obsoleteGestures.keys()) { - qDeleteAll(m_obsoleteGestures.value(recognizer)); - delete recognizer; + for (auto it = m_obsoleteGestures.cbegin(), end = m_obsoleteGestures.cend(); it != end; ++it) { + qDeleteAll(it.value()); + delete it.key(); } - m_obsoleteGestures.clear(); } Qt::GestureType QGestureManager::registerGestureRecognizer(QGestureRecognizer *recognizer) @@ -134,25 +98,23 @@ void QGestureManager::unregisterGestureRecognizer(Qt::GestureType type) { QList<QGestureRecognizer *> list = m_recognizers.values(type); m_recognizers.remove(type); - foreach (QGesture *g, m_gestureToRecognizer.keys()) { - QGestureRecognizer *recognizer = m_gestureToRecognizer.value(g); + for (const auto &[g, recognizer] : std::as_const(m_gestureToRecognizer).asKeyValueRange()) { if (list.contains(recognizer)) { m_deletedRecognizers.insert(g, recognizer); } } - QMap<ObjectGesture, QList<QGesture *> >::const_iterator iter = m_objectGestures.constBegin(); - while (iter != m_objectGestures.constEnd()) { - ObjectGesture objectGesture = iter.key(); + for (const auto &[objectGesture, gestures] : std::as_const(m_objectGestures).asKeyValueRange()) { if (objectGesture.gesture == type) { - foreach (QGesture *g, iter.value()) { - if (QGestureRecognizer *recognizer = m_gestureToRecognizer.value(g)) { - m_gestureToRecognizer.remove(g); + for (QGesture *g : gestures) { + auto it = m_gestureToRecognizer.constFind(g); + if (it != m_gestureToRecognizer.cend() && it.value()) { + QGestureRecognizer *recognizer = it.value(); + m_gestureToRecognizer.erase(it); m_obsoleteGestures[recognizer].insert(g); } } } - ++iter; } } @@ -188,7 +150,7 @@ QGesture *QGestureManager::getState(QObject *object, QGestureRecognizer *recogni // from the destructor. if (object->isWidgetType()) { if (static_cast<QWidget *>(object)->d_func()->data.in_destructor) - return 0; + return nullptr; } else if (QGesture *g = qobject_cast<QGesture *>(object)) { return g; #if QT_CONFIG(graphicsview) @@ -196,7 +158,7 @@ QGesture *QGestureManager::getState(QObject *object, QGestureRecognizer *recogni Q_ASSERT(qobject_cast<QGraphicsObject *>(object)); QGraphicsObject *graphicsObject = static_cast<QGraphicsObject *>(object); if (graphicsObject->QGraphicsItem::d_func()->inDestructor) - return 0; + return nullptr; #endif } @@ -210,7 +172,7 @@ QGesture *QGestureManager::getState(QObject *object, QGestureRecognizer *recogni Q_ASSERT(recognizer); QGesture *state = recognizer->create(object); if (!state) - return 0; + return nullptr; state->setParent(this); if (state->gestureType() == Qt::CustomGesture) { // if the recognizer didn't fill in the gesture type, then this @@ -275,8 +237,8 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, ContextIterator contextEnd = contexts.end(); for (ContextIterator context = contexts.begin(); context != contextEnd; ++context) { Qt::GestureType gestureType = context.value(); - const QMap<Qt::GestureType, QGestureRecognizer *> &const_recognizers = m_recognizers; - QMap<Qt::GestureType, QGestureRecognizer *>::const_iterator + const QMultiMap<Qt::GestureType, QGestureRecognizer *> &const_recognizers = m_recognizers; + QMultiMap<Qt::GestureType, QGestureRecognizer *>::const_iterator typeToRecognizerIterator = const_recognizers.lowerBound(gestureType), typeToRecognizerEnd = const_recognizers.upperBound(gestureType); for (; typeToRecognizerIterator != typeToRecognizerEnd; ++typeToRecognizerIterator) { @@ -318,18 +280,18 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, } if (!triggeredGestures.isEmpty() || !finishedGestures.isEmpty() || !newMaybeGestures.isEmpty() || !notGestures.isEmpty()) { - QSet<QGesture *> startedGestures = triggeredGestures - m_activeGestures; + const QSet<QGesture *> startedGestures = triggeredGestures - m_activeGestures; triggeredGestures &= m_activeGestures; // check if a running gesture switched back to maybe state - QSet<QGesture *> activeToMaybeGestures = m_activeGestures & newMaybeGestures; + const QSet<QGesture *> activeToMaybeGestures = m_activeGestures & newMaybeGestures; // check if a maybe gesture switched to canceled - reset it but don't send an event QSet<QGesture *> maybeToCanceledGestures = m_maybeGestures & notGestures; // check if a running gesture switched back to not gesture state, // i.e. were canceled - QSet<QGesture *> canceledGestures = m_activeGestures & notGestures; + const QSet<QGesture *> canceledGestures = m_activeGestures & notGestures; // new gestures in maybe state m_maybeGestures += newMaybeGestures; @@ -347,11 +309,11 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, Q_ASSERT((finishedGestures & canceledGestures).isEmpty()); Q_ASSERT((canceledGestures & newMaybeGestures).isEmpty()); - QSet<QGesture *> notStarted = finishedGestures - m_activeGestures; + const QSet<QGesture *> notStarted = finishedGestures - m_activeGestures; if (!notStarted.isEmpty()) { // there are some gestures that claim to be finished, but never started. // probably those are "singleshot" gestures so we'll fake the started state. - foreach (QGesture *gesture, notStarted) + for (QGesture *gesture : notStarted) gesture->d_func()->state = Qt::GestureStarted; QSet<QGesture *> undeliveredGestures; deliverEvents(notStarted, &undeliveredGestures); @@ -366,15 +328,15 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, m_activeGestures -= canceledGestures; // set the proper gesture state on each gesture - foreach (QGesture *gesture, startedGestures) + for (QGesture *gesture : startedGestures) gesture->d_func()->state = Qt::GestureStarted; - foreach (QGesture *gesture, triggeredGestures) + for (QGesture *gesture : std::as_const(triggeredGestures)) gesture->d_func()->state = Qt::GestureUpdated; - foreach (QGesture *gesture, finishedGestures) + for (QGesture *gesture : std::as_const(finishedGestures)) gesture->d_func()->state = Qt::GestureFinished; - foreach (QGesture *gesture, canceledGestures) + for (QGesture *gesture : canceledGestures) gesture->d_func()->state = Qt::GestureCanceled; - foreach (QGesture *gesture, activeToMaybeGestures) + for (QGesture *gesture : activeToMaybeGestures) gesture->d_func()->state = Qt::GestureFinished; if (!m_activeGestures.isEmpty() || !m_maybeGestures.isEmpty() || @@ -394,7 +356,7 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, deliverEvents(startedGestures+triggeredGestures+finishedGestures+canceledGestures, &undeliveredGestures); - foreach (QGesture *g, startedGestures) { + for (QGesture *g : startedGestures) { if (undeliveredGestures.contains(g)) continue; if (g->gestureCancelPolicy() == QGesture::CancelAllInContext) { @@ -407,9 +369,9 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *, m_activeGestures -= undeliveredGestures; // reset gestures that ended - QSet<QGesture *> endedGestures = + const QSet<QGesture *> endedGestures = finishedGestures + canceledGestures + undeliveredGestures + maybeToCanceledGestures; - foreach (QGesture *gesture, endedGestures) { + for (QGesture *gesture : endedGestures) { recycle(gesture); m_gestureTargets.remove(gesture); } @@ -454,13 +416,13 @@ void QGestureManager::cancelGesturesForChildren(QGesture *original) // sort them per target widget by cherry picking from almostCanceledGestures and delivering QSet<QGesture *> almostCanceledGestures = cancelledGestures; while (!almostCanceledGestures.isEmpty()) { - QWidget *target = 0; + QWidget *target = nullptr; QSet<QGesture*> gestures; iter = almostCanceledGestures.begin(); // sort per target widget while (iter != almostCanceledGestures.end()) { QWidget *widget = m_gestureTargets.value(*iter); - if (target == 0) + if (target == nullptr) target = widget; if (target == widget) { gestures << *iter; @@ -482,7 +444,7 @@ void QGestureManager::cancelGesturesForChildren(QGesture *original) void QGestureManager::cleanupGesturesForRemovedRecognizer(QGesture *gesture) { QGestureRecognizer *recognizer = m_deletedRecognizers.value(gesture); - if(!recognizer) //The Gesture is removed while in the even loop, so the recognizers for this gestures was removed + if (!recognizer) //The Gesture is removed while in the even loop, so the recognizers for this gestures was removed return; m_deletedRecognizers.remove(gesture); if (m_deletedRecognizers.keys(recognizer).isEmpty()) { @@ -508,7 +470,7 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) } } // find all gesture contexts for the widget tree - w = w->isWindow() ? 0 : w->parentWidget(); + w = w->isWindow() ? nullptr : w->parentWidget(); while (w) { for (ContextIterator it = w->d_func()->gestureContext.constBegin(), @@ -586,8 +548,8 @@ void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures, GestureByTypes gestureByTypes; // sort gestures by types - foreach (QGesture *gesture, gestures) { - QWidget *receiver = m_gestureTargets.value(gesture, 0); + for (QGesture *gesture : gestures) { + QWidget *receiver = m_gestureTargets.value(gesture, nullptr); Q_ASSERT(receiver); if (receiver) gestureByTypes[gesture->gestureType()].insert(receiver, gesture); @@ -611,7 +573,7 @@ void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures, } } if (w->isWindow()) { - w = 0; + w = nullptr; break; } w = w->parentWidget(); @@ -637,7 +599,7 @@ void QGestureManager::deliverEvents(const QSet<QGesture *> &gestures, for (QSet<QGesture *>::const_iterator it = gestures.begin(), e = gestures.end(); it != e; ++it) { QGesture *gesture = *it; - QWidget *target = m_gestureTargets.value(gesture, 0); + QWidget *target = m_gestureTargets.value(gesture, nullptr); if (!target) { // the gesture has just started and doesn't have a target yet. Q_ASSERT(gesture->state() == Qt::GestureStarted); @@ -648,7 +610,8 @@ void QGestureManager::deliverEvents(const QSet<QGesture *> &gestures, QWidget *child = topLevel->childAt(topLevel->mapFromGlobal(pt)); target = child ? child : topLevel; } - } else { + } + if (!target) { // or use the context of the gesture QObject *context = m_gestureOwners.value(gesture, 0); if (context->isWidgetType()) @@ -687,7 +650,7 @@ void QGestureManager::deliverEvents(const QSet<QGesture *> &gestures, for (GesturesPerWidget::const_iterator it = conflictedGestures.constBegin(), e = conflictedGestures.constEnd(); it != e; ++it) { QWidget *receiver = it.key(); - QList<QGesture *> gestures = it.value(); + const QList<QGesture *> &gestures = it.value(); qCDebug(lcGestureManager) << "QGestureManager::deliverEvents: sending GestureOverride to" << receiver << "gestures:" << gestures; @@ -695,7 +658,7 @@ void QGestureManager::deliverEvents(const QSet<QGesture *> &gestures, event.t = QEvent::GestureOverride; // mark event and individual gestures as ignored event.ignore(); - foreach(QGesture *g, gestures) + for (QGesture *g : gestures) event.setAccepted(g, false); QCoreApplication::sendEvent(receiver, &event); |