void QQuickMultiPointTouchArea::addTouchPoint(const QMouseEvent *e) { QQuickTouchPoint *dtp = 0; for (QQuickTouchPoint *tp : qAsConst(_touchPrototypes)) if (!tp->inUse()) { tp->setInUse(true); dtp = tp; break; } if (dtp == 0) dtp = new QQuickTouchPoint(false); updateTouchPoint(dtp, e); dtp->setPressed(true); _touchPoints.insert(-1, dtp); _pressedTouchPoints.append(dtp); _mouseTouchPoint = dtp; }
void QQuickMultiPointTouchArea::addTouchPoint(const QTouchEvent::TouchPoint *p) { QQuickTouchPoint *dtp = 0; for (QQuickTouchPoint* tp : qAsConst(_touchPrototypes)) { if (!tp->inUse()) { tp->setInUse(true); dtp = tp; break; } } if (dtp == 0) dtp = new QQuickTouchPoint(false); dtp->setPointId(p->id()); updateTouchPoint(dtp,p); dtp->setPressed(true); _touchPoints.insert(p->id(),dtp); _pressedTouchPoints.append(dtp); }
void QQuickMultiPointTouchArea::updateTouchData(QEvent *event) { bool ended = false; bool moved = false; bool started = false; bool isMouseEvent = false; clearTouchLists(); QList<QTouchEvent::TouchPoint> touchPoints; switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: touchPoints = static_cast<QTouchEvent*>(event)->touchPoints(); break; case QEvent::MouseButtonPress: case QEvent::MouseMove: case QEvent::MouseButtonRelease: { QMouseEvent *me = static_cast<QMouseEvent*>(event); _mouseQpaTouchPoint.setPos(me->localPos()); _mouseQpaTouchPoint.setScenePos(me->windowPos()); _mouseQpaTouchPoint.setScreenPos(me->screenPos()); if (event->type() == QEvent::MouseMove) _mouseQpaTouchPoint.setState(Qt::TouchPointMoved); else if (event->type() == QEvent::MouseButtonRelease) _mouseQpaTouchPoint.setState(Qt::TouchPointReleased); else { // QEvent::MouseButtonPress addTouchPoint(me); started = true; _mouseQpaTouchPoint.setState(Qt::TouchPointPressed); } touchPoints << _mouseQpaTouchPoint; isMouseEvent = true; break; } default: qWarning("updateTouchData: unhandled event type %d", event->type()); break; } if (!isMouseEvent && _mouseTouchPoint) { QQuickWindow *c = window(); if (c && c->mouseGrabberItem() == this) touchPoints << _mouseQpaTouchPoint; } int numTouchPoints = touchPoints.count(); //always remove released touches, and make sure we handle all releases before adds. for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) { Qt::TouchPointState touchPointState = p.state(); int id = p.id(); if (touchPointState & Qt::TouchPointReleased) { QQuickTouchPoint* dtp = static_cast<QQuickTouchPoint*>(_touchPoints.value(id)); if (!dtp) continue; updateTouchPoint(dtp, &p); dtp->setPressed(false); _releasedTouchPoints.append(dtp); _touchPoints.remove(id); ended = true; } } if (numTouchPoints >= _minimumTouchPoints && numTouchPoints <= _maximumTouchPoints) { for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) { Qt::TouchPointState touchPointState = p.state(); int id = p.id(); if (touchPointState & Qt::TouchPointReleased) { //handled above } else if (!_touchPoints.contains(id)) { //could be pressed, moved, or stationary // (we may have just obtained enough points to start tracking them -- in that case moved or stationary count as newly pressed) addTouchPoint(&p); started = true; } else if (touchPointState & Qt::TouchPointMoved) { QQuickTouchPoint* dtp = static_cast<QQuickTouchPoint*>(_touchPoints.value(id)); Q_ASSERT(dtp); _movedTouchPoints.append(dtp); updateTouchPoint(dtp,&p); moved = true; } else { QQuickTouchPoint* dtp = static_cast<QQuickTouchPoint*>(_touchPoints.value(id)); Q_ASSERT(dtp); updateTouchPoint(dtp,&p); } } //see if we should be grabbing the gesture if (!_stealMouse /* !ignoring gesture*/) { bool offerGrab = false; const int dragThreshold = QGuiApplication::styleHints()->startDragDistance(); for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) { if (p.state() == Qt::TouchPointReleased) continue; const QPointF ¤tPos = p.scenePos(); const QPointF &startPos = p.startScenePos(); if (qAbs(currentPos.x() - startPos.x()) > dragThreshold) offerGrab = true; else if (qAbs(currentPos.y() - startPos.y()) > dragThreshold) offerGrab = true; if (offerGrab) break; } if (offerGrab) { QQuickGrabGestureEvent event; event._touchPoints = _touchPoints.values(); emit gestureStarted(&event); if (event.wantsGrab()) grabGesture(); } } if (ended) emit released(_releasedTouchPoints); if (moved) emit updated(_movedTouchPoints); if (started) emit pressed(_pressedTouchPoints); if (ended || moved || started) emit touchUpdated(_touchPoints.values()); } }