diff options
author | Jarkko T. Toivonen <ext-jarkko.t.toivonen@nokia.com> | 2012-01-24 15:12:07 +0200 |
---|---|---|
committer | Pasi Pentikäinen <ext-pasi.a.pentikainen@nokia.com> | 2012-02-07 12:33:54 +0100 |
commit | be407ef869ba7138a4e9104fc8bb95f48a76868c (patch) | |
tree | 962a53269fbfa88d8d99df8fc074d52194a57c93 | |
parent | 07e2c3316b544c96e082acea774d089119ed7c5a (diff) | |
download | qt4-tools-be407ef869ba7138a4e9104fc8bb95f48a76868c.tar.gz |
Fix pinch-zoom problem when application is deactivated
Deactivation can happen for example if some notification dialog opens
on top of the application. In this case the PinchFinished signal was not
emitted.
It is fixed so that when the QDeclarativePinchArea component receives
QEvent::WindowDeactivate event, the ongoing touch activity is cancelled,
which causes the pinch to finish. Also if QEvent::TouchUpdate event is
received without receiving QEvent::TouchBegin event first, the
QEvent::TouchUpdate event will not cause the updatePinch() method to be
called.
Task-number: ou1cimx1#948030
Change-Id: Ib8b9e1a022415be06f1a8e778b887418f32c75ef
Reviewed-by: Murray Read <ext-murray.2.read@nokia.com>
Reviewed-by: Pasi Pentikäinen <ext-pasi.a.pentikainen@nokia.com>
(cherry picked from commit e4073fdea521c4b6c36461b51fc16f818c502cc3)
-rw-r--r-- | src/declarative/graphicsitems/qdeclarativepincharea.cpp | 11 | ||||
-rw-r--r-- | src/declarative/graphicsitems/qdeclarativepincharea_p_p.h | 3 |
2 files changed, 11 insertions, 3 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativepincharea.cpp b/src/declarative/graphicsitems/qdeclarativepincharea.cpp index 0e14ff1792..8fa5168842 100644 --- a/src/declarative/graphicsitems/qdeclarativepincharea.cpp +++ b/src/declarative/graphicsitems/qdeclarativepincharea.cpp @@ -278,7 +278,10 @@ bool QDeclarativePinchArea::event(QEvent *event) return QDeclarativeItem::event(event); switch (event->type()) { case QEvent::TouchBegin: - case QEvent::TouchUpdate: { + d->touchEventsActive = true; + // No break, continue to next case. + case QEvent::TouchUpdate: + if (d->touchEventsActive) { QTouchEvent *touch = static_cast<QTouchEvent*>(event); d->touchPoints.clear(); for (int i = 0; i < touch->touchPoints().count(); ++i) { @@ -287,9 +290,13 @@ bool QDeclarativePinchArea::event(QEvent *event) } } updatePinch(); + return true; } - return true; + break; + case QEvent::WindowDeactivate: + // No break, continue to next case. case QEvent::TouchEnd: + d->touchEventsActive = false; d->touchPoints.clear(); updatePinch(); break; diff --git a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h index a01859cdf9..3e2eb1f247 100644 --- a/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativepincharea_p_p.h @@ -71,7 +71,7 @@ public: , pinchRejected(false), pinchActivated(false) , pinch(0), pinchStartDist(0), pinchStartScale(1.0) , pinchLastScale(1.0), pinchStartRotation(0.0), pinchStartAngle(0.0) - , pinchLastAngle(0.0), pinchRotation(0.0) + , pinchLastAngle(0.0), pinchRotation(0.0), touchEventsActive(false) { } @@ -90,6 +90,7 @@ public: bool inPinch : 1; bool pinchRejected : 1; bool pinchActivated : 1; + bool touchEventsActive : 1; QDeclarativePinch *pinch; QPointF sceneStartPoint1; QPointF sceneStartPoint2; |