diff options
Diffstat (limited to 'src/sensors/gestures/qsensorgesture.cpp')
-rw-r--r-- | src/sensors/gestures/qsensorgesture.cpp | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/src/sensors/gestures/qsensorgesture.cpp b/src/sensors/gestures/qsensorgesture.cpp new file mode 100644 index 00000000..f84ce18b --- /dev/null +++ b/src/sensors/gestures/qsensorgesture.cpp @@ -0,0 +1,258 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtSensors module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $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 + + \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(). + + \sa QSensorGestureRecognizer + + You may use QSensorGestureManager to obtain the systems known sensor gesture ids. + + \sa QSensorGestureManager + */ + +#ifdef Q_QDOC +/*! + \fn QSensorGesture::detected(QString gestureId) + Signals when the \a gestureId gesture has been recognized. + */ +#endif + +/*! + 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 { + //add to not available things + } + } + + d_ptr->meta = 0; + + QMetaObjectBuilder builder; + builder.setSuperClass(&QSensorGesture::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) + qFree(d_ptr->meta); + delete d_ptr; +} + +/*! + Returns whether this QSensorGesture is valid or not. + */ +bool QSensorGesture::isValid() const +{ + return d_ptr->valid; +} + +/*! + Returns the gestures ids. + */ +QStringList QSensorGesture::availableIds() const +{ + return d_ptr->availableIds; +} + +/*! + 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) { + if (recognizer !=0) { //it shouldn't be, but I am paranoid + 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; +} + +/*! + Internal +*/ +void *QSensorGesture::qt_metacast(const char* className) +{ + if (!className) return 0; + return QObject::qt_metacast(className); +} + +/*! + Internal +*/ +QSensorGesturePrivate::QSensorGesturePrivate(QObject *parent) + : QObject(parent),isActive(0), valid(0) +{ +} + +QSensorGesturePrivate::~QSensorGesturePrivate() +{ + +} |