diff options
author | Jo Asplin <jo.asplin@nokia.com> | 2011-11-25 09:30:03 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-30 09:30:22 +0100 |
commit | 9acec431c360379a21cdbe36d8e342083f344c3c (patch) | |
tree | dcd0e4d4d60f7f9cfb6f6d210b6ebaf016573d1b /tests/auto/integrationtests/gestures | |
parent | 75b66dc8b036c4f4ef3ff8ea109efd698b72732d (diff) |
Moved integrationtests/* into other/
Currently there seems to be no precise definition of what
an integrationtest is in the context of Qt testing.
To avoid confusion, the tests under integrationtests/ are
moved into other/ (which is effectively where we keep
tests that don't clearly fit into any other category).
Tests can be moved back into an integrationtests/ directory
at a later point, should an unambiguous definition be established.
Change-Id: I3bb289be2dc2aca11b51a8ce8fcc5942f06d6c5c
Reviewed-by: Jason McDonald <jason.mcdonald@nokia.com>
Diffstat (limited to 'tests/auto/integrationtests/gestures')
-rw-r--r-- | tests/auto/integrationtests/gestures/gestures.pro | 4 | ||||
-rw-r--r-- | tests/auto/integrationtests/gestures/tst_gestures.cpp | 2345 |
2 files changed, 0 insertions, 2349 deletions
diff --git a/tests/auto/integrationtests/gestures/gestures.pro b/tests/auto/integrationtests/gestures/gestures.pro deleted file mode 100644 index 0ec0435f62..0000000000 --- a/tests/auto/integrationtests/gestures/gestures.pro +++ /dev/null @@ -1,4 +0,0 @@ -CONFIG += testcase -TARGET = tst_gestures -QT += widgets testlib -SOURCES += tst_gestures.cpp diff --git a/tests/auto/integrationtests/gestures/tst_gestures.cpp b/tests/auto/integrationtests/gestures/tst_gestures.cpp deleted file mode 100644 index 63345fbe88..0000000000 --- a/tests/auto/integrationtests/gestures/tst_gestures.cpp +++ /dev/null @@ -1,2345 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <QtTest/QtTest> -#include <QtTest/qtesttouch.h> - -#include <qevent.h> -#include <qwidget.h> -#include <qlayout.h> -#include <qgesture.h> -#include <qgesturerecognizer.h> -#include <qgraphicsitem.h> -#include <qgraphicswidget.h> -#include <qgraphicsview.h> -#include <qmainwindow.h> - -#include <qdebug.h> - -//TESTED_CLASS= -//TESTED_FILES= - -static QPointF mapToGlobal(const QPointF &pt, QGraphicsItem *item, QGraphicsView *view) -{ - return view->viewport()->mapToGlobal(view->mapFromScene(item->mapToScene(pt))); -} - -class CustomGesture : public QGesture -{ - Q_OBJECT -public: - static Qt::GestureType GestureType; - - CustomGesture(QObject *parent = 0) - : QGesture(parent), serial(0) - { - } - - int serial; - - static const int SerialMaybeThreshold; - static const int SerialStartedThreshold; - static const int SerialFinishedThreshold; -}; -Qt::GestureType CustomGesture::GestureType = Qt::CustomGesture; -const int CustomGesture::SerialMaybeThreshold = 1; -const int CustomGesture::SerialStartedThreshold = 3; -const int CustomGesture::SerialFinishedThreshold = 6; - -class CustomEvent : public QEvent -{ -public: - static int EventType; - - CustomEvent(int serial_ = 0) - : QEvent(QEvent::Type(CustomEvent::EventType)), - serial(serial_), hasHotSpot(false) - { - } - - int serial; - QPointF hotSpot; - bool hasHotSpot; -}; -int CustomEvent::EventType = 0; - -class CustomGestureRecognizer : public QGestureRecognizer -{ -public: - static bool ConsumeEvents; - - CustomGestureRecognizer() - { - if (!CustomEvent::EventType) - CustomEvent::EventType = QEvent::registerEventType(); - } - - QGesture* create(QObject *) - { - return new CustomGesture; - } - - QGestureRecognizer::Result recognize(QGesture *state, QObject*, QEvent *event) - { - if (event->type() == CustomEvent::EventType) { - QGestureRecognizer::Result result = 0; - if (CustomGestureRecognizer::ConsumeEvents) - result |= QGestureRecognizer::ConsumeEventHint; - CustomGesture *g = static_cast<CustomGesture*>(state); - CustomEvent *e = static_cast<CustomEvent*>(event); - g->serial = e->serial; - if (e->hasHotSpot) - g->setHotSpot(e->hotSpot); - if (g->serial >= CustomGesture::SerialFinishedThreshold) - result |= QGestureRecognizer::FinishGesture; - else if (g->serial >= CustomGesture::SerialStartedThreshold) - result |= QGestureRecognizer::TriggerGesture; - else if (g->serial >= CustomGesture::SerialMaybeThreshold) - result |= QGestureRecognizer::MayBeGesture; - else - result = QGestureRecognizer::CancelGesture; - return result; - } - return QGestureRecognizer::Ignore; - } - - void reset(QGesture *state) - { - CustomGesture *g = static_cast<CustomGesture *>(state); - g->serial = 0; - QGestureRecognizer::reset(state); - } -}; -bool CustomGestureRecognizer::ConsumeEvents = false; - -// same as CustomGestureRecognizer but triggers early without the maybe state -class CustomContinuousGestureRecognizer : public QGestureRecognizer -{ -public: - CustomContinuousGestureRecognizer() - { - if (!CustomEvent::EventType) - CustomEvent::EventType = QEvent::registerEventType(); - } - - QGesture* create(QObject *) - { - return new CustomGesture; - } - - QGestureRecognizer::Result recognize(QGesture *state, QObject*, QEvent *event) - { - if (event->type() == CustomEvent::EventType) { - QGestureRecognizer::Result result = QGestureRecognizer::ConsumeEventHint; - CustomGesture *g = static_cast<CustomGesture *>(state); - CustomEvent *e = static_cast<CustomEvent *>(event); - g->serial = e->serial; - if (e->hasHotSpot) - g->setHotSpot(e->hotSpot); - if (g->serial >= CustomGesture::SerialFinishedThreshold) - result |= QGestureRecognizer::FinishGesture; - else if (g->serial >= CustomGesture::SerialMaybeThreshold) - result |= QGestureRecognizer::TriggerGesture; - else - result = QGestureRecognizer::CancelGesture; - return result; - } - return QGestureRecognizer::Ignore; - } - - void reset(QGesture *state) - { - CustomGesture *g = static_cast<CustomGesture *>(state); - g->serial = 0; - QGestureRecognizer::reset(state); - } -}; - -class GestureWidget : public QWidget -{ - Q_OBJECT -public: - GestureWidget(const char *name = 0, QWidget *parent = 0) - : QWidget(parent) - { - if (name) - setObjectName(QLatin1String(name)); - reset(); - acceptGestureOverride = false; - } - void reset() - { - customEventsReceived = 0; - gestureEventsReceived = 0; - gestureOverrideEventsReceived = 0; - events.clear(); - overrideEvents.clear(); - ignoredGestures.clear(); - } - - int customEventsReceived; - int gestureEventsReceived; - int gestureOverrideEventsReceived; - struct Events - { - QList<Qt::GestureType> all; - QList<Qt::GestureType> started; - QList<Qt::GestureType> updated; - QList<Qt::GestureType> finished; - QList<Qt::GestureType> canceled; - - void clear() - { - all.clear(); - started.clear(); - updated.clear(); - finished.clear(); - canceled.clear(); - } - } events, overrideEvents; - - bool acceptGestureOverride; - QSet<Qt::GestureType> ignoredGestures; - -protected: - bool event(QEvent *event) - { - Events *eventsPtr = 0; - if (event->type() == QEvent::Gesture) { - QGestureEvent *e = static_cast<QGestureEvent*>(event); - ++gestureEventsReceived; - eventsPtr = &events; - foreach(Qt::GestureType type, ignoredGestures) - e->ignore(e->gesture(type)); - } else if (event->type() == QEvent::GestureOverride) { - ++gestureOverrideEventsReceived; - eventsPtr = &overrideEvents; - if (acceptGestureOverride) - event->accept(); - } - if (eventsPtr) { - QGestureEvent *e = static_cast<QGestureEvent*>(event); - QList<QGesture*> gestures = e->gestures(); - foreach(QGesture *g, gestures) { - eventsPtr->all << g->gestureType(); - switch(g->state()) { - case Qt::GestureStarted: - emit gestureStarted(e->type(), g); - eventsPtr->started << g->gestureType(); - break; - case Qt::GestureUpdated: - emit gestureUpdated(e->type(), g); - eventsPtr->updated << g->gestureType(); - break; - case Qt::GestureFinished: - emit gestureFinished(e->type(), g); - eventsPtr->finished << g->gestureType(); - break; - case Qt::GestureCanceled: - emit gestureCanceled(e->type(), g); - eventsPtr->canceled << g->gestureType(); - break; - default: - qWarning() << "Unknown GestureState enum value:" << static_cast<int>(g->state()); - } - } - } else if (event->type() == CustomEvent::EventType) { - ++customEventsReceived; - } else { - return QWidget::event(event); - } - return true; - } - -Q_SIGNALS: - void gestureStarted(QEvent::Type, QGesture *); - void gestureUpdated(QEvent::Type, QGesture *); - void gestureFinished(QEvent::Type, QGesture *); - void gestureCanceled(QEvent::Type, QGesture *); - -public Q_SLOTS: - void deleteThis() { delete this; } -}; - -// TODO rename to sendGestureSequence -static void sendCustomGesture(CustomEvent *event, QObject *object, QGraphicsScene *scene = 0) -{ - QWeakPointer<QObject> receiver(object); - for (int i = CustomGesture::SerialMaybeThreshold; - i <= CustomGesture::SerialFinishedThreshold && receiver; ++i) { - event->serial = i; - if (scene) - scene->sendEvent(qobject_cast<QGraphicsObject *>(object), event); - else - QApplication::sendEvent(object, event); - } -} - -class tst_Gestures : public QObject -{ -Q_OBJECT - -public: - tst_Gestures(); - virtual ~tst_Gestures(); - -public slots: - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: - void customGesture(); - void autoCancelingGestures(); - void gestureOverChild(); - void multipleWidgetOnlyGestureInTree(); - void conflictingGestures(); - void conflictingGesturesInGraphicsView(); - void finishedWithoutStarted(); - void unknownGesture(); - void graphicsItemGesture(); - void graphicsView(); - void graphicsItemTreeGesture(); - void explicitGraphicsObjectTarget(); - void gestureOverChildGraphicsItem(); - void twoGesturesOnDifferentLevel(); - void multipleGesturesInTree(); - void multipleGesturesInComplexTree(); - void testMapToScene(); - void ungrabGesture(); - void consumeEventHint(); - void unregisterRecognizer(); - void autoCancelGestures(); - void autoCancelGestures2(); - void graphicsViewParentPropagation(); - void panelPropagation(); - void panelStacksBehindParent(); - void deleteGestureTargetWidget(); - void deleteGestureTargetItem_data(); - void deleteGestureTargetItem(); - void viewportCoordinates(); - void partialGesturePropagation(); - void testQGestureRecognizerCleanup(); - void testReuseCanceledGestures(); - void bug_13501_gesture_not_accepted(); -}; - -tst_Gestures::tst_Gestures() -{ -} - -tst_Gestures::~tst_Gestures() -{ -} - -void tst_Gestures::initTestCase() -{ - CustomGesture::GestureType = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - QVERIFY(CustomGesture::GestureType != Qt::GestureType(0)); - QVERIFY(CustomGesture::GestureType != Qt::CustomGesture); -} - -void tst_Gestures::cleanupTestCase() -{ - QGestureRecognizer::unregisterRecognizer(CustomGesture::GestureType); -} - -void tst_Gestures::init() -{ -} - -void tst_Gestures::cleanup() -{ -} - -void tst_Gestures::customGesture() -{ - GestureWidget widget; - widget.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - widget.show(); - QTest::qWaitForWindowShown(&widget); - - CustomEvent event; - event.hotSpot = widget.mapToGlobal(QPoint(5,5)); - event.hasHotSpot = true; - sendCustomGesture(&event, &widget); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - QCOMPARE(widget.customEventsReceived, TotalCustomEventsCount); - QCOMPARE(widget.gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(widget.gestureOverrideEventsReceived, 0); - QCOMPARE(widget.events.all.size(), TotalGestureEventsCount); - for(int i = 0; i < widget.events.all.size(); ++i) - QCOMPARE(widget.events.all.at(i), CustomGesture::GestureType); - QCOMPARE(widget.events.started.size(), 1); - QCOMPARE(widget.events.updated.size(), TotalGestureEventsCount - 2); - QCOMPARE(widget.events.finished.size(), 1); - QCOMPARE(widget.events.canceled.size(), 0); -} - -void tst_Gestures::consumeEventHint() -{ - GestureWidget widget; - widget.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - - CustomGestureRecognizer::ConsumeEvents = true; - CustomEvent event; - sendCustomGesture(&event, &widget); - CustomGestureRecognizer::ConsumeEvents = false; - - QCOMPARE(widget.customEventsReceived, 0); -} - -void tst_Gestures::autoCancelingGestures() -{ - GestureWidget widget; - widget.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - // send partial gesture. The gesture will be in the "maybe" state, but will - // never get enough events to fire, so Qt will have to kill it. - CustomEvent ev; - for (int i = CustomGesture::SerialMaybeThreshold; - i < CustomGesture::SerialStartedThreshold; ++i) { - ev.serial = i; - QApplication::sendEvent(&widget, &ev); - } - // wait long enough so the gesture manager will cancel the gesture - QTest::qWait(5000); - QCOMPARE(widget.customEventsReceived, CustomGesture::SerialStartedThreshold - CustomGesture::SerialMaybeThreshold); - QCOMPARE(widget.gestureEventsReceived, 0); - QCOMPARE(widget.gestureOverrideEventsReceived, 0); - QCOMPARE(widget.events.all.size(), 0); -} - -void tst_Gestures::gestureOverChild() -{ - GestureWidget widget("widget"); - QVBoxLayout *l = new QVBoxLayout(&widget); - GestureWidget *child = new GestureWidget("child"); - l->addWidget(child); - - widget.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - - CustomEvent event; - sendCustomGesture(&event, child); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - QCOMPARE(child->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(widget.customEventsReceived, 0); - QCOMPARE(child->gestureEventsReceived, 0); - QCOMPARE(child->gestureOverrideEventsReceived, 0); - QCOMPARE(widget.gestureEventsReceived, 0); - QCOMPARE(widget.gestureOverrideEventsReceived, 0); - - // enable gestures over the children - widget.grabGesture(CustomGesture::GestureType); - - widget.reset(); - child->reset(); - - sendCustomGesture(&event, child); - - QCOMPARE(child->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(widget.customEventsReceived, 0); - - QCOMPARE(child->gestureEventsReceived, 0); - QCOMPARE(child->gestureOverrideEventsReceived, 0); - QCOMPARE(widget.gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(widget.gestureOverrideEventsReceived, 0); - for(int i = 0; i < widget.events.all.size(); ++i) - QCOMPARE(widget.events.all.at(i), CustomGesture::GestureType); - QCOMPARE(widget.events.started.size(), 1); - QCOMPARE(widget.events.updated.size(), TotalGestureEventsCount - 2); - QCOMPARE(widget.events.finished.size(), 1); - QCOMPARE(widget.events.canceled.size(), 0); -} - -void tst_Gestures::multipleWidgetOnlyGestureInTree() -{ - GestureWidget parent("parent"); - QVBoxLayout *l = new QVBoxLayout(&parent); - GestureWidget *child = new GestureWidget("child"); - l->addWidget(child); - - parent.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - child->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - // sending events to the child and making sure there is no conflict - CustomEvent event; - sendCustomGesture(&event, child); - - QCOMPARE(child->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(parent.customEventsReceived, 0); - QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(child->gestureOverrideEventsReceived, 0); - QCOMPARE(parent.gestureEventsReceived, 0); - QCOMPARE(parent.gestureOverrideEventsReceived, 0); - - parent.reset(); - child->reset(); - - // same for the parent widget - sendCustomGesture(&event, &parent); - - QCOMPARE(child->customEventsReceived, 0); - QCOMPARE(parent.customEventsReceived, TotalCustomEventsCount); - QCOMPARE(child->gestureEventsReceived, 0); - QCOMPARE(child->gestureOverrideEventsReceived, 0); - QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(parent.gestureOverrideEventsReceived, 0); -} - -void tst_Gestures::conflictingGestures() -{ - GestureWidget parent("parent"); - QVBoxLayout *l = new QVBoxLayout(&parent); - GestureWidget *child = new GestureWidget("child"); - l->addWidget(child); - - parent.grabGesture(CustomGesture::GestureType); - child->grabGesture(CustomGesture::GestureType); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - // child accepts the override, parent will not receive anything - parent.acceptGestureOverride = false; - child->acceptGestureOverride = true; - - // sending events to the child and making sure there is no conflict - CustomEvent event; - sendCustomGesture(&event, child); - - QCOMPARE(child->gestureOverrideEventsReceived, 1); - QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(parent.gestureOverrideEventsReceived, 0); - QCOMPARE(parent.gestureEventsReceived, 0); - - parent.reset(); - child->reset(); - - // parent accepts the override - parent.acceptGestureOverride = true; - child->acceptGestureOverride = false; - - // sending events to the child and making sure there is no conflict - sendCustomGesture(&event, child); - - QCOMPARE(child->gestureOverrideEventsReceived, 1); - QCOMPARE(child->gestureEventsReceived, 0); - QCOMPARE(parent.gestureOverrideEventsReceived, 1); - QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount); - - parent.reset(); - child->reset(); - - // nobody accepts the override, we will send normal events to the closest - // context (i.e. to the child widget) and it will be propagated and - // accepted by the parent widget - parent.acceptGestureOverride = false; - child->acceptGestureOverride = false; - child->ignoredGestures << CustomGesture::GestureType; - - // sending events to the child and making sure there is no conflict - sendCustomGesture(&event, child); - - QCOMPARE(child->gestureOverrideEventsReceived, 1); - QCOMPARE(child->gestureEventsReceived, 1); - QCOMPARE(parent.gestureOverrideEventsReceived, 1); - QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount); - - parent.reset(); - child->reset(); - - // nobody accepts the override, and nobody accepts the gesture event - parent.acceptGestureOverride = false; - child->acceptGestureOverride = false; - parent.ignoredGestures << CustomGesture::GestureType; - child->ignoredGestures << CustomGesture::GestureType; - - // sending events to the child and making sure there is no conflict - sendCustomGesture(&event, child); - - QCOMPARE(child->gestureOverrideEventsReceived, 1); - QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(parent.gestureOverrideEventsReceived, 1); - QCOMPARE(parent.gestureEventsReceived, 1); - - parent.reset(); - child->reset(); - - // we set an attribute to make sure all gesture events are propagated - parent.grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures); - parent.acceptGestureOverride = false; - child->acceptGestureOverride = false; - parent.ignoredGestures << CustomGesture::GestureType; - child->ignoredGestures << CustomGesture::GestureType; - - // sending events to the child and making sure there is no conflict - sendCustomGesture(&event, child); - - QCOMPARE(child->gestureOverrideEventsReceived, 1); - QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(parent.gestureOverrideEventsReceived, 1); - QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount); - - parent.reset(); - child->reset(); - - Qt::GestureType ContinuousGesture = QGestureRecognizer::registerRecognizer(new CustomContinuousGestureRecognizer); - static const int ContinuousGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - child->grabGesture(ContinuousGesture); - // child accepts override. And it also receives another custom gesture. - parent.acceptGestureOverride = false; - child->acceptGestureOverride = true; - sendCustomGesture(&event, child); - - QCOMPARE(child->gestureOverrideEventsReceived, 1); - QVERIFY(child->gestureEventsReceived > TotalGestureEventsCount); - QCOMPARE(child->events.all.count(), TotalGestureEventsCount + ContinuousGestureEventsCount); - QCOMPARE(parent.gestureOverrideEventsReceived, 0); - QCOMPARE(parent.gestureEventsReceived, 0); - - QGestureRecognizer::unregisterRecognizer(ContinuousGesture); -} - -void tst_Gestures::finishedWithoutStarted() -{ - GestureWidget widget; - widget.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - - // the gesture will claim it finished, but it was never started. - CustomEvent ev; - ev.serial = CustomGesture::SerialFinishedThreshold; - QApplication::sendEvent(&widget, &ev); - - QCOMPARE(widget.customEventsReceived, 1); - QCOMPARE(widget.gestureEventsReceived, 2); - QCOMPARE(widget.gestureOverrideEventsReceived, 0); - QCOMPARE(widget.events.all.size(), 2); - QCOMPARE(widget.events.started.size(), 1); - QCOMPARE(widget.events.updated.size(), 0); - QCOMPARE(widget.events.finished.size(), 1); - QCOMPARE(widget.events.canceled.size(), 0); -} - -void tst_Gestures::unknownGesture() -{ - GestureWidget widget; - widget.grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - widget.grabGesture(Qt::CustomGesture, Qt::DontStartGestureOnChildren); - widget.grabGesture(Qt::GestureType(Qt::PanGesture+512), Qt::DontStartGestureOnChildren); - - CustomEvent event; - sendCustomGesture(&event, &widget); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - QCOMPARE(widget.gestureEventsReceived, TotalGestureEventsCount); -} - -static const QColor InstanceColors[] = { - Qt::blue, Qt::red, Qt::green, Qt::gray, Qt::yellow -}; - -class GestureItem : public QGraphicsObject -{ - Q_OBJECT - static int InstanceCount; -public: - GestureItem(const char *name = 0) - { - instanceNumber = InstanceCount++; - if (name) { - setObjectName(QLatin1String(name)); - setToolTip(name); - } - size = QRectF(0, 0, 100, 100); - customEventsReceived = 0; - gestureEventsReceived = 0; - gestureOverrideEventsReceived = 0; - events.clear(); - overrideEvents.clear(); - acceptGestureOverride = false; - - scene = 0; - } - ~GestureItem() - { - --InstanceCount; - } - - int customEventsReceived; - int gestureEventsReceived; - int gestureOverrideEventsReceived; - struct Events - { - QList<Qt::GestureType> all; - QList<Qt::GestureType> started; - QList<Qt::GestureType> updated; - QList<Qt::GestureType> finished; - QList<Qt::GestureType> canceled; - - void clear() - { - all.clear(); - started.clear(); - updated.clear(); - finished.clear(); - canceled.clear(); - } - } events, overrideEvents; - - bool acceptGestureOverride; - QSet<Qt::GestureType> ignoredGestures; - QSet<Qt::GestureType> ignoredStartedGestures; - QSet<Qt::GestureType> ignoredUpdatedGestures; - QSet<Qt::GestureType> ignoredFinishedGestures; - - QRectF size; - int instanceNumber; - - void reset() - { - customEventsReceived = 0; - gestureEventsReceived = 0; - gestureOverrideEventsReceived = 0; - events.clear(); - overrideEvents.clear(); - ignoredGestures.clear(); - ignoredStartedGestures.clear(); - ignoredUpdatedGestures.clear(); - ignoredFinishedGestures.clear(); - } - - QRectF boundingRect() const - { - return size; - } - void paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *) - { - QColor color = InstanceColors[instanceNumber % (sizeof(InstanceColors)/sizeof(InstanceColors[0]))]; - p->fillRect(boundingRect(), color); - } - - bool event(QEvent *event) - { - Events *eventsPtr = 0; - if (event->type() == QEvent::Gesture) { - ++gestureEventsReceived; - eventsPtr = &events; - QGestureEvent *e = static_cast<QGestureEvent *>(event); - foreach(Qt::GestureType type, ignoredGestures) - e->ignore(e->gesture(type)); - foreach(QGesture *g, e->gestures()) { - switch (g->state()) { - case Qt::GestureStarted: - if (ignoredStartedGestures.contains(g->gestureType())) - e->ignore(g); - break; - case Qt::GestureUpdated: - if (ignoredUpdatedGestures.contains(g->gestureType())) - e->ignore(g); - break; - case Qt::GestureFinished: - if (ignoredFinishedGestures.contains(g->gestureType())) - e->ignore(g); - break; - default: - break; - } - } - } else if (event->type() == QEvent::GestureOverride) { - ++gestureOverrideEventsReceived; - eventsPtr = &overrideEvents; - if (acceptGestureOverride) - event->accept(); - } - if (eventsPtr) { - QGestureEvent *e = static_cast<QGestureEvent*>(event); - QList<QGesture*> gestures = e->gestures(); - foreach(QGesture *g, gestures) { - eventsPtr->all << g->gestureType(); - switch(g->state()) { - case Qt::GestureStarted: - eventsPtr->started << g->gestureType(); - emit gestureStarted(e->type(), g); - break; - case Qt::GestureUpdated: - eventsPtr->updated << g->gestureType(); - emit gestureUpdated(e->type(), g); - break; - case Qt::GestureFinished: - eventsPtr->finished << g->gestureType(); - emit gestureFinished(e->type(), g); - break; - case Qt::GestureCanceled: - eventsPtr->canceled << g->gestureType(); - emit gestureCanceled(e->type(), g); - break; - default: - qWarning() << "Unknown GestureState enum value:" << static_cast<int>(g->state()); - } - } - } else if (event->type() == CustomEvent::EventType) { - ++customEventsReceived; - } else { - return QGraphicsObject::event(event); - } - return true; - } - -Q_SIGNALS: - void gestureStarted(QEvent::Type, QGesture *); - void gestureUpdated(QEvent::Type, QGesture *); - void gestureFinished(QEvent::Type, QGesture *); - void gestureCanceled(QEvent::Type, QGesture *); - -public: - // some arguments for the slots below: - QGraphicsScene *scene; - -public Q_SLOTS: - void deleteThis() { delete this; } - void addSelfToScene(QEvent::Type eventType, QGesture *) - { - if (eventType == QEvent::Gesture) { - disconnect(sender(), 0, this, SLOT(addSelfToScene(QEvent::Type,QGesture*))); - scene->addItem(this); - } - } -}; -int GestureItem::InstanceCount = 0; - -void tst_Gestures::graphicsItemGesture() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item = new GestureItem("item"); - scene.addItem(item); - item->setPos(100, 100); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item->grabGesture(CustomGesture::GestureType); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - CustomEvent event; - // gesture without hotspot should not be delivered to items in the view - QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture"); - QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture"); - QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture"); - QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture"); - sendCustomGesture(&event, item, &scene); - - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, 0); - QCOMPARE(item->gestureOverrideEventsReceived, 0); - - item->reset(); - - // make sure the event is properly delivered if only the hotspot is set. - event.hotSpot = mapToGlobal(QPointF(10, 10), item, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item, &scene); - - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item->gestureOverrideEventsReceived, 0); - QCOMPARE(item->events.all.size(), TotalGestureEventsCount); - for(int i = 0; i < item->events.all.size(); ++i) - QCOMPARE(item->events.all.at(i), CustomGesture::GestureType); - QCOMPARE(item->events.started.size(), 1); - QCOMPARE(item->events.updated.size(), TotalGestureEventsCount - 2); - QCOMPARE(item->events.finished.size(), 1); - QCOMPARE(item->events.canceled.size(), 0); - - item->reset(); - - // send gesture to the item which ignores it. - item->ignoredGestures << CustomGesture::GestureType; - - event.hotSpot = mapToGlobal(QPointF(10, 10), item, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item, &scene); - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item->gestureOverrideEventsReceived, 0); -} - -void tst_Gestures::graphicsView() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item = new GestureItem("item"); - scene.addItem(item); - item->setPos(100, 100); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item->grabGesture(CustomGesture::GestureType); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - CustomEvent event; - // make sure the event is properly delivered if only the hotspot is set. - event.hotSpot = mapToGlobal(QPointF(10, 10), item, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item, &scene); - - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item->gestureOverrideEventsReceived, 0); - - // change the viewport and try again - QWidget *newViewport = new QWidget; - view.setViewport(newViewport); - - item->reset(); - sendCustomGesture(&event, item, &scene); - - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item->gestureOverrideEventsReceived, 0); - - // change the scene and try again - QGraphicsScene newScene; - item = new GestureItem("newItem"); - newScene.addItem(item); - item->setPos(100, 100); - view.setScene(&newScene); - - item->reset(); - // first without a gesture - sendCustomGesture(&event, item, &newScene); - - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, 0); - QCOMPARE(item->gestureOverrideEventsReceived, 0); - - // then grab the gesture and try again - item->reset(); - item->grabGesture(CustomGesture::GestureType); - sendCustomGesture(&event, item, &newScene); - - QCOMPARE(item->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item->gestureOverrideEventsReceived, 0); -} - -void tst_Gestures::graphicsItemTreeGesture() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - item1->setPos(100, 100); - item1->size = QRectF(0, 0, 350, 200); - scene.addItem(item1); - - GestureItem *item1_child1 = new GestureItem("item1_child1"); - item1_child1->setPos(50, 50); - item1_child1->size = QRectF(0, 0, 100, 100); - item1_child1->setParentItem(item1); - - GestureItem *item1_child2 = new GestureItem("item1_child2"); - item1_child2->size = QRectF(0, 0, 100, 100); - item1_child2->setPos(200, 50); - item1_child2->setParentItem(item1); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item1->grabGesture(CustomGesture::GestureType); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(10, 10), item1_child1, &view); - event.hasHotSpot = true; - - item1->ignoredGestures << CustomGesture::GestureType; - sendCustomGesture(&event, item1_child1, &scene); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child2->gestureEventsReceived, 0); - QCOMPARE(item1_child2->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); - - item1->reset(); item1_child1->reset(); item1_child2->reset(); - - item1_child1->grabGesture(CustomGesture::GestureType); - - item1->ignoredGestures << CustomGesture::GestureType; - item1_child1->ignoredGestures << CustomGesture::GestureType; - sendCustomGesture(&event, item1_child1, &scene); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1_child1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1_child2->gestureEventsReceived, 0); - QCOMPARE(item1_child2->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, 1); -} - -void tst_Gestures::explicitGraphicsObjectTarget() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - scene.addItem(item1); - item1->setPos(100, 100); - item1->setZValue(1); - - GestureItem *item2 = new GestureItem("item2"); - scene.addItem(item2); - item2->setPos(100, 100); - item2->setZValue(5); - - GestureItem *item2_child1 = new GestureItem("item2_child1"); - scene.addItem(item2_child1); - item2_child1->setParentItem(item2); - item2_child1->setPos(10, 10); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item1->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - item2->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - item2_child1->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - // sending events to item1, but the hotSpot is set to item2 - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(15, 15), item2, &view); - event.hasHotSpot = true; - - sendCustomGesture(&event, item1, &scene); - - QCOMPARE(item1->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item2_child1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item2_child1->gestureOverrideEventsReceived, 1); - QCOMPARE(item2_child1->events.all.size(), TotalGestureEventsCount); - for(int i = 0; i < item2_child1->events.all.size(); ++i) - QCOMPARE(item2_child1->events.all.at(i), CustomGesture::GestureType); - QCOMPARE(item2_child1->events.started.size(), 1); - QCOMPARE(item2_child1->events.updated.size(), TotalGestureEventsCount - 2); - QCOMPARE(item2_child1->events.finished.size(), 1); - QCOMPARE(item2_child1->events.canceled.size(), 0); - QCOMPARE(item2->gestureEventsReceived, 0); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); -} - -void tst_Gestures::gestureOverChildGraphicsItem() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item0 = new GestureItem("item0"); - scene.addItem(item0); - item0->setPos(0, 0); - item0->grabGesture(CustomGesture::GestureType); - item0->setZValue(1); - - GestureItem *item1 = new GestureItem("item1"); - scene.addItem(item1); - item1->setPos(100, 100); - item1->setZValue(5); - - GestureItem *item2 = new GestureItem("item2"); - scene.addItem(item2); - item2->setPos(100, 100); - item2->setZValue(10); - - GestureItem *item2_child1 = new GestureItem("item2_child1"); - scene.addItem(item2_child1); - item2_child1->setParentItem(item2); - item2_child1->setPos(0, 0); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item1->grabGesture(CustomGesture::GestureType); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(10, 10), item2_child1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item0->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item2_child1->gestureEventsReceived, 0); - QCOMPARE(item2_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item2->gestureEventsReceived, 0); - QCOMPARE(item2->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - - item0->reset(); item1->reset(); item2->reset(); item2_child1->reset(); - item2->grabGesture(CustomGesture::GestureType); - item2->ignoredGestures << CustomGesture::GestureType; - - event.hotSpot = mapToGlobal(QPointF(10, 10), item2_child1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item2_child1->gestureEventsReceived, 0); - QCOMPARE(item2_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item2->gestureEventsReceived, 1); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - - item0->reset(); item1->reset(); item2->reset(); item2_child1->reset(); - item2->grabGesture(CustomGesture::GestureType); - item2->ignoredGestures << CustomGesture::GestureType; - item1->ignoredGestures << CustomGesture::GestureType; - - event.hotSpot = mapToGlobal(QPointF(10, 10), item2_child1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item2_child1->gestureEventsReceived, 0); - QCOMPARE(item2_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, 1); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - - item0->reset(); item1->reset(); item2->reset(); item2_child1->reset(); - item2->grabGesture(CustomGesture::GestureType); - item2->ignoredGestures << CustomGesture::GestureType; - item1->ignoredGestures << CustomGesture::GestureType; - item1->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures); - - event.hotSpot = mapToGlobal(QPointF(10, 10), item2_child1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item2_child1->gestureEventsReceived, 0); - QCOMPARE(item2_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); -} - -void tst_Gestures::twoGesturesOnDifferentLevel() -{ - GestureWidget parent("parent"); - QVBoxLayout *l = new QVBoxLayout(&parent); - GestureWidget *child = new GestureWidget("child"); - l->addWidget(child); - - Qt::GestureType SecondGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - - parent.grabGesture(CustomGesture::GestureType); - child->grabGesture(SecondGesture); - - CustomEvent event; - // sending events that form a gesture to one widget, but they will be - // filtered by two different gesture recognizers and will generate two - // QGesture objects. Check that those gesture objects are delivered to - // different widgets properly. - sendCustomGesture(&event, child); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - QCOMPARE(child->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(child->gestureOverrideEventsReceived, 0); - QCOMPARE(child->events.all.size(), TotalGestureEventsCount); - for(int i = 0; i < child->events.all.size(); ++i) - QCOMPARE(child->events.all.at(i), SecondGesture); - - QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(parent.gestureOverrideEventsReceived, 0); - QCOMPARE(parent.events.all.size(), TotalGestureEventsCount); - for(int i = 0; i < child->events.all.size(); ++i) - QCOMPARE(parent.events.all.at(i), CustomGesture::GestureType); - - QGestureRecognizer::unregisterRecognizer(SecondGesture); -} - -void tst_Gestures::multipleGesturesInTree() -{ - GestureWidget a("A"); - GestureWidget *A = &a; - GestureWidget *B = new GestureWidget("B", A); - GestureWidget *C = new GestureWidget("C", B); - GestureWidget *D = new GestureWidget("D", C); - - Qt::GestureType FirstGesture = CustomGesture::GestureType; - Qt::GestureType SecondGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - Qt::GestureType ThirdGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - - Qt::GestureFlags flags = Qt::ReceivePartialGestures; - A->grabGesture(FirstGesture, flags); // A [1 3] - A->grabGesture(ThirdGesture, flags); // | - B->grabGesture(SecondGesture, flags); // B [ 2 3] - B->grabGesture(ThirdGesture, flags); // | - C->grabGesture(FirstGesture, flags); // C [1 2 3] - C->grabGesture(SecondGesture, flags); // | - C->grabGesture(ThirdGesture, flags); // D [1 3] - D->grabGesture(FirstGesture, flags); - D->grabGesture(ThirdGesture, flags); - - // make sure all widgets ignore events, so they get propagated. - A->ignoredGestures << FirstGesture << ThirdGesture; - B->ignoredGestures << SecondGesture << ThirdGesture; - C->ignoredGestures << FirstGesture << SecondGesture << ThirdGesture; - D->ignoredGestures << FirstGesture << ThirdGesture; - - CustomEvent event; - sendCustomGesture(&event, D); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - // gesture override events - QCOMPARE(D->overrideEvents.all.count(FirstGesture), 1); - QCOMPARE(D->overrideEvents.all.count(SecondGesture), 0); - QCOMPARE(D->overrideEvents.all.count(ThirdGesture), 1); - - QCOMPARE(C->overrideEvents.all.count(FirstGesture), 1); - QCOMPARE(C->overrideEvents.all.count(SecondGesture), 1); - QCOMPARE(C->overrideEvents.all.count(ThirdGesture), 1); - - QCOMPARE(B->overrideEvents.all.count(FirstGesture), 0); - QCOMPARE(B->overrideEvents.all.count(SecondGesture), 1); - QCOMPARE(B->overrideEvents.all.count(ThirdGesture), 1); - - QCOMPARE(A->overrideEvents.all.count(FirstGesture), 1); - QCOMPARE(A->overrideEvents.all.count(SecondGesture), 0); - QCOMPARE(A->overrideEvents.all.count(ThirdGesture), 1); - - // normal gesture events - QCOMPARE(D->events.all.count(FirstGesture), TotalGestureEventsCount); - QCOMPARE(D->events.all.count(SecondGesture), 0); - QCOMPARE(D->events.all.count(ThirdGesture), TotalGestureEventsCount); - - QCOMPARE(C->events.all.count(FirstGesture), TotalGestureEventsCount); - QCOMPARE(C->events.all.count(SecondGesture), TotalGestureEventsCount); - QCOMPARE(C->events.all.count(ThirdGesture), TotalGestureEventsCount); - - QCOMPARE(B->events.all.count(FirstGesture), 0); - QCOMPARE(B->events.all.count(SecondGesture), TotalGestureEventsCount); - QCOMPARE(B->events.all.count(ThirdGesture), TotalGestureEventsCount); - - QCOMPARE(A->events.all.count(FirstGesture), TotalGestureEventsCount); - QCOMPARE(A->events.all.count(SecondGesture), 0); - QCOMPARE(A->events.all.count(ThirdGesture), TotalGestureEventsCount); - - QGestureRecognizer::unregisterRecognizer(SecondGesture); - QGestureRecognizer::unregisterRecognizer(ThirdGesture); -} - -void tst_Gestures::multipleGesturesInComplexTree() -{ - GestureWidget a("A"); - GestureWidget *A = &a; - GestureWidget *B = new GestureWidget("B", A); - GestureWidget *C = new GestureWidget("C", B); - GestureWidget *D = new GestureWidget("D", C); - - Qt::GestureType FirstGesture = CustomGesture::GestureType; - Qt::GestureType SecondGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - Qt::GestureType ThirdGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - Qt::GestureType FourthGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - Qt::GestureType FifthGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - Qt::GestureType SixthGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - Qt::GestureType SeventhGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - - Qt::GestureFlags flags = Qt::ReceivePartialGestures; - A->grabGesture(FirstGesture, flags); // A [1,3,4] - A->grabGesture(ThirdGesture, flags); // | - A->grabGesture(FourthGesture, flags); // B [2,3,5] - B->grabGesture(SecondGesture, flags); // | - B->grabGesture(ThirdGesture, flags); // C [1,2,3,6] - B->grabGesture(FifthGesture, flags); // | - C->grabGesture(FirstGesture, flags); // D [1,3,7] - C->grabGesture(SecondGesture, flags); - C->grabGesture(ThirdGesture, flags); - C->grabGesture(SixthGesture, flags); - D->grabGesture(FirstGesture, flags); - D->grabGesture(ThirdGesture, flags); - D->grabGesture(SeventhGesture, flags); - - // make sure all widgets ignore events, so they get propagated. - QSet<Qt::GestureType> allGestureTypes; - allGestureTypes << FirstGesture << SecondGesture << ThirdGesture - << FourthGesture << FifthGesture << SixthGesture << SeventhGesture; - A->ignoredGestures = B->ignoredGestures = allGestureTypes; - C->ignoredGestures = D->ignoredGestures = allGestureTypes; - - CustomEvent event; - sendCustomGesture(&event, D); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - // gesture override events - QCOMPARE(D->overrideEvents.all.count(FirstGesture), 1); - QCOMPARE(D->overrideEvents.all.count(SecondGesture), 0); - QCOMPARE(D->overrideEvents.all.count(ThirdGesture), 1); - - QCOMPARE(C->overrideEvents.all.count(FirstGesture), 1); - QCOMPARE(C->overrideEvents.all.count(SecondGesture), 1); - QCOMPARE(C->overrideEvents.all.count(ThirdGesture), 1); - - QCOMPARE(B->overrideEvents.all.count(FirstGesture), 0); - QCOMPARE(B->overrideEvents.all.count(SecondGesture), 1); - QCOMPARE(B->overrideEvents.all.count(ThirdGesture), 1); - - QCOMPARE(A->overrideEvents.all.count(FirstGesture), 1); - QCOMPARE(A->overrideEvents.all.count(SecondGesture), 0); - QCOMPARE(A->overrideEvents.all.count(ThirdGesture), 1); - - // normal gesture events - QCOMPARE(D->events.all.count(FirstGesture), TotalGestureEventsCount); - QCOMPARE(D->events.all.count(SecondGesture), 0); - QCOMPARE(D->events.all.count(ThirdGesture), TotalGestureEventsCount); - QCOMPARE(D->events.all.count(FourthGesture), 0); - QCOMPARE(D->events.all.count(FifthGesture), 0); - QCOMPARE(D->events.all.count(SixthGesture), 0); - QCOMPARE(D->events.all.count(SeventhGesture), TotalGestureEventsCount); - - QCOMPARE(C->events.all.count(FirstGesture), TotalGestureEventsCount); - QCOMPARE(C->events.all.count(SecondGesture), TotalGestureEventsCount); - QCOMPARE(C->events.all.count(ThirdGesture), TotalGestureEventsCount); - QCOMPARE(C->events.all.count(FourthGesture), 0); - QCOMPARE(C->events.all.count(FifthGesture), 0); - QCOMPARE(C->events.all.count(SixthGesture), TotalGestureEventsCount); - QCOMPARE(C->events.all.count(SeventhGesture), 0); - - QCOMPARE(B->events.all.count(FirstGesture), 0); - QCOMPARE(B->events.all.count(SecondGesture), TotalGestureEventsCount); - QCOMPARE(B->events.all.count(ThirdGesture), TotalGestureEventsCount); - QCOMPARE(B->events.all.count(FourthGesture), 0); - QCOMPARE(B->events.all.count(FifthGesture), TotalGestureEventsCount); - QCOMPARE(B->events.all.count(SixthGesture), 0); - QCOMPARE(B->events.all.count(SeventhGesture), 0); - - QCOMPARE(A->events.all.count(FirstGesture), TotalGestureEventsCount); - QCOMPARE(A->events.all.count(SecondGesture), 0); - QCOMPARE(A->events.all.count(ThirdGesture), TotalGestureEventsCount); - QCOMPARE(A->events.all.count(FourthGesture), TotalGestureEventsCount); - QCOMPARE(A->events.all.count(FifthGesture), 0); - QCOMPARE(A->events.all.count(SixthGesture), 0); - QCOMPARE(A->events.all.count(SeventhGesture), 0); - - QGestureRecognizer::unregisterRecognizer(SecondGesture); - QGestureRecognizer::unregisterRecognizer(ThirdGesture); - QGestureRecognizer::unregisterRecognizer(FourthGesture); - QGestureRecognizer::unregisterRecognizer(FifthGesture); - QGestureRecognizer::unregisterRecognizer(SixthGesture); - QGestureRecognizer::unregisterRecognizer(SeventhGesture); -} - -void tst_Gestures::testMapToScene() -{ - QGesture gesture; - QList<QGesture*> list; - list << &gesture; - QGestureEvent event(list); - QCOMPARE(event.mapToGraphicsScene(gesture.hotSpot()), QPointF()); // not set, can't do much - - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item0 = new GestureItem; - scene.addItem(item0); - item0->setPos(14, 16); - - view.show(); // need to show to give it a global coordinate - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - QPoint origin = view.mapToGlobal(QPoint()); - event.setWidget(view.viewport()); - - QCOMPARE(event.mapToGraphicsScene(origin + QPoint(100, 200)), view.mapToScene(QPoint(100, 200))); -} - -void tst_Gestures::ungrabGesture() // a method on QWidget -{ - class MockGestureWidget : public GestureWidget { - public: - MockGestureWidget(const char *name = 0, QWidget *parent = 0) - : GestureWidget(name, parent) { } - - - QSet<QGesture*> gestures; - protected: - bool event(QEvent *event) - { - if (event->type() == QEvent::Gesture) { - QGestureEvent *gestureEvent = static_cast<QGestureEvent*>(event); - if (gestureEvent) - foreach (QGesture *g, gestureEvent->gestures()) - gestures.insert(g); - } - return GestureWidget::event(event); - } - }; - - MockGestureWidget parent("A"); - MockGestureWidget *a = &parent; - MockGestureWidget *b = new MockGestureWidget("B", a); - - a->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); - b->grabGesture(CustomGesture::GestureType); - b->ignoredGestures << CustomGesture::GestureType; - - CustomEvent event; - // sending an event will cause the QGesture objects to be instantiated for the widgets - sendCustomGesture(&event, b); - - QCOMPARE(a->gestures.count(), 1); - QPointer<QGesture> customGestureA; - customGestureA = *(a->gestures.begin()); - QVERIFY(!customGestureA.isNull()); - QCOMPARE(customGestureA->gestureType(), CustomGesture::GestureType); - - QCOMPARE(b->gestures.count(), 1); - QPointer<QGesture> customGestureB; - customGestureB = *(b->gestures.begin()); - QVERIFY(!customGestureB.isNull()); - QVERIFY(customGestureA.data() == customGestureB.data()); - QCOMPARE(customGestureB->gestureType(), CustomGesture::GestureType); - - a->gestures.clear(); - // sending an event will cause the QGesture objects to be instantiated for the widget - sendCustomGesture(&event, a); - - QCOMPARE(a->gestures.count(), 1); - customGestureA = *(a->gestures.begin()); - QVERIFY(!customGestureA.isNull()); - QCOMPARE(customGestureA->gestureType(), CustomGesture::GestureType); - QVERIFY(customGestureA.data() != customGestureB.data()); - - a->ungrabGesture(CustomGesture::GestureType); - //We changed the deletion of Gestures to lazy during QT-4022, so we can't ensure the QGesture is deleted until now - QVERIFY(!customGestureB.isNull()); - - a->gestures.clear(); - a->reset(); - // send again to 'b' and make sure a never gets it. - sendCustomGesture(&event, b); - //After all Gestures are processed in the QGestureManager, we can ensure the QGesture is now deleted - QVERIFY(customGestureA.isNull()); - QCOMPARE(a->gestureEventsReceived, 0); - QCOMPARE(a->gestureOverrideEventsReceived, 0); -} - -void tst_Gestures::unregisterRecognizer() // a method on QApplication -{ - /* - The hardest usecase to get right is when we remove a recognizer while several - of the gestures it created are in active state and we immediately add a new recognizer - for the same type (thus replacing the old one). - The expected result is that all old gestures continue till they are finished/cancelled - and the new recognizer starts creating gestures immediately at registration. - - This implies that deleting of the recognizer happens only when there are no more gestures - that it created. (since gestures might have a pointer to the recognizer) - */ - -} - -void tst_Gestures::autoCancelGestures() -{ - class MockWidget : public GestureWidget { - public: - MockWidget(const char *name) : GestureWidget(name), badGestureEvents(0) { } - - bool event(QEvent *event) - { - if (event->type() == QEvent::Gesture) { - QGestureEvent *ge = static_cast<QGestureEvent*>(event); - if (ge->gestures().count() != 1) - ++badGestureEvents; // event should contain exactly one gesture - ge->gestures().first()->setGestureCancelPolicy(QGesture::CancelAllInContext); - } - return GestureWidget::event(event); - } - - int badGestureEvents; - }; - - const Qt::GestureType secondGesture = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer); - - MockWidget parent("parent"); // this one sets the cancel policy to CancelAllInContext - parent.resize(300, 100); - parent.setWindowFlags(Qt::X11BypassWindowManagerHint); - GestureWidget *child = new GestureWidget("child", &parent); - child->setGeometry(10, 10, 100, 80); - - parent.grabGesture(CustomGesture::GestureType); - child->grabGesture(secondGesture); - parent.show(); - QTest::qWaitForWindowShown(&parent); - - /* - An event is send to both the child and the parent, when the child gets it a gesture is triggered - and send to the child. - When the parent gets the event a new gesture is triggered and delivered to the parent. When the - parent gets it he accepts it and that causes the cancel policy to activate. - The cause of that is the gesture for the child is cancelled and send to the child as such. - */ - CustomEvent event; - event.serial = CustomGesture::SerialStartedThreshold; - QApplication::sendEvent(child, &event); - QCOMPARE(child->events.all.count(), 2); - QCOMPARE(child->events.started.count(), 1); - QCOMPARE(child->events.canceled.count(), 1); - QCOMPARE(parent.events.all.count(), 1); - - // clean up, make the parent gesture finish - event.serial = CustomGesture::SerialFinishedThreshold; - QApplication::sendEvent(child, &event); - QCOMPARE(parent.events.all.count(), 2); - QCOMPARE(parent.badGestureEvents, 0); -} - -void tst_Gestures::autoCancelGestures2() -{ - class MockItem : public GestureItem { - public: - MockItem(const char *name) : GestureItem(name), badGestureEvents(0) { } - - bool event(QEvent *event) { - if (event->type() == QEvent::Gesture) { - QGestureEvent *ge = static_cast<QGestureEvent*>(event); - if (ge->gestures().count() != 1) - ++badGestureEvents; // event should contain exactly one gesture - ge->gestures().first()->setGestureCancelPolicy(QGesture::CancelAllInContext); - } - return GestureItem::event(event); - } - - int badGestureEvents; - }; - - const Qt::GestureType secondGesture = QGestureRecognizer ::registerRecognizer(new CustomGestureRecognizer); - - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - MockItem *parent = new MockItem("parent"); - GestureItem *child = new GestureItem("child"); - child->setParentItem(parent); - parent->setPos(0, 0); - child->setPos(10, 10); - scene.addItem(parent); - parent->grabGesture(CustomGesture::GestureType); - child->grabGesture(secondGesture); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - CustomEvent event; - event.serial = CustomGesture::SerialStartedThreshold; - event.hasHotSpot = true; - event.hotSpot = mapToGlobal(QPointF(5, 5), child, &view); - scene.sendEvent(child, &event); - QCOMPARE(parent->events.all.count(), 1); - QCOMPARE(child->events.started.count(), 1); - QCOMPARE(child->events.canceled.count(), 1); - QCOMPARE(child->events.all.count(), 2); - - // clean up, make the parent gesture finish - event.serial = CustomGesture::SerialFinishedThreshold; - scene.sendEvent(child, &event); - QCOMPARE(parent->events.all.count(), 2); - QCOMPARE(parent->badGestureEvents, 0); -} - -void tst_Gestures::graphicsViewParentPropagation() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item0 = new GestureItem("item0"); - scene.addItem(item0); - item0->setPos(0, 0); - item0->grabGesture(CustomGesture::GestureType); - item0->setZValue(1); - - GestureItem *item1 = new GestureItem("item1"); - scene.addItem(item1); - item1->setPos(0, 0); - item1->setZValue(5); - - GestureItem *item1_c1 = new GestureItem("item1_child1"); - item1_c1->setParentItem(item1); - item1_c1->setPos(0, 0); - - GestureItem *item1_c1_c1 = new GestureItem("item1_child1_child1"); - item1_c1_c1->setParentItem(item1_c1); - item1_c1_c1->setPos(0, 0); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item0->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures | Qt::IgnoredGesturesPropagateToParent); - item1->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures | Qt::IgnoredGesturesPropagateToParent); - item1_c1->grabGesture(CustomGesture::GestureType, Qt::IgnoredGesturesPropagateToParent); - item1_c1_c1->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures | Qt::IgnoredGesturesPropagateToParent); - - item0->ignoredUpdatedGestures << CustomGesture::GestureType; - item0->ignoredFinishedGestures << CustomGesture::GestureType; - item1->ignoredUpdatedGestures << CustomGesture::GestureType; - item1->ignoredFinishedGestures << CustomGesture::GestureType; - item1_c1->ignoredUpdatedGestures << CustomGesture::GestureType; - item1_c1->ignoredFinishedGestures << CustomGesture::GestureType; - item1_c1_c1->ignoredUpdatedGestures << CustomGesture::GestureType; - item1_c1_c1->ignoredFinishedGestures << CustomGesture::GestureType; - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(10, 10), item1_c1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item1_c1_c1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1_c1_c1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1_c1->gestureEventsReceived, TotalGestureEventsCount-1); - QCOMPARE(item1_c1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount-1); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item0->gestureEventsReceived, 0); - QCOMPARE(item0->gestureOverrideEventsReceived, 1); -} - -void tst_Gestures::panelPropagation() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item0 = new GestureItem("item0"); - scene.addItem(item0); - item0->setPos(0, 0); - item0->size = QRectF(0, 0, 200, 200); - item0->grabGesture(CustomGesture::GestureType); - item0->setZValue(1); - - GestureItem *item1 = new GestureItem("item1"); - item1->grabGesture(CustomGesture::GestureType); - scene.addItem(item1); - item1->setPos(10, 10); - item1->size = QRectF(0, 0, 180, 180); - item1->setZValue(2); - - GestureItem *item1_child1 = new GestureItem("item1_child1[panel]"); - item1_child1->setFlags(QGraphicsItem::ItemIsPanel); - item1_child1->setParentItem(item1); - item1_child1->grabGesture(CustomGesture::GestureType); - item1_child1->setPos(10, 10); - item1_child1->size = QRectF(0, 0, 160, 160); - item1_child1->setZValue(5); - - GestureItem *item1_child1_child1 = new GestureItem("item1_child1_child1"); - item1_child1_child1->setParentItem(item1_child1); - item1_child1_child1->grabGesture(CustomGesture::GestureType); - item1_child1_child1->setPos(10, 10); - item1_child1_child1->size = QRectF(0, 0, 140, 140); - item1_child1_child1->setZValue(10); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(5, 5), item1_child1_child1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item0->customEventsReceived, TotalCustomEventsCount); - QCOMPARE(item1_child1_child1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(item0->gestureEventsReceived, 0); - QCOMPARE(item0->gestureOverrideEventsReceived, 0); - - item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); - - event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); - - QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item0->gestureEventsReceived, 0); - QCOMPARE(item0->gestureOverrideEventsReceived, 1); - - item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); - // try with a modal panel - item1_child1->setPanelModality(QGraphicsItem::PanelModal); - - event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); - - QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1_child1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(item0->gestureEventsReceived, 0); - QCOMPARE(item0->gestureOverrideEventsReceived, 0); - - item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); - // try with a modal panel, however set the hotspot to be outside of the - // panel and its parent - item1_child1->setPanelModality(QGraphicsItem::PanelModal); - - event.hotSpot = mapToGlobal(QPointF(5, 5), item0, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); - - QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(item0->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item0->gestureOverrideEventsReceived, 0); - - item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); - // try with a scene modal panel - item1_child1->setPanelModality(QGraphicsItem::SceneModal); - - event.hotSpot = mapToGlobal(QPointF(5, 5), item0, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item0, &scene); - - QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); - QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1_child1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(item0->gestureEventsReceived, 0); - QCOMPARE(item0->gestureOverrideEventsReceived, 0); -} - -void tst_Gestures::panelStacksBehindParent() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - item1->grabGesture(CustomGesture::GestureType); - scene.addItem(item1); - item1->setPos(10, 10); - item1->size = QRectF(0, 0, 180, 180); - item1->setZValue(2); - - GestureItem *panel = new GestureItem("panel"); - panel->setFlags(QGraphicsItem::ItemIsPanel | QGraphicsItem::ItemStacksBehindParent); - panel->setPanelModality(QGraphicsItem::PanelModal); - panel->setParentItem(item1); - panel->grabGesture(CustomGesture::GestureType); - panel->setPos(-10, -10); - panel->size = QRectF(0, 0, 200, 200); - panel->setZValue(5); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); - - QCOMPARE(item1->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(panel->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(panel->gestureOverrideEventsReceived, 0); -} - -void tst_Gestures::deleteGestureTargetWidget() -{ -} - -void tst_Gestures::deleteGestureTargetItem_data() -{ - QTest::addColumn<bool>("propagateUpdateGesture"); - QTest::addColumn<QString>("emitter"); - QTest::addColumn<QString>("receiver"); - QTest::addColumn<QByteArray>("signalName"); - QTest::addColumn<QByteArray>("slotName"); - - QByteArray gestureUpdated = SIGNAL(gestureUpdated(QEvent::Type,QGesture*)); - QByteArray gestureFinished = SIGNAL(gestureFinished(QEvent::Type,QGesture*)); - QByteArray deleteThis = SLOT(deleteThis()); - QByteArray deleteLater = SLOT(deleteLater()); - - QTest::newRow("delete1") - << false << "item1" << "item1" << gestureUpdated << deleteThis; - QTest::newRow("delete2") - << false << "item2" << "item2" << gestureUpdated << deleteThis; - QTest::newRow("delete3") - << false << "item1" << "item2" << gestureUpdated << deleteThis; - - QTest::newRow("deleteLater1") - << false << "item1" << "item1" << gestureUpdated << deleteLater; - QTest::newRow("deleteLater2") - << false << "item2" << "item2" << gestureUpdated << deleteLater; - QTest::newRow("deleteLater3") - << false << "item1" << "item2" << gestureUpdated << deleteLater; - QTest::newRow("deleteLater4") - << false << "item2" << "item1" << gestureUpdated << deleteLater; - - QTest::newRow("delete-self-and-propagate") - << true << "item2" << "item2" << gestureUpdated << deleteThis; - QTest::newRow("deleteLater-self-and-propagate") - << true << "item2" << "item2" << gestureUpdated << deleteLater; - QTest::newRow("propagate-to-deletedLater") - << true << "item2" << "item1" << gestureUpdated << deleteLater; -} - -void tst_Gestures::deleteGestureTargetItem() -{ - QFETCH(bool, propagateUpdateGesture); - QFETCH(QString, emitter); - QFETCH(QString, receiver); - QFETCH(QByteArray, signalName); - QFETCH(QByteArray, slotName); - - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - item1->grabGesture(CustomGesture::GestureType); - item1->setZValue(2); - scene.addItem(item1); - - GestureItem *item2 = new GestureItem("item2"); - item2->grabGesture(CustomGesture::GestureType); - item2->setZValue(5); - scene.addItem(item2); - - QMap<QString, GestureItem *> items; - items.insert(item1->objectName(), item1); - items.insert(item2->objectName(), item2); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - if (propagateUpdateGesture) - item2->ignoredUpdatedGestures << CustomGesture::GestureType; - connect(items.value(emitter, 0), signalName, items.value(receiver, 0), slotName); - - // some debug output to see the current test data tag, so if we crash - // we know which one caused the crash. - qDebug() << "<-- testing"; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(5, 5), item2, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); -} - -class GraphicsView : public QGraphicsView -{ -public: - GraphicsView(QGraphicsScene *scene, QWidget *parent = 0) - : QGraphicsView(scene, parent) - { - } - - using QGraphicsView::setViewportMargins; -}; - -// just making sure that even if the graphicsview has margins hotspot still -// works properly. It should use viewport for converting global coordinates to -// scene coordinates. -void tst_Gestures::viewportCoordinates() -{ - QGraphicsScene scene; - GraphicsView view(&scene); - view.setViewportMargins(10,20,15,25); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - item1->grabGesture(CustomGesture::GestureType); - item1->size = QRectF(0, 0, 3, 3); - item1->setZValue(2); - scene.addItem(item1); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - CustomEvent event; - event.hotSpot = mapToGlobal(item1->boundingRect().center(), item1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); - QVERIFY(item1->gestureEventsReceived != 0); -} - -void tst_Gestures::partialGesturePropagation() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - item1->grabGesture(CustomGesture::GestureType); - item1->setZValue(8); - scene.addItem(item1); - - GestureItem *item2 = new GestureItem("item2[partial]"); - item2->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures); - item2->setZValue(6); - scene.addItem(item2); - - GestureItem *item3 = new GestureItem("item3"); - item3->grabGesture(CustomGesture::GestureType); - item3->setZValue(4); - scene.addItem(item3); - - GestureItem *item4 = new GestureItem("item4[partial]"); - item4->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures); - item4->setZValue(2); - scene.addItem(item4); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - item1->ignoredUpdatedGestures << CustomGesture::GestureType; - - CustomEvent event; - event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item1, &scene); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item3->gestureOverrideEventsReceived, 1); - QCOMPARE(item4->gestureOverrideEventsReceived, 1); - - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount-2); // except for started and finished - QCOMPARE(item3->gestureEventsReceived, 0); - QCOMPARE(item4->gestureEventsReceived, 0); -} - -class WinNativePan : public QPanGesture { -public: - WinNativePan() {} -}; - -class Pan : public QPanGesture { -public: - Pan() {} -}; - -class CustomPan : public QPanGesture { -public: - CustomPan() {} -}; - -// Recognizer for active gesture triggers on mouse press -class PanRecognizer : public QGestureRecognizer { -public: - enum PanType { Platform, Default, Custom }; - - PanRecognizer(int id) : m_id(id) {} - QGesture *create(QObject *) { - switch(m_id) { - case Platform: return new WinNativePan(); - case Default: return new Pan(); - default: return new CustomPan(); - } - } - - Result recognize(QGesture *, QObject *, QEvent *) { return QGestureRecognizer::Ignore; } - - const int m_id; -}; - -void tst_Gestures::testQGestureRecognizerCleanup() -{ - // Clean first the current recognizers in QGManager - QGestureRecognizer::unregisterRecognizer(Qt::PanGesture); - - // v-- Qt singleton QGManager initialization - - // Mimic QGestureManager: register both default and "platform" recognizers - // (this is done in windows when QT_NO_NATIVE_GESTURES is not defined) - PanRecognizer *def = new PanRecognizer(PanRecognizer::Default); - QGestureRecognizer::registerRecognizer(def); - PanRecognizer *plt = new PanRecognizer(PanRecognizer::Platform); - QGestureRecognizer::registerRecognizer(plt); - qDebug () << "register: default =" << def << "; platform =" << plt; - - // ^-- Qt singleton QGManager initialization - - // Here, application code would start - - // Create QGV (has a QAScrollArea, which uses Qt::PanGesture) - QMainWindow *w = new QMainWindow; - QGraphicsView *v = new QGraphicsView(); - w->setCentralWidget(v); - - // Unregister Qt recognizers - QGestureRecognizer::unregisterRecognizer(Qt::PanGesture); - - // Register a custom Pan recognizer - //QGestureRecognizer::registerRecognizer(new PanRecognizer(PanRecognizer::Custom)); - - w->show(); - QTest::qWaitForWindowShown(w); - delete w; -} - -class ReuseCanceledGesturesRecognizer : public QGestureRecognizer -{ -public: - enum Type { - RmbAndCancelAllType, - LmbType - }; - - ReuseCanceledGesturesRecognizer(Type type) : m_type(type) {} - - QGesture *create(QObject *) { - QGesture *g = new QGesture; - return g; - } - - Result recognize(QGesture *gesture, QObject *, QEvent *event) { - QMouseEvent *me = static_cast<QMouseEvent *>(event); - Qt::MouseButton mouseButton(m_type == LmbType ? Qt::LeftButton : Qt::RightButton); - - switch(event->type()) { - case QEvent::MouseButtonPress: - if (me->button() == mouseButton && gesture->state() == Qt::NoGesture) { - gesture->setHotSpot(QPointF(me->globalPos())); - if (m_type == RmbAndCancelAllType) - gesture->setGestureCancelPolicy(QGesture::CancelAllInContext); - return QGestureRecognizer::TriggerGesture; - } - break; - case QEvent::MouseButtonRelease: - if (me->button() == mouseButton && gesture->state() > Qt::NoGesture) - return QGestureRecognizer::FinishGesture; - default: - break; - } - return QGestureRecognizer::Ignore; - } -private: - Type m_type; -}; - -class ReuseCanceledGesturesWidget : public QGraphicsWidget -{ - public: - ReuseCanceledGesturesWidget(Qt::GestureType gestureType = Qt::TapGesture, QGraphicsItem *parent = 0) - : QGraphicsWidget(parent), - m_gestureType(gestureType), - m_started(0), m_updated(0), m_canceled(0), m_finished(0) - { - } - - bool event(QEvent *event) { - if (event->type() == QEvent::Gesture) { - QGesture *gesture = static_cast<QGestureEvent*>(event)->gesture(m_gestureType); - if (gesture) { - switch(gesture->state()) { - case Qt::GestureStarted: m_started++; break; - case Qt::GestureUpdated: m_updated++; break; - case Qt::GestureFinished: m_finished++; break; - case Qt::GestureCanceled: m_canceled++; break; - default: break; - } - } - return true; - } - if (event->type() == QEvent::GraphicsSceneMousePress) { - return true; - } - return QGraphicsWidget::event(event); - } - - int started() { return m_started; } - int updated() { return m_updated; } - int finished() { return m_finished; } - int canceled() { return m_canceled; } - - private: - Qt::GestureType m_gestureType; - int m_started; - int m_updated; - int m_canceled; - int m_finished; -}; - -void tst_Gestures::testReuseCanceledGestures() -{ - Qt::GestureType cancellingGestureTypeId = QGestureRecognizer::registerRecognizer( - new ReuseCanceledGesturesRecognizer(ReuseCanceledGesturesRecognizer::RmbAndCancelAllType)); - Qt::GestureType tapGestureTypeId = QGestureRecognizer::registerRecognizer( - new ReuseCanceledGesturesRecognizer(ReuseCanceledGesturesRecognizer::LmbType)); - - QMainWindow mw; - mw.setWindowFlags(Qt::X11BypassWindowManagerHint); - QGraphicsView *gv = new QGraphicsView(&mw); - QGraphicsScene *scene = new QGraphicsScene; - - gv->setScene(scene); - scene->setSceneRect(0,0,100,100); - - // Create container and add to the scene - ReuseCanceledGesturesWidget *container = new ReuseCanceledGesturesWidget; - container->grabGesture(cancellingGestureTypeId); // << container grabs canceling gesture - - // Create widget and add to the scene - ReuseCanceledGesturesWidget *target = new ReuseCanceledGesturesWidget(tapGestureTypeId, container); - target->grabGesture(tapGestureTypeId); - - container->setGeometry(scene->sceneRect()); - - scene->addItem(container); - - mw.setCentralWidget(gv); - - // Viewport needs to grab all gestures that widgets in scene grab - gv->viewport()->grabGesture(cancellingGestureTypeId); - gv->viewport()->grabGesture(tapGestureTypeId); - - mw.show(); - QTest::qWaitForWindowShown(&mw); - - QPoint targetPos(gv->mapFromScene(target->mapToScene(target->rect().center()))); - targetPos = gv->viewport()->mapFromParent(targetPos); - - // "Tap" starts on child widget - QTest::mousePress(gv->viewport(), Qt::LeftButton, 0, targetPos); - QCOMPARE(target->started(), 1); - QCOMPARE(target->updated(), 0); - QCOMPARE(target->finished(), 0); - QCOMPARE(target->canceled(), 0); - - // Canceling gesture starts on parent - QTest::mousePress(gv->viewport(), Qt::RightButton, 0, targetPos); - QCOMPARE(target->started(), 1); - QCOMPARE(target->updated(), 0); - QCOMPARE(target->finished(), 0); - QCOMPARE(target->canceled(), 1); // <- child canceled - - // Canceling gesture ends - QTest::mouseRelease(gv->viewport(), Qt::RightButton, 0, targetPos); - QCOMPARE(target->started(), 1); - QCOMPARE(target->updated(), 0); - QCOMPARE(target->finished(), 0); - QCOMPARE(target->canceled(), 1); - - // Tap would end if not canceled - QTest::mouseRelease(gv->viewport(), Qt::LeftButton, 0, targetPos); - QCOMPARE(target->started(), 1); - QCOMPARE(target->updated(), 0); - QCOMPARE(target->finished(), 0); - QCOMPARE(target->canceled(), 1); - - // New "Tap" starts - QTest::mousePress(gv->viewport(), Qt::LeftButton, 0, targetPos); - QCOMPARE(target->started(), 2); - QCOMPARE(target->updated(), 0); - QCOMPARE(target->finished(), 0); - QCOMPARE(target->canceled(), 1); - - QTest::mouseRelease(gv->viewport(), Qt::LeftButton, 0, targetPos); - QCOMPARE(target->started(), 2); - QCOMPARE(target->updated(), 0); - QCOMPARE(target->finished(), 1); - QCOMPARE(target->canceled(), 1); -} - -void tst_Gestures::conflictingGesturesInGraphicsView() -{ - QGraphicsScene scene; - GraphicsView view(&scene); - view.setWindowFlags(Qt::X11BypassWindowManagerHint); - - GestureItem *item1 = new GestureItem("item1"); - item1->grabGesture(CustomGesture::GestureType); - item1->size = QRectF(0, 0, 100, 100); - item1->setZValue(2); - scene.addItem(item1); - - GestureItem *item2 = new GestureItem("item2"); - item2->grabGesture(CustomGesture::GestureType); - item2->size = QRectF(0, 0, 100, 100); - item2->setZValue(5); - scene.addItem(item2); - - view.show(); - QTest::qWaitForWindowShown(&view); - view.ensureVisible(scene.sceneRect()); - - static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; - - CustomEvent event; - - // nobody accepts override - item1->acceptGestureOverride = false; - item2->acceptGestureOverride = false; - event.hotSpot = mapToGlobal(item2->boundingRect().center(), item2, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item2, &scene); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, 0); - - item1->reset(); item2->reset(); - - // the original target accepts override - item1->acceptGestureOverride = false; - item2->acceptGestureOverride = true; - event.hotSpot = mapToGlobal(item2->boundingRect().center(), item2, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item2, &scene); - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount); - QCOMPARE(item1->gestureOverrideEventsReceived, 0); - QCOMPARE(item1->gestureEventsReceived, 0); - - item1->reset(); item2->reset(); - - // the item behind accepts override - item1->acceptGestureOverride = true; - item2->acceptGestureOverride = false; - event.hotSpot = mapToGlobal(item2->boundingRect().center(), item2, &view); - event.hasHotSpot = true; - sendCustomGesture(&event, item2, &scene); - - QCOMPARE(item2->gestureOverrideEventsReceived, 1); - QCOMPARE(item2->gestureEventsReceived, 0); - QCOMPARE(item1->gestureOverrideEventsReceived, 1); - QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); -} - -class NoConsumeWidgetBug13501 :public QWidget -{ - Q_OBJECT -protected: - bool event(QEvent *e) { - if(e->type() == QEvent::Gesture) { - return false; - } - return QWidget::event(e); - } -}; - -void tst_Gestures::bug_13501_gesture_not_accepted() -{ - // Create a gesture event that is not accepted by any widget - // make sure this does not lead to an assert in QGestureManager - NoConsumeWidgetBug13501 w; - w.grabGesture(Qt::TapGesture); - w.show(); - QTest::qWaitForWindowShown(&w); - //QTest::mousePress(&ignoreEvent, Qt::LeftButton); - QTest::touchEvent(&w).press(0, QPoint(10, 10), &w); -} - -QTEST_MAIN(tst_Gestures) -#include "tst_gestures.moc" |