diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2009-06-15 13:04:48 (GMT) |
---|---|---|
committer | Bradley T. Hughes <bradley.hughes@nokia.com> | 2009-06-15 13:04:48 (GMT) |
commit | 460822e82edf7ee2dce022121b12aa7f7f5847ef (patch) | |
tree | d731a985b19fb366d56b7afa66018337bcec0bca | |
parent | 83d4da7bffa9118012a690ac99015a06c17b9133 (diff) | |
parent | cb8576e538e08e450ed4129d03272071bdc15709 (diff) | |
download | Qt-460822e82edf7ee2dce022121b12aa7f7f5847ef.zip Qt-460822e82edf7ee2dce022121b12aa7f7f5847ef.tar.gz Qt-460822e82edf7ee2dce022121b12aa7f7f5847ef.tar.bz2 |
Merge branch 'master' of git@scm.dev.nokia.troll.no:qt/qt-multitouch
-rw-r--r-- | src/gui/kernel/qapplication.cpp | 6 | ||||
-rw-r--r-- | src/gui/kernel/qgesturemanager.cpp | 5 | ||||
-rw-r--r-- | tests/auto/gestures/customgesturerecognizer.cpp | 26 | ||||
-rw-r--r-- | tests/auto/gestures/tst_gestures.cpp | 83 |
4 files changed, 88 insertions, 32 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<QWidget*>(receiver), e)) return true; } 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<QGesture*>()); 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<QGesture*>()); } else if (!maybeGestures.isEmpty()) { if (state != MaybeGesture) { // We got a new set of events that look like a start diff --git a/tests/auto/gestures/customgesturerecognizer.cpp b/tests/auto/gestures/customgesturerecognizer.cpp index cb3f7bf..12d07b1 100644 --- a/tests/auto/gestures/customgesturerecognizer.cpp +++ b/tests/auto/gestures/customgesturerecognizer.cpp @@ -115,30 +115,30 @@ 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; const QTouchEvent *e = static_cast<const QTouchEvent*>(event); - const QList<QTouchEvent::TouchPoint*> &points = e->touchPoints(); + const QList<QTouchEvent::TouchPoint> &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 0061506..9c9d279 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<QString> 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; } @@ -427,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<QGraphicsSceneGestureEvent*>(event); @@ -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) |