From f0a5fd33091a989e48a3329c40224cdad42fa355 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Wed, 22 Sep 2010 15:08:29 +0200 Subject: Gesture events will be delivered to QGraphicsItems Refactoring gestures to have a working event delivery to QGraphicsItem needs the recognizers to accept graphics mouse events. --- gestures.pro | 4 ++- qdeclarativegesturearea.cpp | 7 ++-- qdeclarativegesturerecognizers.cpp | 66 ++++++++++++++++++++++---------------- 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/gestures.pro b/gestures.pro index 2da157d..0efabbe 100644 --- a/gestures.pro +++ b/gestures.pro @@ -15,7 +15,9 @@ HEADERS += qdeclarativegesturearea_p.h \ qdeclarativegesturerecognizers_p.h QTDIR_build:DESTDIR = $$QT_BUILD_TREE/imports/$$TARGETPATH -else:DESTDIR = . + +#else:DESTDIR = . + target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH qmldir.files += $$PWD/qmldir diff --git a/qdeclarativegesturearea.cpp b/qdeclarativegesturearea.cpp index c5f621f..fafc574 100644 --- a/qdeclarativegesturearea.cpp +++ b/qdeclarativegesturearea.cpp @@ -197,6 +197,8 @@ QDeclarativeGestureArea::QDeclarativeGestureArea(QDeclarativeItem *parent) : { setAcceptedMouseButtons(Qt::LeftButton); setAcceptTouchEvents(true); + + //qDebug() << "create plugin gesture area"; } QDeclarativeGestureArea::~QDeclarativeGestureArea() @@ -218,8 +220,9 @@ bool QDeclarativeGestureArea::sceneEvent(QEvent *event) case QEvent::GraphicsSceneMousePress: case QEvent::MouseButtonPress: case QEvent::TouchBegin: - event->accept(); - return true; + break; + //event->accept(); + //return true; case QEvent::Gesture: return d->gestureEvent(static_cast(event)); default: diff --git a/qdeclarativegesturerecognizers.cpp b/qdeclarativegesturerecognizers.cpp index d8486a0..9d9aeaf 100644 --- a/qdeclarativegesturerecognizers.cpp +++ b/qdeclarativegesturerecognizers.cpp @@ -72,8 +72,6 @@ QGesture *QPanGestureRecognizer::create(QObject *target) #else static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); #endif - } else if (target) { - return 0; } return new QPanGesture; } @@ -280,12 +278,8 @@ QPinchGestureRecognizer::QPinchGestureRecognizer() QGesture *QPinchGestureRecognizer::create(QObject *target) { - if (target) { - if (target->isWidgetType()) - static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); - else - return 0; - } + if (target && target->isWidgetType()) + static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); return new QPinchGesture; } @@ -481,12 +475,8 @@ QSwipeGestureRecognizer::QSwipeGestureRecognizer() QGesture *QSwipeGestureRecognizer::create(QObject *target) { - if (target) { - if (target->isWidgetType()) - static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); - else - return 0; - } + if (target && target->isWidgetType()) + static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); return new QSwipeGesture; } @@ -715,23 +705,28 @@ QTapGestureRecognizer::QTapGestureRecognizer() QGesture *QTapGestureRecognizer::create(QObject *target) { - if (target) { - if (target->isWidgetType()) - static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); - else - return 0; - } + if (target && target->isWidgetType()) + static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); return new QTapGesture; } QGestureRecognizer::Result QTapGestureRecognizer::recognize(QGesture *state, - QObject *, + QObject * target, QEvent *event) { +// if (target) { +// qDebug() << "QTapGestureRecognizer::recognize"; +// target->dumpObjectInfo(); +// } + QTapGesture *q = static_cast(state); QGestureRecognizer::Result result = QGestureRecognizer::CancelGesture; +#ifndef QT_NO_GRAPHICSVIEW + const QGraphicsSceneMouseEvent *gsme = static_cast(event); +#endif + switch (event->type()) { case QEvent::TouchBegin: { @@ -759,6 +754,21 @@ QGestureRecognizer::Result QTapGestureRecognizer::recognize(QGesture *state, break; } + +#ifndef QT_NO_GRAPHICSVIEW + case QEvent::GraphicsSceneMousePress: + qDebug() << "GraphicsSceneMousePress in tap rec."; + if (!q->property("gotTouched").toBool()) { + if (!(gsme->modifiers() & Qt::ControlModifier)) { + state->setProperty("position", gsme->screenPos()); + state->setHotSpot(gsme->screenPos()); + event->accept(); + return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint; + } + } + return QGestureRecognizer::Ignore; +#endif + case QEvent::MouseButtonPress: if (!q->property("gotTouched").toBool()) { QMouseEvent *ev = static_cast(event); @@ -771,9 +781,15 @@ QGestureRecognizer::Result QTapGestureRecognizer::recognize(QGesture *state, } return QGestureRecognizer::Ignore; +#ifndef QT_NO_GRAPHICSVIEW + case QEvent::GraphicsSceneMouseMove: +#endif case QEvent::MouseMove: return QGestureRecognizer::Ignore; +#ifndef QT_NO_GRAPHICSVIEW + case QEvent::GraphicsSceneMouseRelease: +#endif case QEvent::MouseButtonRelease: if (!q->property("gotTouched").toBool()) { if (state->state() == Qt::GestureStarted) { @@ -820,12 +836,8 @@ QTapAndHoldGestureRecognizer::QTapAndHoldGestureRecognizer() QGesture *QTapAndHoldGestureRecognizer::create(QObject *target) { - if (target) { - if (target->isWidgetType()) - static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); - else - return 0; - } + if (target && target->isWidgetType()) + static_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); return new QTapAndHoldGesture; } -- cgit v1.2.3