| /**************************************************************************** |
| ** |
| ** Copyright (C) 2019 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the QtSensors 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$ |
| ** |
| ****************************************************************************/ |
| |
| #include <QDir> |
| #include <QPluginLoader> |
| #include <QDebug> |
| |
| #include "qsensorgesture.h" |
| #include "qsensorgesture_p.h" |
| #include "qsensorgesturemanager.h" |
| |
| #include <private/qmetaobjectbuilder_p.h> |
| |
| /*! |
| \class QSensorGesture |
| \ingroup sensorgestures_main |
| \inmodule QtSensors |
| \since 5.1 |
| |
| \brief The QSensorGesture class represents one or more sensor gesture recognizers. |
| |
| In addition to the QSensorGesture::detected() signal, Sensor Gesture Recognizers can |
| have their own specific signals, and may be discovered through |
| QSensorGesture::gestureSignals(). |
| |
| \b {Note that QSensorGesture uses a custom meta-object in order to provide |
| recognizer-specific signals. This means it is not possible to sub-class |
| QSensorGesture and use Q_OBJECT. Also qobject_cast<QSensorGesture*>(ptr) will |
| not work.} |
| |
| \sa QSensorGestureRecognizer |
| |
| You may use QSensorGestureManager to obtain the systems known sensor gesture ids. |
| |
| \sa QSensorGestureManager |
| */ |
| |
| /*! |
| \fn void QSensorGesture::detected(QString) |
| Signals when the gesture has been recognized. |
| */ |
| |
| /*! |
| Constructs the sensor gesture, and initializes the \a ids list of recognizers, |
| with parent \a parent |
| */ |
| QSensorGesture::QSensorGesture(const QStringList &ids, QObject *parent) : |
| QObject(parent) |
| { |
| d_ptr = new QSensorGesturePrivate(); |
| Q_FOREACH (const QString &id, ids) { |
| QSensorGestureRecognizer * rec = QSensorGestureManager::sensorGestureRecognizer(id); |
| if (rec != 0) { |
| d_ptr->m_sensorRecognizers.append(rec); |
| d_ptr->availableIds.append(id); |
| } else { |
| d_ptr->invalidIds.append(id); |
| //add to not available things |
| } |
| } |
| |
| d_ptr->meta = 0; |
| |
| QMetaObjectBuilder builder; |
| builder.setSuperClass(&QObject::staticMetaObject); |
| builder.setClassName("QSensorGesture"); |
| |
| Q_FOREACH (QSensorGestureRecognizer *recognizer, d_ptr->m_sensorRecognizers) { |
| Q_FOREACH (const QString &gesture, recognizer->gestureSignals()) { |
| QMetaMethodBuilder b = builder.addSignal(gesture.toLatin1()); |
| if (!d_ptr->localGestureSignals.contains(QLatin1String(b.signature()))) |
| d_ptr->localGestureSignals.append(QLatin1String(b.signature())); |
| } |
| recognizer->createBackend(); |
| } |
| d_ptr->meta = builder.toMetaObject(); |
| |
| if (d_ptr->m_sensorRecognizers.count() > 0) { |
| d_ptr->valid = true; |
| } |
| } |
| |
| /*! |
| Destroy the QSensorGesture |
| */ |
| QSensorGesture::~QSensorGesture() |
| { |
| stopDetection(); |
| if (d_ptr->meta) |
| free(d_ptr->meta); |
| delete d_ptr; |
| } |
| |
| /*! |
| Returns the gesture recognizer ids that were found. |
| */ |
| QStringList QSensorGesture::validIds() const |
| { |
| return d_ptr->availableIds; |
| } |
| |
| /*! |
| Returns the gesture recognizer ids that were not found. |
| */ |
| QStringList QSensorGesture::invalidIds() const |
| { |
| return d_ptr->invalidIds; |
| } |
| |
| /*! |
| Starts the gesture detection routines in the recognizer. |
| */ |
| void QSensorGesture::startDetection() |
| { |
| if (d_ptr->m_sensorRecognizers.count() < 1) |
| return; |
| if (d_ptr->isActive) |
| return; |
| |
| Q_FOREACH (QSensorGestureRecognizer *recognizer, d_ptr->m_sensorRecognizers) { |
| |
| Q_ASSERT(recognizer !=0); |
| |
| connect(recognizer,SIGNAL(detected(QString)), |
| this,SIGNAL(detected(QString)),Qt::UniqueConnection); |
| |
| //connect recognizer signals |
| Q_FOREACH (QString method, recognizer->gestureSignals()) { |
| method.prepend(QLatin1String("2")); |
| connect(recognizer, method.toLatin1(), |
| this, method.toLatin1(), Qt::UniqueConnection); |
| } |
| |
| recognizer->startBackend(); |
| } |
| d_ptr->isActive = true; |
| } |
| |
| /*! |
| Stops the gesture detection routines. |
| */ |
| void QSensorGesture::stopDetection() |
| { |
| if (d_ptr->m_sensorRecognizers.count() < 1) |
| return; |
| |
| if (!d_ptr->isActive) |
| return; |
| |
| Q_FOREACH (QSensorGestureRecognizer *recognizer, d_ptr->m_sensorRecognizers) { |
| disconnect(recognizer,SIGNAL(detected(QString)), |
| this,SIGNAL(detected(QString))); |
| //disconnect recognizer signals |
| Q_FOREACH (QString method,recognizer->gestureSignals()) { |
| method.prepend(QLatin1String("2")); |
| disconnect(recognizer, method.toLatin1(), |
| this, method.toLatin1()); |
| } |
| |
| recognizer->stopBackend(); |
| } |
| d_ptr->isActive = false; |
| } |
| |
| /*! |
| Returns all the possible gestures signals that may be emitted. |
| */ |
| QStringList QSensorGesture::gestureSignals() const |
| { |
| if (d_ptr->m_sensorRecognizers.count() > 0) { |
| return d_ptr->localGestureSignals; |
| } |
| return QStringList(); |
| } |
| |
| /*! |
| Returns whether this gesture is active or not. |
| */ |
| |
| bool QSensorGesture::isActive() |
| { |
| return d_ptr->isActive; |
| } |
| |
| /*! |
| \internal |
| */ |
| const QMetaObject* QSensorGesture::metaObject() const |
| { |
| return d_ptr->meta; |
| } |
| /*! |
| \internal |
| */ |
| int QSensorGesture::qt_metacall(QMetaObject::Call c, int id, void **a) |
| { |
| id = QObject::qt_metacall(c, id, a); |
| |
| if (id < 0 || !d_ptr->meta) |
| return id; |
| |
| QMetaObject::activate(this, d_ptr->meta, id, a); |
| return id; |
| } |
| |
| QSensorGesturePrivate::QSensorGesturePrivate(QObject *parent) |
| : QObject(parent),isActive(0), valid(0) |
| { |
| } |
| |
| QSensorGesturePrivate::~QSensorGesturePrivate() |
| { |
| |
| } |