bool MInverseMouseArea::eventFilter(QObject *obj, QEvent *ev) { Q_UNUSED(obj); if (!m_enabled || !isVisible()) return false; switch (ev->type()) { case QEvent::MouseButtonPress: { QMouseEvent *me = static_cast<QMouseEvent *>(ev); QPointF mappedPos = me->windowPos();//??is mapping to root item needed still m_pressed = !isUnderMouse() && !isClickedOnSoftwareInputPanel(); if (m_pressed) { m_lastsceenPos = me->screenPos(); emit pressedOutside(mappedPos.x(), mappedPos.y()); } break; } case QEvent::MouseMove: { if (m_pressed) { QMouseEvent *me = static_cast<QMouseEvent *>(ev); const QPointF &dist = me->screenPos() - m_lastsceenPos; if (dist.x() * dist.x() + dist.y() * dist.y() > FlickThresholdSquare) m_pressed = false; } break; } case QEvent::MouseButtonRelease: { QMouseEvent *me = static_cast<QMouseEvent *>(ev); QPointF mappedPos = mapToRootItem(me->windowPos()); if (m_pressed) { m_pressed = false; emit clickedOutside(mappedPos.x(), mappedPos.y()); } break; } default: break; } 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; }
bool KisInputManager::Private::EventEater::eventFilter(QObject* target, QEvent* event ) { if ((hungry && (event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease)) // || (peckish && (event->type() == QEvent::MouseButtonPress)) ) { // Chow down if (KisTabletDebugger::instance()->debugEnabled()) { QString pre = QString("[BLOCKED]"); QMouseEvent *ev = static_cast<QMouseEvent*>(event); dbgTablet << KisTabletDebugger::instance()->eventToString(*ev,pre); } peckish = false; return true; } else if ((event->type() == QEvent::MouseButtonPress) /* Need to scrutinize */ && (!savedEvent)) /* Otherwise we enter a loop repeatedly storing the same event */ { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // Pocket the event and decide what to do with it later // savedEvent = *(static_cast<QMouseEvent*>(event)); savedEvent = new QMouseEvent(QEvent::MouseButtonPress, mouseEvent->pos(), mouseEvent->windowPos(), mouseEvent->screenPos(), mouseEvent->button(), mouseEvent->buttons(), mouseEvent->modifiers()); savedTarget = target; mouseEvent->accept(); return true; } return false; // All clear - let this one through! }
bool MInverseMouseArea::eventFilter(QObject *obj, QEvent *ev) { Q_UNUSED(obj); if (!m_enabled || !isVisible()) return false; switch (ev->type()) { case QEvent::MouseButtonPress: { QMouseEvent *m = static_cast<QMouseEvent *>(ev); QPointF pos = mapFromScene(m->windowPos()); bool pressed = !contains(pos); if (pressed) emit pressedOutside(pos.x(), pos.y()); break; } default: break; } return false; }
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()); } }