bool QcMapItem::send_mouse_event(QMouseEvent * event) { qInfo() << event; QPointF local_position = mapFromScene(event->windowPos()); QQuickWindow * _window = window(); QQuickItem * grabber = _window ? _window->mouseGrabberItem() : nullptr; // Fixme: faster ? / duplicated bool is_mouse_area = !grabber or QString(grabber->metaObject()->className()).startsWith(QStringLiteral("QQuickMouseArea")); bool steal_event = m_gesture_area->is_active(); // means pan or pinch is active // grabber is QQuickMouseArea, steal_event is false first then true // qInfo() << event << "\ngrabber" << grabber << "\nsteal_event" << steal_event << is_mouse_area; if (is_mouse_area and (steal_event or contains(local_position)) and (!grabber or !grabber->keepMouseGrab())) { QScopedPointer<QMouseEvent> mouseEvent(QQuickWindowPrivate::cloneMouseEvent(event, &local_position)); mouseEvent->setAccepted(false); switch (mouseEvent->type()) { case QEvent::MouseMove: m_gesture_area->handle_mouse_move_event(mouseEvent.data()); break; case QEvent::MouseButtonPress: m_gesture_area->handle_mouse_press_event(mouseEvent.data()); break; case QEvent::MouseButtonRelease: m_gesture_area->handle_mouse_release_event(mouseEvent.data()); break; default: break; } steal_event = m_gesture_area->is_active(); // recheck value // Fixme: duplicated code ??? grabber = _window ? _window->mouseGrabberItem() : nullptr; // qInfo() << "grabber" << grabber << "\nsteal_event" << steal_event; if (grabber and steal_event and !grabber->keepMouseGrab() and grabber != this) { // qInfo() << "grab mouse"; grabMouse(); } if (steal_event) { event->setAccepted(true); return true; // do not deliver event } else return false; // deliver event } else { // ungrab if necessary and deliver event if (event->type() == QEvent::MouseButtonRelease and (_window and _window->mouseGrabberItem() == this)) // qInfo() << "ungrab mouse"; ungrabMouse(); return false; // deliver event } }
bool QQuickMouseArea::sendMouseEvent(QMouseEvent *event) { Q_D(QQuickMouseArea); QPointF localPos = mapFromScene(event->windowPos()); QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; bool stealThisEvent = d->stealMouse; if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab())) { QMouseEvent mouseEvent(event->type(), localPos, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); mouseEvent.setAccepted(false); switch (event->type()) { case QEvent::MouseMove: mouseMoveEvent(&mouseEvent); break; case QEvent::MouseButtonPress: mousePressEvent(&mouseEvent); break; case QEvent::MouseButtonRelease: mouseReleaseEvent(&mouseEvent); stealThisEvent = d->stealMouse; break; default: break; } grabber = c ? c->mouseGrabberItem() : 0; if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) grabMouse(); return stealThisEvent; } if (event->type() == QEvent::MouseButtonRelease) { if (d->pressed) { d->pressed &= ~event->button(); emit pressedButtonsChanged(); if (!d->pressed) { // no other buttons are pressed d->stealMouse = false; if (c && c->mouseGrabberItem() == this) ungrabMouse(); emit canceled(); emit pressedChanged(); emit containsPressChanged(); if (d->hovered) { d->hovered = false; emit hoveredChanged(); } } } } return false; }
void QQuickMultiPointTouchArea::touchEvent(QTouchEvent *event) { switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: { //if e.g. a parent Flickable has the mouse grab, don't process the touch events QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; if (grabber && grabber != this && grabber->keepMouseGrab() && grabber->isEnabled()) { QQuickItem *item = this; while ((item = item->parentItem())) { if (item == grabber) return; } } updateTouchData(event); if (event->type() == QEvent::TouchEnd) ungrab(); break; } case QEvent::TouchCancel: ungrab(); break; default: QQuickItem::touchEvent(event); break; } }
bool QQuickMultiPointTouchArea::sendMouseEvent(QMouseEvent *event) { QPointF localPos = mapFromScene(event->windowPos()); QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; bool stealThisEvent = _stealMouse; if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab())) { QMouseEvent mouseEvent(event->type(), localPos, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); mouseEvent.setAccepted(false); QGuiApplicationPrivate::setMouseEventCapsAndVelocity(&mouseEvent, QGuiApplicationPrivate::mouseEventCaps(event), QGuiApplicationPrivate::mouseEventVelocity(event)); QGuiApplicationPrivate::setMouseEventSource(&mouseEvent, Qt::MouseEventSynthesizedByQt); switch (mouseEvent.type()) { case QEvent::MouseMove: mouseMoveEvent(&mouseEvent); break; case QEvent::MouseButtonPress: mousePressEvent(&mouseEvent); break; case QEvent::MouseButtonRelease: mouseReleaseEvent(&mouseEvent); break; default: break; } grabber = c ? c->mouseGrabberItem() : 0; if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) grabMouse(); return stealThisEvent; } if (event->type() == QEvent::MouseButtonRelease) { _stealMouse = false; if (c && c->mouseGrabberItem() == this) ungrabMouse(); setKeepMouseGrab(false); } return false; }
bool QQuickMultiPointTouchArea::shouldFilter(QEvent *event) { QQuickWindow *c = window(); QQuickItem *grabber = c ? c->mouseGrabberItem() : 0; bool disabledItem = grabber && !grabber->isEnabled(); bool stealThisEvent = _stealMouse; bool containsPoint = false; if (!stealThisEvent) { switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseMove: case QEvent::MouseButtonRelease: { QMouseEvent *me = static_cast<QMouseEvent*>(event); containsPoint = contains(mapFromScene(me->windowPos())); } break; case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: { QTouchEvent *te = static_cast<QTouchEvent*>(event); for (const QTouchEvent::TouchPoint &point : te->touchPoints()) { if (contains(mapFromScene(point.scenePos()))) { containsPoint = true; break; } } } break; default: break; } } if ((stealThisEvent || containsPoint) && (!grabber || !grabber->keepMouseGrab() || disabledItem)) { return true; } ungrab(); return false; }