39bool QQuickSinglePointHandler::wantsPointerEvent(QPointerEvent *event)
41 Q_D(QQuickSinglePointHandler);
42 if (!QQuickPointerDeviceHandler::wantsPointerEvent(event))
45 if (d->pointInfo.id() != -1) {
49 int candidatePointCount = 0;
51 QEventPoint *point =
nullptr;
52 for (
int i = 0; i < event->pointCount(); ++i) {
53 auto &p = event->point(i);
54 const bool found = (p.id() == d->pointInfo.id());
57 if (wantsEventPoint(event, p)) {
58 ++candidatePointCount;
65 if (event->type() == QEvent::TouchBegin && event->points().count() == 1) {
66 const QEventPoint &point = event->point(0);
67 qCDebug(lcTouchTarget) <<
this <<
"pointId" << Qt::hex << point.id()
68 <<
"was received as a stray TouchBegin event. Canceling existing gesture"
69 " and starting over.";
70 d->pointInfo.reset(event, point);
73 qCWarning(lcTouchTarget) <<
this <<
"pointId" << Qt::hex << d->pointInfo.id()
74 <<
"is missing from current event, but was neither canceled nor released."
75 " Ignoring:" << event->type();
79 if (candidatePointCount == 1 || (candidatePointCount > 1 && d->ignoreAdditionalPoints)) {
83 cancelAllGrabs(event, *point);
90 int candidatePointCount = 0;
91 QEventPoint *chosen =
nullptr;
92 for (
int i = 0; i < event->pointCount(); ++i) {
93 auto &p = event->point(i);
94 if (!event->exclusiveGrabber(p) && wantsEventPoint(event, p)) {
95 ++candidatePointCount;
102 if (chosen && candidatePointCount == 1) {
103 setPointId(chosen->id());
104 chosen->setAccepted();
107 return d->pointInfo.id() != -1;
110void QQuickSinglePointHandler::handlePointerEventImpl(QPointerEvent *event)
112 Q_D(QQuickSinglePointHandler);
113 QQuickPointerDeviceHandler::handlePointerEventImpl(event);
114 QEventPoint *currentPoint =
const_cast<QEventPoint *>(event->pointById(d->pointInfo.id()));
115 Q_ASSERT(currentPoint);
116 if (!QQuickDeliveryAgentPrivate::isSynthMouse(event))
117 d->pointInfo.reset(event, *currentPoint);
118 handleEventPoint(event, *currentPoint);
122void QQuickSinglePointHandler::handleEventPoint(QPointerEvent *event, QEventPoint &point)
124 if (point.state() == QEventPoint::Released) {
127 if (event->isSinglePointEvent()) {
128 const Qt::MouseButtons releasedButtons =
static_cast<QSinglePointEvent *>(event)->buttons();
129 if ((releasedButtons & acceptedButtons()) != Qt::NoButton)
134 setExclusiveGrab(event, point,
false);
139void QQuickSinglePointHandler::onGrabChanged(QQuickPointerHandler *grabber, QPointingDevice::GrabTransition transition, QPointerEvent *event, QEventPoint &point)
141 Q_D(QQuickSinglePointHandler);
144 switch (transition) {
145 case QPointingDevice::GrabExclusive:
146 d->pointInfo.m_sceneGrabPosition = point.sceneGrabPosition();
148 QQuickPointerHandler::onGrabChanged(grabber, transition, event, point);
150 case QPointingDevice::GrabPassive:
151 d->pointInfo.m_sceneGrabPosition = point.sceneGrabPosition();
152 QQuickPointerHandler::onGrabChanged(grabber, transition, event, point);
154 case QPointingDevice::OverrideGrabPassive:
156 case QPointingDevice::UngrabPassive:
157 case QPointingDevice::UngrabExclusive:
158 case QPointingDevice::CancelGrabPassive:
159 case QPointingDevice::CancelGrabExclusive:
161 QQuickPointerHandler::onGrabChanged(grabber, transition, event, point);
173void QQuickSinglePointHandler::moveTarget(QPointF pos, QEventPoint &point)
175 Q_D(QQuickSinglePointHandler);
176 target()->setPosition(pos);
177 d->pointInfo.m_scenePosition = point.scenePosition();
178 d->pointInfo.m_position = target()->mapFromScene(d->pointInfo.m_scenePosition);