diff options
author | Laszlo Agocs <laszlo.p.agocs@nokia.com> | 2012-02-10 13:43:00 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-13 09:19:40 +0100 |
commit | c0100e28cadf8260769eddcc7a0306d832fed92b (patch) | |
tree | aca535d8884080fbfd7c1e200a81d9e57063ba50 /src/quick | |
parent | a979bf5a4cb7aeb5b690957d77b84c9dc385d6d9 (diff) |
Add basic TouchCancel handling to canvas.
This makes sure that touchEvent() is properly called for all items in
the scene that have an active touch. It does not handle the cancel
event in any other special way.
Change-Id: Id66527ced8cb63d0b29f25f37c139e6d6aec9ba0
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquickcanvas.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 52344d6456..cb60a238db 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -824,6 +824,7 @@ bool QQuickCanvas::event(QEvent *e) case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: + case QEvent::TouchCancel: { QTouchEvent *touch = static_cast<QTouchEvent *>(e); d->translateTouchEvent(touch); @@ -1165,8 +1166,12 @@ bool QQuickCanvasPrivate::deliverTouchEvent(QTouchEvent *event) qWarning("touchUpdateEvent"); else if (event->type() == QEvent::TouchEnd) qWarning("touchEndEvent"); + else if (event->type() == QEvent::TouchCancel) + qWarning("touchCancelEvent"); #endif + Q_Q(QQuickCanvas); + QHash<QQuickItem *, QList<QTouchEvent::TouchPoint> > updatedPoints; if (event->type() == QTouchEvent::TouchBegin) { // all points are new touch points @@ -1179,6 +1184,21 @@ bool QQuickCanvasPrivate::deliverTouchEvent(QTouchEvent *event) return event->isAccepted(); } + if (event->type() == QTouchEvent::TouchCancel) { + // A TouchCancel event will typically not contain any points. + // Deliver it to all items that have active touches. + QSet<QQuickItem *> cancelDelivered; + foreach (QQuickItem *item, itemForTouchPointId) { + if (cancelDelivered.contains(item)) + continue; + cancelDelivered.insert(item); + q->sendEvent(item, event); + } + // The next touch event can only be a TouchBegin so clean up. + itemForTouchPointId.clear(); + return true; + } + const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints(); QList<QTouchEvent::TouchPoint> newPoints; QQuickItem *item = 0; @@ -1497,6 +1517,7 @@ bool QQuickCanvas::sendEvent(QQuickItem *item, QEvent *e) case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: + case QEvent::TouchCancel: // XXX todo - should sendEvent be doing this? how does it relate to forwarded events? if (!d->sendFilteredMouseEvent(item->parentItem(), item, e)) { e->accept(); |