aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/pointerhandlers/qquickpointerhandler
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2016-09-01 06:16:18 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2017-02-02 19:17:35 +0000
commite2fd141372335f917c2d216051abb00d8b15f87c (patch)
tree8521c470e66d1a1badeb3c3020774abc66d639f7 /tests/auto/quick/pointerhandlers/qquickpointerhandler
parent73e9dc0667935b7b403c10736775d24d6e22eb8c (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.cpp57
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();