From 37bb264e777e6b46749963e99db2ce6e3835fa9b Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Wed, 3 Jun 2009 21:04:10 +0200 Subject: Set the gesture manager state before sending an event --- src/gui/kernel/qgesturemanager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp index 799bcfd..a1d55fa 100644 --- a/src/gui/kernel/qgesturemanager.cpp +++ b/src/gui/kernel/qgesturemanager.cpp @@ -176,8 +176,6 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) gesture->d_func()->singleshot = false; } } - Q_ASSERT(!started.isEmpty()); - ret = sendGestureEvent(receiver, started, QSet()); if (!activeGestures.isEmpty()) { DEBUG() << "QGestureManager: new state = Gesture"; @@ -189,6 +187,9 @@ bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event) DEBUG() << "QGestureManager: new state = NotGesture"; state = NotGesture; } + + Q_ASSERT(!started.isEmpty()); + ret = sendGestureEvent(receiver, started, QSet()); } else if (!maybeGestures.isEmpty()) { if (state != MaybeGesture) { // We got a new set of events that look like a start -- cgit v0.12 From f04eafcc816de608aad64b9cf1132cfd421642ca Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Wed, 3 Jun 2009 21:05:46 +0200 Subject: Gesture autotest improvements --- tests/auto/gestures/customgesturerecognizer.cpp | 4 +- tests/auto/gestures/tst_gestures.cpp | 77 ++++++++++++++++++++++--- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/tests/auto/gestures/customgesturerecognizer.cpp b/tests/auto/gestures/customgesturerecognizer.cpp index cb3f7bf..c76475e 100644 --- a/tests/auto/gestures/customgesturerecognizer.cpp +++ b/tests/auto/gestures/customgesturerecognizer.cpp @@ -115,8 +115,8 @@ PanGestureRecognizer::PanGestureRecognizer(QObject *parent) QGestureRecognizer::Result PanGestureRecognizer::filterEvent(const QEvent *event) { - if (event->type() != QEvent::TouchBegin || - event->type() != QEvent::TouchUpdate || + if (event->type() != QEvent::TouchBegin && + event->type() != QEvent::TouchUpdate && event->type() != QEvent::TouchEnd) return QGestureRecognizer::Ignore; diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp index 0061506..8df856d 100644 --- a/tests/auto/gestures/tst_gestures.cpp +++ b/tests/auto/gestures/tst_gestures.cpp @@ -110,6 +110,14 @@ struct GestureState TouchPoint point; QPoint offset; } secondfinger; + struct PanGesture + { + bool delivered; + TouchPoint startPoints[2]; + TouchPoint lastPoints[2]; + TouchPoint points[2]; + QPoint offset; + } pan; QSet cancelled; } last; @@ -292,6 +300,18 @@ protected: if (shouldAcceptSecondFingerGesture) g->accept(); } + if (PanGesture *g = (PanGesture*)e->gesture(PanGestureRecognizer::Name)) { + gesture.last.pan.delivered = true; + gesture.last.pan.startPoints[0] = g->startPoints[0]; + gesture.last.pan.startPoints[1] = g->startPoints[1]; + gesture.last.pan.lastPoints[0] = g->lastPoints[0]; + gesture.last.pan.lastPoints[1] = g->lastPoints[1]; + gesture.last.pan.points[0] = g->points[0]; + gesture.last.pan.points[1] = g->points[1]; + gesture.last.pan.offset = g->offset; + if (shouldAcceptPanGesture) + g->accept(); + } gesture.last.cancelled = e->cancelledGestures(); return true; } @@ -498,7 +518,8 @@ private slots: void simpleGraphicsItem(); void overlappingGraphicsItems(); - void touch(); + void touch_widget(); + void touch_graphicsView(); void panOnWidgets(); @@ -506,6 +527,7 @@ private: SingleshotGestureRecognizer *singleshotRecognizer; PinchGestureRecognizer *pinchRecognizer; SecondFingerGestureRecognizer *secondFingerRecognizer; + PanGestureRecognizer *panGestureRecognizer; GestureWidget *mainWidget; void sendPinchEvents(QWidget *receiver, const QPoint &fromFinger1, const QPoint &fromFinger2); @@ -516,9 +538,11 @@ tst_Gestures::tst_Gestures() singleshotRecognizer = new SingleshotGestureRecognizer; pinchRecognizer = new PinchGestureRecognizer; secondFingerRecognizer = new SecondFingerGestureRecognizer; + panGestureRecognizer = new PanGestureRecognizer; qApp->addGestureRecognizer(singleshotRecognizer); qApp->addGestureRecognizer(pinchRecognizer); qApp->addGestureRecognizer(secondFingerRecognizer); + qApp->addGestureRecognizer(panGestureRecognizer); } tst_Gestures::~tst_Gestures() @@ -805,7 +829,46 @@ void tst_Gestures::overlappingGraphicsItems() QVERIFY(item->gesture.last.singleshot.delivered); } -void tst_Gestures::touch() +void tst_Gestures::touch_widget() +{ + GestureWidget leftWidget(GestureWidget::DoNotGrabGestures); + leftWidget.setObjectName("leftWidget"); + leftWidget.setAttribute(Qt::WA_AcceptTouchEvents); + GestureWidget rightWidget(GestureWidget::DoNotGrabGestures); + rightWidget.setObjectName("rightWidget"); + rightWidget.setAttribute(Qt::WA_AcceptTouchEvents); + delete mainWidget->layout(); + (void)new QHBoxLayout(mainWidget); + mainWidget->layout()->addWidget(&leftWidget); + mainWidget->layout()->addWidget(&rightWidget); + QApplication::processEvents(); + + QTest::touchEvent() + .press(0, QPoint(10, 10), &leftWidget); + QTest::touchEvent() + .move(0, QPoint(12, 30), &leftWidget); + QTest::touchEvent() + .stationary(0) + .press(1, QPoint(15, 15), &rightWidget); + QTest::touchEvent() + .move(0, QPoint(10, 35), &leftWidget) + .press(1, QPoint(15, 15), &rightWidget); + QTest::touchEvent() + .move(0, QPoint(10, 40), &leftWidget) + .move(1, QPoint(20, 50), &rightWidget); + QTest::touchEvent() + .release(0, QPoint(10, 40), &leftWidget) + .release(1, QPoint(20, 50), &rightWidget); + QVERIFY(!mainWidget->touch.seenTouchBeginEvent); + QVERIFY(leftWidget.touch.seenTouchBeginEvent); + QVERIFY(leftWidget.touch.seenTouchUpdateEvent); + QVERIFY(leftWidget.touch.seenTouchEndEvent); + QVERIFY(rightWidget.touch.seenTouchBeginEvent); + QVERIFY(rightWidget.touch.seenTouchUpdateEvent); + QVERIFY(rightWidget.touch.seenTouchEndEvent); +} + +void tst_Gestures::touch_graphicsView() { mainWidget->setAttribute(Qt::WA_AcceptTouchEvents); GraphicsScene scene; @@ -877,13 +940,9 @@ void tst_Gestures::panOnWidgets() QTest::touchEvent() .release(0, QPoint(10, 40), &leftWidget) .release(1, QPoint(20, 50), &rightWidget); - QVERIFY(!mainWidget->touch.seenTouchBeginEvent); - QVERIFY(leftWidget.touch.seenTouchBeginEvent); - QVERIFY(leftWidget.touch.seenTouchUpdateEvent); - QVERIFY(leftWidget.touch.seenTouchEndEvent); - QVERIFY(rightWidget.touch.seenTouchBeginEvent); - QVERIFY(rightWidget.touch.seenTouchUpdateEvent); - QVERIFY(rightWidget.touch.seenTouchEndEvent); + + QVERIFY(leftWidget.gesture.last.pan.delivered); + QVERIFY(rightWidget.gesture.last.pan.delivered); } QTEST_MAIN(tst_Gestures) -- cgit v0.12 From 948e68ffa22e9b584f0612e3c67ad46a68a09746 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Mon, 8 Jun 2009 16:06:27 +0200 Subject: Compile fix after the multitouch api review. --- tests/auto/gestures/customgesturerecognizer.cpp | 22 +++++++++++----------- tests/auto/gestures/tst_gestures.cpp | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/auto/gestures/customgesturerecognizer.cpp b/tests/auto/gestures/customgesturerecognizer.cpp index c76475e..12d07b1 100644 --- a/tests/auto/gestures/customgesturerecognizer.cpp +++ b/tests/auto/gestures/customgesturerecognizer.cpp @@ -121,24 +121,24 @@ QGestureRecognizer::Result PanGestureRecognizer::filterEvent(const QEvent *event return QGestureRecognizer::Ignore; const QTouchEvent *e = static_cast(event); - const QList &points = e->touchPoints(); + const QList &points = e->touchPoints(); if (points.size() >= 1) { gesture->lastPoints[0] = gesture->points[0]; - gesture->points[0].id = points.at(0)->id(); - gesture->points[0].pt = points.at(0)->startPos().toPoint(); - gesture->points[0].state = (TouchPoint::State)points.at(0)->state(); - if (points.at(0)->state() == Qt::TouchPointPressed) { + gesture->points[0].id = points.at(0).id(); + gesture->points[0].pt = points.at(0).startPos().toPoint(); + gesture->points[0].state = (TouchPoint::State)points.at(0).state(); + if (points.at(0).state() == Qt::TouchPointPressed) { gesture->startPoints[0] = gesture->points[0]; gesture->lastPoints[0] = gesture->points[0]; } } if (points.size() >= 2) { gesture->lastPoints[1] = gesture->points[1]; - gesture->points[1].id = points.at(1)->id(); - gesture->points[1].pt = points.at(1)->startPos().toPoint(); - gesture->points[1].state = (TouchPoint::State)points.at(1)->state(); - if (points.at(1)->state() == Qt::TouchPointPressed) { + gesture->points[1].id = points.at(1).id(); + gesture->points[1].pt = points.at(1).startPos().toPoint(); + gesture->points[1].state = (TouchPoint::State)points.at(1).state(); + if (points.at(1).state() == Qt::TouchPointPressed) { gesture->startPoints[1] = gesture->points[1]; gesture->lastPoints[1] = gesture->points[1]; } @@ -148,9 +148,9 @@ QGestureRecognizer::Result PanGestureRecognizer::filterEvent(const QEvent *event return QGestureRecognizer::GestureStarted; if (points.size() > 2) return QGestureRecognizer::MaybeGesture; - if (points.at(0)->state() == Qt::TouchPointPressed) + if (points.at(0).state() == Qt::TouchPointPressed) return QGestureRecognizer::MaybeGesture; - if (points.at(0)->state() == Qt::TouchPointReleased) + if (points.at(0).state() == Qt::TouchPointReleased) return QGestureRecognizer::GestureFinished; return QGestureRecognizer::GestureStarted; } diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp index 8df856d..9c9d279 100644 --- a/tests/auto/gestures/tst_gestures.cpp +++ b/tests/auto/gestures/tst_gestures.cpp @@ -447,13 +447,13 @@ public: protected: bool sceneEvent(QEvent *event) { - if (event->type() == QEvent::GraphicsSceneTouchBegin) { + if (event->type() == QEvent::TouchBegin) { event->accept(); ++touch.seenTouchBeginEvent; return true; - } else if (event->type() == QEvent::GraphicsSceneTouchUpdate) { + } else if (event->type() == QEvent::TouchUpdate) { ++touch.seenTouchUpdateEvent; - } else if (event->type() == QEvent::GraphicsSceneTouchEnd) { + } else if (event->type() == QEvent::TouchEnd) { ++touch.seenTouchEndEvent; } else if (event->type() == QEvent::GraphicsSceneGesture) { QGraphicsSceneGestureEvent *e = static_cast(event); -- cgit v0.12 From cb8576e538e08e450ed4129d03272071bdc15709 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Mon, 8 Jun 2009 16:06:56 +0200 Subject: All events should be filtered through the gesture manager. --- src/gui/kernel/qapplication.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index 01c8b11..fcc8d30 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -3606,11 +3606,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e) if (!d->grabbedGestures.isEmpty() && e->spontaneous() && receiver->isWidgetType()) { const QEvent::Type t = e->type(); - if (t == QEvent::MouseButtonPress || t == QEvent::MouseButtonRelease || t == QEvent::MouseMove - || t == QEvent::MouseButtonDblClick || t == QEvent::Wheel - || t == QEvent::KeyPress || t == QEvent::KeyRelease - || t == QEvent::TabletPress || t == QEvent::TabletRelease || t == QEvent::TabletMove - || t >= QEvent::User) { + if (t != QEvent::Gesture && t != QEvent::GraphicsSceneGesture) { if (QGestureManager::instance()->filterEvent(static_cast(receiver), e)) return true; } -- cgit v0.12