From 45c0133e44fc40b2c304b49a46c9453d268d264b Mon Sep 17 00:00:00 2001 From: Zeno Albisser Date: Thu, 3 Feb 2011 16:52:10 +0100 Subject: made TouchArea work on top of flickable --- TouchArea/qdeclarativetoucharea.cpp | 98 +++++++++++++++++++++++++++++++++---- TouchArea/qdeclarativetoucharea.h | 9 ++++ 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 +#include +#include +#include +#include #include 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(scene()->mouseGrabberItem()) : 0; + QDeclarativeTouchArea *touchGrabber = scene() ? qobject_cast(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(event); clearChangedAndReleasedTouches(); @@ -216,3 +246,51 @@ void QDeclarativeTouchArea::updatePinch(QList *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(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(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 #include +#include 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 touches() { return _touches.values(); } QList 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 _touchPrototypes; @@ -198,6 +205,8 @@ private: qreal _rotationAngle; QDeclarativeTouchArea* _parentTouchArea; bool _active; + bool _stealMouse; + QDeclarativeScriptString _keepMouseFocus; }; -- cgit v1.2.3