summaryrefslogtreecommitdiffstats
path: root/TouchArea/qdeclarativetoucharea.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TouchArea/qdeclarativetoucharea.cpp')
-rw-r--r--TouchArea/qdeclarativetoucharea.cpp98
1 files changed, 88 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);
+}
+