summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@nokia.com>2011-02-03 16:52:10 +0100
committerZeno Albisser <zeno.albisser@nokia.com>2011-02-03 17:22:08 +0100
commit45c0133e44fc40b2c304b49a46c9453d268d264b (patch)
treede4fab52edb2196f7ba116fdb6397a95999a678f
parent2dd57b4000af109f28fb18d4de4af24bc1593790 (diff)
made TouchArea work on top of flickable
-rw-r--r--TouchArea/qdeclarativetoucharea.cpp98
-rw-r--r--TouchArea/qdeclarativetoucharea.h9
2 files changed, 97 insertions, 10 deletions
diff --git a/TouchArea/qdeclarativetoucharea.cpp b/TouchArea/qdeclarativetoucharea.cpp
index a5797e5..4295ffa 100644
--- a/TouchArea/qdeclarativetoucharea.cpp
+++ b/TouchArea/qdeclarativetoucharea.cpp
@@ -41,8 +41,11 @@
#include "qdeclarativetoucharea.h"
-#include "qevent.h"
-#include "qsharedpointer.h"
+#include <QEvent>
+#include <QGraphicsScene>
+#include <QGraphicsSceneMouseEvent>
+#include <QDeclarativeExpression>
+#include <QDeclarativeInfo>
#include <math.h>
QDeclarativeTouchArea::QDeclarativeTouchArea(QDeclarativeItem *parent)
@@ -52,7 +55,8 @@ QDeclarativeTouchArea::QDeclarativeTouchArea(QDeclarativeItem *parent)
_scaleFactor(1.0),
_rotationAngle(0.0),
_parentTouchArea(this),
- _active(false)
+ _active(false),
+ _stealMouse(false)
{
setAcceptTouchEvents(true);
setAcceptedMouseButtons(Qt::LeftButton);
@@ -72,6 +76,7 @@ QDeclarativeTouchArea::~QDeclarativeTouchArea() {
}
bool QDeclarativeTouchArea::sceneEvent(QEvent *event) {
+ bool rv = false;
switch (event->type()) {
case QEvent::TouchBegin:
updateTopTouchArea();
@@ -80,17 +85,17 @@ bool QDeclarativeTouchArea::sceneEvent(QEvent *event) {
_active = true;
_parentTouchArea->_active = true;
updateTouchData(event);
- return true;
+ rv = true;
}
- }
- else {
+ } else {
updateTouchData(event);
- return true;
+ rv = true;
}
break;
case QEvent::TouchUpdate:
updateTouchData(event);
- return true;
+ rv = true;
+ break;
case QEvent::TouchEnd: {
updateTouchData(event);
if (_parentTouchArea != this) {
@@ -99,12 +104,19 @@ bool QDeclarativeTouchArea::sceneEvent(QEvent *event) {
_parentTouchArea->_active = false;
}
}
- return true;
+ rv = true;
+ break;
}
default:
break;
}
- return QDeclarativeItem::sceneEvent(event);
+
+ if(!rv)
+ rv = QDeclarativeItem::sceneEvent(event);
+ if (event->type() == QEvent::UngrabMouse) {
+ setKeepMouseGrab(false);
+ }
+ return rv;
}
void QDeclarativeTouchArea::updateTouchData(QEvent *event) {
@@ -112,6 +124,24 @@ void QDeclarativeTouchArea::updateTouchData(QEvent *event) {
bool moved = false;
bool started = false;
+ QDeclarativeItem *grabber = scene() ? qobject_cast<QDeclarativeItem*>(scene()->mouseGrabberItem()) : 0;
+ QDeclarativeTouchArea *touchGrabber = scene() ? qobject_cast<QDeclarativeTouchArea*>(scene()->mouseGrabberItem()) : 0;
+ if (grabber == this || !grabber || !grabber->keepMouseGrab() || touchGrabber) {
+ if (_stealMouse && (grabber != this || !grabber->keepMouseGrab())) {
+ grabMouse();
+ setKeepMouseGrab(true);
+ }
+
+ if (!_keepMouseFocus.script().isEmpty()) {
+ QDeclarativeExpression expr(_keepMouseFocus.context(), _keepMouseFocus.scopeObject(), _keepMouseFocus.script());
+ QVariant result = expr.evaluate();
+ if (expr.hasError())
+ qmlInfo(this) << expr.error();
+ else
+ _stealMouse = true;
+ }
+ }
+
QTouchEvent *e = static_cast<QTouchEvent*>(event);
clearChangedAndReleasedTouches();
@@ -216,3 +246,51 @@ void QDeclarativeTouchArea::updatePinch(QList<QTouchEvent::TouchPoint> *touchPoi
}
+bool QDeclarativeTouchArea::event(QEvent *event)
+{
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate: {
+ updateTouchData(event);
+ }
+ return true;
+ case QEvent::TouchEnd: {
+ updateTouchData(event);
+ _stealMouse = false;
+ QDeclarativeTouchArea *touchGrabber = scene() ? qobject_cast<QDeclarativeTouchArea*>(scene()->mouseGrabberItem()) : 0;
+ if (touchGrabber == this)
+ ungrabMouse();
+ setKeepMouseGrab(false);
+ }
+ return true;
+ default:
+ return QDeclarativeItem::event(event);
+ }
+
+ return QDeclarativeItem::event(event);
+}
+
+bool QDeclarativeTouchArea::sceneEventFilter(QGraphicsItem *i, QEvent *event)
+{
+ if (!isVisible())
+ return QDeclarativeItem::sceneEventFilter(i, event);
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ updateTouchData(event);
+ return true;
+ case QEvent::TouchEnd: {
+ updateTouchData(event);
+ _stealMouse = false;
+ QDeclarativeTouchArea *touchGrabber = scene() ? qobject_cast<QDeclarativeTouchArea*>(scene()->mouseGrabberItem()) : 0;
+ if (touchGrabber == this)
+ ungrabMouse();
+ setKeepMouseGrab(false);
+ }
+ return true;
+ default:
+ break;
+ }
+ return QDeclarativeItem::sceneEventFilter(i, event);
+}
+
diff --git a/TouchArea/qdeclarativetoucharea.h b/TouchArea/qdeclarativetoucharea.h
index f9525e3..9648ece 100644
--- a/TouchArea/qdeclarativetoucharea.h
+++ b/TouchArea/qdeclarativetoucharea.h
@@ -48,6 +48,7 @@
#include <QMap>
#include <QList>
+#include <QDeclarativeScriptString>
class QDeclarativeTouchPoint : public QObject {
Q_OBJECT
@@ -133,6 +134,7 @@ class QDeclarativeTouchArea : public QDeclarativeItem
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:
QDeclarativeTouchArea(QDeclarativeItem *parent=0);
@@ -146,6 +148,9 @@ public:
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(); }
@@ -186,6 +191,8 @@ protected:
void clearChangedAndReleasedTouches();
void updateTopTouchArea();
void updateTouchData(QEvent*);
+ bool event(QEvent *event);
+ bool sceneEventFilter(QGraphicsItem *i, QEvent *event);
private:
QMap<int,QObject*> _touchPrototypes;
@@ -198,6 +205,8 @@ private:
qreal _rotationAngle;
QDeclarativeTouchArea* _parentTouchArea;
bool _active;
+ bool _stealMouse;
+ QDeclarativeScriptString _keepMouseFocus;
};