diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2016-09-01 06:16:18 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-02-02 19:17:35 +0000 |
commit | e2fd141372335f917c2d216051abb00d8b15f87c (patch) | |
tree | 8521c470e66d1a1badeb3c3020774abc66d639f7 /tests/auto/quick/pointerhandlers/qquickpointerhandler | |
parent | 73e9dc0667935b7b403c10736775d24d6e22eb8c (diff) |
QQuickWindow: deliver updates to handlers even if they don't grab
The "weak grab" concept depends on this.
First we deliver to grabbers, then we deliver to non-grabbing handlers
(but not to non-grabbing items). Avoid re-delivering to grabbing
handlers which already received the same event.
Change-Id: If51e1cd9372e3bed1daea3758e9ef8e37c0ba5e3
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'tests/auto/quick/pointerhandlers/qquickpointerhandler')
-rw-r--r-- | tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp b/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp index 94bb44a12b..8f65ec6d7f 100644 --- a/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp +++ b/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp @@ -76,7 +76,7 @@ class EventItem : public QQuickItem Q_OBJECT public: EventItem(QQuickItem *parent = 0) - : QQuickItem(parent), acceptPointer(false), acceptMouse(false), acceptTouch(false), filterTouch(false) + : QQuickItem(parent), acceptPointer(false), grabPointer(false), acceptMouse(false), acceptTouch(false), filterTouch(false) {} void touchEvent(QTouchEvent *event) @@ -125,6 +125,7 @@ public: QList<Event> eventList; bool acceptPointer; + bool grabPointer; bool acceptMouse; bool acceptTouch; bool filterTouch; // when used as event filter @@ -159,10 +160,11 @@ class EventHandler : public QQuickPointerHandler int c = event->pointCount(); for (int i = 0; i < c; ++i) { QQuickEventPoint *point = event->point(i); - point->setAccepted(item->acceptPointer); // has no effect: grabbing is up to us if (item->acceptPointer) - setGrab(point, true); - qCDebug(lcPointerTests) << " " << i << ":" << point << "grabbed?" << item->acceptPointer; + point->setAccepted(item->acceptPointer); // non-exclusive grab + if (item->grabPointer) + setGrab(point, true); // exclusive grab + qCDebug(lcPointerTests) << " " << i << ":" << point << "accepted?" << item->acceptPointer << "grabbed?" << (point->grabber() == this); item->eventList.append(Event(QEvent::Pointer, eventPos(point), point->scenePos())); } } @@ -236,17 +238,20 @@ void tst_PointerHandlers::touchEventDelivery() QPoint p1 = QPoint(20, 20); QTest::touchEvent(window, touchDevice).press(0, p1, window); QQuickTouchUtils::flush(window); - QTRY_COMPARE(eventItem1->eventList.size(), 3); + QTRY_COMPARE(eventItem1->eventList.size(), 4); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::Pointer); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(3).type, QEvent::Pointer); p1 += QPoint(10, 0); QTest::touchEvent(window, touchDevice).move(0, p1, window); QQuickTouchUtils::flush(window); - QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.size(), 5); + QCOMPARE(eventItem1->eventList.at(4).type, QEvent::Pointer); QTest::touchEvent(window, touchDevice).release(0, p1, window); QQuickTouchUtils::flush(window); - QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.size(), 6); + QCOMPARE(eventItem1->eventList.at(5).type, QEvent::Pointer); eventItem1->eventList.clear(); // Accept touch @@ -321,18 +326,19 @@ void tst_PointerHandlers::touchEventDelivery() p1 = QPoint(20, 20); QTest::touchEvent(window, touchDevice).press(0, p1, window); QQuickTouchUtils::flush(window); - QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.size(), 4); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::Pointer); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(3).type, QEvent::Pointer); QCOMPARE(pointerEvent->point(0)->grabber(), nullptr); p1 += QPoint(10, 0); QTest::touchEvent(window, touchDevice).move(0, p1, window); QQuickTouchUtils::flush(window); - QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.size(), 5); QTest::touchEvent(window, touchDevice).release(0, p1, window); QQuickTouchUtils::flush(window); - QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.size(), 6); eventItem1->eventList.clear(); // wait to avoid getting a double click event @@ -362,6 +368,7 @@ void tst_PointerHandlers::touchEventDelivery() // Accept pointer events eventItem1->acceptPointer = true; + eventItem1->grabPointer = true; p1 = QPoint(20, 20); QTest::touchEvent(window, touchDevice).press(0, p1, window); QQuickTouchUtils::flush(window); @@ -398,12 +405,12 @@ void tst_PointerHandlers::mouseEventDelivery() // Do not accept anything QPoint p1 = QPoint(20, 20); QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1); - QCOMPARE(eventItem1->eventList.size(), 2); + QCOMPARE(eventItem1->eventList.size(), 3); p1 += QPoint(10, 0); QTest::mouseMove(window, p1); - QCOMPARE(eventItem1->eventList.size(), 2); + QCOMPARE(eventItem1->eventList.size(), 4); QTest::mouseRelease(window, Qt::LeftButton); - QCOMPARE(eventItem1->eventList.size(), 2); + QCOMPARE(eventItem1->eventList.size(), 4); eventItem1->eventList.clear(); // wait to avoid getting a double click event @@ -415,9 +422,10 @@ void tst_PointerHandlers::mouseEventDelivery() eventItem1->setAcceptedMouseButtons(Qt::LeftButton); p1 = QPoint(20, 20); QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1); - QCOMPARE(eventItem1->eventList.size(), 2); + QCOMPARE(eventItem1->eventList.size(), 3); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::Pointer); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::Pointer); + QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseButtonPress); QCOMPARE(window->mouseGrabberItem(), eventItem1); QPointF localPos = eventItem1->mapFromScene(p1); @@ -429,30 +437,31 @@ void tst_PointerHandlers::mouseEventDelivery() p1 += QPoint(10, 0); QTest::mouseMove(window, p1); - QCOMPARE(eventItem1->eventList.size(), 3); - QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseMove); + QCOMPARE(eventItem1->eventList.size(), 4); + QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseMove); QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, p1); - QCOMPARE(eventItem1->eventList.size(), 5); - QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease); - QCOMPARE(eventItem1->eventList.at(4).type, QEvent::UngrabMouse); + QCOMPARE(eventItem1->eventList.size(), 6); + QCOMPARE(eventItem1->eventList.at(4).type, QEvent::MouseButtonRelease); + QCOMPARE(eventItem1->eventList.at(5).type, QEvent::UngrabMouse); eventItem1->eventList.clear(); // wait to avoid getting a double click event QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10); - // Accept pointer events + // Grab pointer events eventItem1->acceptMouse = false; eventItem1->acceptPointer = true; + eventItem1->grabPointer = true; p1 = QPoint(20, 20); QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1); - QTRY_COMPARE(eventItem1->eventList.size(), 1); + QTRY_COMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::Pointer); p1 += QPoint(10, 0); QTest::mouseMove(window, p1); - QCOMPARE(eventItem1->eventList.size(), 2); + QCOMPARE(eventItem1->eventList.size(), 3); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::Pointer); QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, p1); - QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.size(), 4); QCOMPARE(eventItem1->eventList.at(2).type, QEvent::Pointer); eventItem1->eventList.clear(); |