summaryrefslogtreecommitdiffstats
path: root/tests/auto/gestures/tst_gestures.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/gestures/tst_gestures.cpp')
-rw-r--r--tests/auto/gestures/tst_gestures.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp
index 952136bba4..e6de590242 100644
--- a/tests/auto/gestures/tst_gestures.cpp
+++ b/tests/auto/gestures/tst_gestures.cpp
@@ -333,6 +333,7 @@ private slots:
void unregisterRecognizer();
void autoCancelGestures();
void autoCancelGestures2();
+ void graphicsViewParentPropagation();
};
tst_Gestures::tst_Gestures()
@@ -698,6 +699,9 @@ public:
bool acceptGestureOverride;
QSet<Qt::GestureType> ignoredGestures;
+ QSet<Qt::GestureType> ignoredStartedGestures;
+ QSet<Qt::GestureType> ignoredUpdatedGestures;
+ QSet<Qt::GestureType> ignoredFinishedGestures;
QRectF size;
int instanceNumber;
@@ -710,6 +714,9 @@ public:
events.clear();
overrideEvents.clear();
ignoredGestures.clear();
+ ignoredStartedGestures.clear();
+ ignoredUpdatedGestures.clear();
+ ignoredFinishedGestures.clear();
}
protected:
@@ -732,6 +739,24 @@ protected:
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;
@@ -1471,5 +1496,66 @@ void tst_Gestures::autoCancelGestures2()
QCOMPARE(parent->events.all.count(), 2);
}
+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());
+
+ view.viewport()->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren);
+ 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, 0);
+ QCOMPARE(item1_c1->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount-1);
+ QCOMPARE(item1->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item0->gestureEventsReceived, 0);
+ QCOMPARE(item0->gestureOverrideEventsReceived, 1);
+}
+
QTEST_MAIN(tst_Gestures)
#include "tst_gestures.moc"