/*!
    \internal
*/
void QDeclarativeGeoMap::touchEvent(QTouchEvent *event)
{
    if (isInteractive()) {
        m_gestureArea->handleTouchEvent(event);
        if ( event->type() == QEvent::TouchEnd ||
             event->type() == QEvent::TouchCancel) {
            ungrabTouchPoints();
        }
    }
    //this will always ignore event so sythesized event is generated;
    QQuickItem::touchEvent(event);
}
void
QcMapItem::touchEvent(QTouchEvent * event)
{
  // qInfo();
  if (is_interactive()) {
    m_gesture_area->handle_touch_event(event);
    if (event->type() == QEvent::TouchEnd or
        event->type() == QEvent::TouchCancel) {
      ungrabTouchPoints();
    }
  } else
    // ignore event so sythesized event is generated;
    QQuickItem::touchEvent(event);
}
bool
QcMapItem::send_touch_event(QTouchEvent * event)
{
  QQuickWindowPrivate * _window = window() ? QQuickWindowPrivate::get(window()) : nullptr;
  const QTouchEvent::TouchPoint & point = event->touchPoints().first();
  QQuickItem * grabber = _window ? _window->itemForTouchPointId.value(point.id()) : nullptr;
  // Fixme: faster ?
  bool is_mouse_area = QString(grabber->metaObject()->className()).startsWith(QStringLiteral("QQuickMouseArea"));

  bool steal_event = m_gesture_area->is_active();
  bool contains_point = contains(mapFromScene(point.scenePos()));

  if (is_mouse_area and (steal_event or contains_point) and (!grabber or !grabber->keepTouchGrab())) {
    QScopedPointer<QTouchEvent> touch_event(new QTouchEvent(event->type(), event->device(), event->modifiers(),
                                                            event->touchPointStates(), event->touchPoints()));
    touch_event->setTimestamp(event->timestamp());
    touch_event->setAccepted(false);

    m_gesture_area->handle_touch_event(touch_event.data());

    steal_event = m_gesture_area->is_active(); // recheck value
    // Fixme: duplicated code ???
    grabber = _window ? _window->itemForTouchPointId.value(point.id()) : nullptr;

    if (grabber and steal_event and !grabber->keepTouchGrab() and grabber != this) {
      QVector<int> ids;
      for (const auto & touch_point : event->touchPoints())
        if (!(touch_point.state() & Qt::TouchPointReleased))
          ids.append(touch_point.id());
      grabTouchPoints(ids);
    }

    if (steal_event) {
      // do not deliver
      event->setAccepted(true);
      return true;
    } else
      return false;

  } else {
    // ungrab if necessary and deliver event
    if (event->type() == QEvent::TouchEnd
        and (_window and _window->itemForTouchPointId.value(point.id()) == this))
      ungrabTouchPoints();
    return false;
  }
}
Beispiel #4
0
void QQuickMultiPointTouchArea::ungrab()
{
    _stealMouse = false;
    setKeepMouseGrab(false);
    setKeepTouchGrab(false);
    ungrabTouchPoints();

    if (_touchPoints.count()) {
        for (QObject *obj : qAsConst(_touchPoints))
            static_cast<QQuickTouchPoint*>(obj)->setPressed(false);
        emit canceled(_touchPoints.values());
        clearTouchLists();
        for (QObject *obj : qAsConst(_touchPoints)) {
            QQuickTouchPoint *dtp = static_cast<QQuickTouchPoint*>(obj);
            if (!dtp->isQmlDefined())
                delete dtp;
            else
                dtp->setInUse(false);
        }
        _touchPoints.clear();
        emit touchUpdated(QList<QObject*>());
    }
}