diff options
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(); |