0.2 version add desktop components multitouch, joystick, multicast
[mardrone] / mardrone / qdeclarativetoucharea.h
diff --git a/mardrone/qdeclarativetoucharea.h b/mardrone/qdeclarativetoucharea.h
new file mode 100644 (file)
index 0000000..1cc6101
--- /dev/null
@@ -0,0 +1,220 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QML Touch Area plugin of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QDECLARATIVETOUCHAREA_H
+#define QDECLARATIVETOUCHAREA_H
+
+#include "qdeclarativeitem.h"
+#include "qevent.h"
+
+#include <QMap>
+#include <QList>
+#include <QDeclarativeScriptString>
+
+class QDeclarativeTouchPoint : public QObject {
+    Q_OBJECT
+    Q_PROPERTY(int id READ id)
+    Q_PROPERTY(qreal x READ x NOTIFY xChanged)
+    Q_PROPERTY(qreal y READ y NOTIFY yChanged)
+    Q_PROPERTY(qreal sceneX READ sceneX NOTIFY sceneXChanged)
+    Q_PROPERTY(qreal sceneY READ sceneY NOTIFY sceneYChanged)
+    Q_PROPERTY(bool valid READ isValid NOTIFY validityChanged)
+public:
+    QDeclarativeTouchPoint(bool qmlReference = true)
+        : _id(0),
+          _x(0.0),
+          _y(0.0),
+          _sceneX(0.0),
+          _sceneY(0.0),
+          _qmlReferenced(qmlReference),
+          _valid(!qmlReference)
+    {}
+
+    int id() const { return _id; }
+    void setId(int id) { _id = id; }
+
+    qreal x() const { return _x; }
+    void setX(qreal x) {
+        _x = x;
+        emit(xChanged());
+    }
+
+    qreal y() const { return _y; }
+    void setY(qreal y) {
+        _y = y;
+        emit(yChanged());
+    }
+
+    qreal sceneX() const { return _sceneX; }
+    void setSceneX(qreal sceneX) {
+        _sceneX = sceneX;
+        emit(sceneXChanged());
+    }
+
+    qreal sceneY() const { return _sceneY; }
+    void setSceneY(qreal sceneY) {
+        _sceneY = sceneY;
+        emit(sceneYChanged());
+    }
+
+    bool isQmlReferenced() { return _qmlReferenced; }
+
+    bool isValid() { return _valid; }
+    void setValid(bool valid) {
+        _valid = valid;
+        emit(validityChanged());
+    }
+
+Q_SIGNALS:
+    void xChanged();
+    void yChanged();
+    void sceneXChanged();
+    void sceneYChanged();
+    void validityChanged();
+
+private:
+    int _id;
+    qreal _x;
+    qreal _y;
+    qreal _sceneX;
+    qreal _sceneY;
+    bool _qmlReferenced;
+    bool _valid;
+};
+
+
+
+class QDeclarativeTouchArea : public QDeclarativeItem
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QList<QObject*> touches READ touches)
+    Q_PROPERTY(QList<QObject*> changedTouches READ changedTouches)
+    Q_PROPERTY(QList<QObject*> releasedTouches READ releasedTouches)
+
+    Q_PROPERTY(QDeclarativeListProperty<QDeclarativeTouchPoint> touchPoints READ touchPoints NOTIFY touchPointsChanged)
+    Q_PROPERTY(int minimumTouches READ minimumTouches WRITE setMinimumTouches)
+    Q_PROPERTY(int maximumTouches READ maximumTouches WRITE setMaximumTouches)
+    Q_PROPERTY(qreal scaleFactor READ scaleFactor NOTIFY scaleFactorChanged)
+    Q_PROPERTY(qreal rotationAngle READ rotationAngle NOTIFY rotationAngleChanged)
+    Q_PROPERTY(QDeclarativeScriptString keepMouseFocus READ keepMouseFocus WRITE setKeepMouseFocus)
+
+public:
+    static void registerQML();
+
+    QDeclarativeTouchArea(QDeclarativeItem *parent=0);
+    ~QDeclarativeTouchArea();
+
+    int minimumTouches() const { return _minimumTouches; }
+    void setMinimumTouches(int num) { _minimumTouches = num; }
+    int maximumTouches() const { return _maximumTouches; }
+    void setMaximumTouches(int num) { _maximumTouches = num; }
+
+    qreal scaleFactor() const { return _scaleFactor; }
+    qreal rotationAngle() const { return _rotationAngle; }
+
+    QDeclarativeScriptString keepMouseFocus() const { return _keepMouseFocus; }
+    void setKeepMouseFocus(const QDeclarativeScriptString &keep) { _keepMouseFocus = keep; }
+
+    QList<QObject*> touches() { return _touches.values(); }
+    QList<QObject*> changedTouches() { return _changedTouches.values(); }
+    QList<QObject*> releasedTouches() { return _releasedTouches; }
+
+    QDeclarativeListProperty<QDeclarativeTouchPoint> touchPoints() {
+        return QDeclarativeListProperty<QDeclarativeTouchPoint>(this, 0, QDeclarativeTouchArea::touchPoint_append, QDeclarativeTouchArea::touchPoint_count, QDeclarativeTouchArea::touchPoint_at, 0);
+    }
+
+    static void touchPoint_append(QDeclarativeListProperty<QDeclarativeTouchPoint> *list, QDeclarativeTouchPoint* touch) {
+        QDeclarativeTouchArea *q = static_cast<QDeclarativeTouchArea*>(list->object);
+        q->addTouchPrototype(touch);
+    }
+
+    static int touchPoint_count(QDeclarativeListProperty<QDeclarativeTouchPoint> *list) {
+        QDeclarativeTouchArea *q = static_cast<QDeclarativeTouchArea*>(list->object);
+        return q->_touchPrototypes.count();
+    }
+
+    static QDeclarativeTouchPoint* touchPoint_at(QDeclarativeListProperty<QDeclarativeTouchPoint> *list, int index) {
+        QDeclarativeTouchArea *q = static_cast<QDeclarativeTouchArea*>(list->object);
+        return static_cast<QDeclarativeTouchPoint*>(q->_touchPrototypes[index]);
+    }
+
+
+Q_SIGNALS:
+    void touchStart();
+    void touchMove();
+    void touchEnd();
+    void touchPointsChanged();
+    void scaleFactorChanged();
+    void rotationAngleChanged();
+
+protected:
+    bool sceneEvent(QEvent *);
+    void updateTouchPoint(QDeclarativeTouchPoint*, const QTouchEvent::TouchPoint*);
+    void updatePinch(QList<QTouchEvent::TouchPoint> *touchPoints);
+    void addTouchPrototype(QDeclarativeTouchPoint* prototype);
+    void addTouchPoint(const QTouchEvent::TouchPoint *p);
+    void clearChangedAndReleasedTouches();
+    void updateTopTouchArea();
+    void updateTouchData(QEvent*);
+    bool event(QEvent *event);
+    bool sceneEventFilter(QGraphicsItem *i, QEvent *event);
+
+private:
+    QMap<int,QObject*> _touchPrototypes;
+    QMap<int,QObject*> _touches;
+    QMap<int,QObject*> _changedTouches;
+    QList<QObject*> _releasedTouches;
+    int _minimumTouches;
+    int _maximumTouches;
+    qreal _scaleFactor;
+    qreal _rotationAngle;
+    QDeclarativeTouchArea* _parentTouchArea;
+    bool _active;
+    bool _stealMouse;
+    QDeclarativeScriptString _keepMouseFocus;
+
+};
+
+QML_DECLARE_TYPE(QDeclarativeTouchPoint)
+
+#endif // QDECLARATIVETOUCHAREA_H