diff options
Diffstat (limited to 'tests')
5 files changed, 126 insertions, 146 deletions
diff --git a/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp b/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp index 275ee06a29..82511e57aa 100644 --- a/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp +++ b/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp @@ -328,20 +328,18 @@ void tst_PointerHandlers::touchEventDelivery() QTest::touchEvent(window, touchDevice).press(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events from touch press" << eventItem1->eventList; - QTRY_COMPARE(eventItem1->eventList.size(), synthMouse ? 3 : 2); + QTRY_COMPARE(eventItem1->eventList.size(), 2); QCOMPARE_EVENT(0, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Pressed, NoGrab); QCOMPARE_EVENT(1, Event::TouchDestination, QEvent::TouchBegin, QEventPoint::State::Pressed, NoGrab); - if (synthMouse) - QCOMPARE_EVENT(2, Event::MouseDestination, QEvent::MouseButtonPress, QEventPoint::State::Pressed, NoGrab); p1 += QPoint(10, 0); QTest::touchEvent(window, touchDevice).move(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch move" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 3 : 2); // no grabs -> no updates + QCOMPARE(eventItem1->eventList.size(), 2); // no grabs -> no updates QTest::touchEvent(window, touchDevice).release(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch release" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 4 : 3); + QCOMPARE(eventItem1->eventList.size(), 3); QCOMPARE_EVENT(eventItem1->eventList.size() - 1, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Released, NoGrab); eventItem1->eventList.clear(); @@ -378,44 +376,26 @@ void tst_PointerHandlers::touchEventDelivery() QTest::touchEvent(window, touchDevice).press(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch press" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 3 : 2); + QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE_EVENT(0, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Pressed, NoGrab); QCOMPARE_EVENT(1, Event::TouchDestination, QEvent::TouchBegin, QEventPoint::State::Pressed, NoGrab); - if (synthMouse) - QCOMPARE_EVENT(2, Event::MouseDestination, QEvent::MouseButtonPress, QEventPoint::State::Pressed, QPointingDevice::GrabExclusive); - QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, synthMouse ? eventItem1 : nullptr); + QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, nullptr); QPointF localPos = eventItem1->mapFromScene(p1); QPointF scenePos = p1; // item is at 0,0 QCOMPARE(eventItem1->eventList.at(1).posWrtItem, localPos); QCOMPARE(eventItem1->eventList.at(1).posWrtScene, scenePos); - if (synthMouse) { - QCOMPARE(eventItem1->eventList.at(2).posWrtItem, localPos); - QCOMPARE(eventItem1->eventList.at(2).posWrtScene, scenePos); - } p1 += QPoint(10, 0); QTest::touchEvent(window, touchDevice).move(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch move" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 6 : 2); - if (synthMouse) { - QCOMPARE_EVENT(3, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Updated, NoGrab); - QCOMPARE_EVENT(4, Event::TouchDestination, QEvent::TouchUpdate, QEventPoint::State::Updated, NoGrab); - QCOMPARE_EVENT(5, Event::MouseDestination, QEvent::MouseMove, QEventPoint::State::Updated, QPointingDevice::GrabExclusive); - } + QCOMPARE(eventItem1->eventList.size(), 2); QTest::touchEvent(window, touchDevice).release(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch release" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 10 : 3); - if (synthMouse) { - QCOMPARE_EVENT(6, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Released, NoGrab); - QCOMPARE_EVENT(7, Event::TouchDestination, QEvent::TouchEnd, QEventPoint::State::Released, NoGrab); - QCOMPARE_EVENT(8, Event::MouseDestination, QEvent::MouseButtonRelease, QEventPoint::State::Released, NoGrab); - QCOMPARE_EVENT(9, Event::MouseDestination, QEvent::UngrabMouse, QEventPoint::State::Released, QPointingDevice::UngrabExclusive); - } else { - QCOMPARE_EVENT(2, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Released, NoGrab); - } + QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE_EVENT(2, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Released, NoGrab); eventItem1->eventList.clear(); // wait to avoid getting a double click event @@ -429,21 +409,19 @@ void tst_PointerHandlers::touchEventDelivery() QTest::touchEvent(window, touchDevice).press(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch press" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 3 : 2); + QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE_EVENT(0, Event::HandlerDestination, QEvent::Pointer, QEventPoint::State::Pressed, NoGrab); QCOMPARE_EVENT(1, Event::TouchDestination, QEvent::TouchBegin, QEventPoint::State::Pressed, NoGrab); - if (synthMouse) - QCOMPARE_EVENT(2, Event::MouseDestination, QEvent::MouseButtonPress, QEventPoint::State::Pressed, NoGrab); QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, nullptr); p1 += QPoint(10, 0); QTest::touchEvent(window, touchDevice).move(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch move" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 3 : 2); + QCOMPARE(eventItem1->eventList.size(), 2); QTest::touchEvent(window, touchDevice).release(0, p1, window); QQuickTouchUtils::flush(window); qCDebug(lcPointerTests) << "events after touch release" << eventItem1->eventList; - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 4 : 3); + QCOMPARE(eventItem1->eventList.size(), 3); eventItem1->eventList.clear(); // wait to avoid getting a double click event diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp index 6c7c84c0cf..eb6ad494b4 100644 --- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -2021,7 +2021,7 @@ void tst_qquickflickable::nestedSliderUsingTouch_data() QTest::newRow("keepBoth") << true << true << 8 << 1 << 1; QTest::newRow("keepMouse") << true << false << 8 << 1 << 1; QTest::newRow("keepTouch") << false << true << 8 << 1 << 1; - QTest::newRow("keepNeither") << false << false << 5 << 0 << 1; + QTest::newRow("keepNeither") << false << false << 4 << 0 << 1; } void tst_qquickflickable::nestedSliderUsingTouch() diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index d5478ce15f..a3eb7d70ef 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -350,16 +350,14 @@ class MouseRecordingItem : public QQuickItem public: MouseRecordingItem(bool acceptTouch, QQuickItem *parent = nullptr) : QQuickItem(parent) - , m_acceptTouch(acceptTouch) { setSize(QSizeF(300, 300)); setAcceptedMouseButtons(Qt::LeftButton); - setAcceptTouchEvents(true); + setAcceptTouchEvents(acceptTouch); } protected: void touchEvent(QTouchEvent* event) override { - event->setAccepted(m_acceptTouch); m_touchEvents << event->type(); qCDebug(lcTests) << "accepted?" << event->isAccepted() << event; } @@ -389,9 +387,6 @@ public: }; QList<MouseEvent> m_mouseEvents; QList<QEvent::Type> m_touchEvents; - -private: - bool m_acceptTouch; }; class tst_qquickwindow : public QQmlDataTest @@ -954,7 +949,7 @@ void tst_qquickwindow::touchEvent_cancelClearsMouseGrab() item->setPosition(QPointF(50, 50)); item->setSize(QSizeF(150, 150)); item->acceptMouseEvents = true; - item->acceptTouchEvents = false; + item->setAcceptTouchEvents(false); QPointF pos(50, 50); QTest::touchEvent(window, touchDevice).press(0, item->mapToScene(pos).toPoint(), window); @@ -1148,10 +1143,6 @@ void tst_qquickwindow::mergeTouchPointLists() void tst_qquickwindow::mouseFromTouch_basic() { - // Turn off accepting touch events with acceptTouchEvents. This - // should result in sending mouse events generated from the touch - // with the new event propagation system. - TestTouchItem::clearMouseEventCounters(); QQuickWindow *window = new QQuickWindow; QScopedPointer<QQuickWindow> cleanup(window); @@ -1165,7 +1156,9 @@ void tst_qquickwindow::mouseFromTouch_basic() TestTouchItem *item = new TestTouchItem(window->contentItem()); item->setPosition(QPointF(50, 50)); item->setSize(QSizeF(150, 150)); - item->acceptTouchEvents = false; + // If it doesn't accept touch, but does accept LeftButton mouse events, then + // the first point in each touch event should generate a synth-mouse event. + item->setAcceptTouchEvents(false); QList<QMutableEventPoint> points; QMutableEventPoint tp(1, QEventPoint::State::Pressed); @@ -1265,7 +1258,7 @@ void tst_qquickwindow::synthMouseFromTouch() QTest::touchEvent(window.data(), touchDevice).release(0, p2, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(item->m_touchEvents.count(), !synthMouse && !acceptTouch ? 1 : 3); + QCOMPARE(item->m_touchEvents.count(), acceptTouch ? 3 : 0); QCOMPARE(item->m_mouseEvents.count(), (acceptTouch || !synthMouse) ? 0 : 3); QCOMPARE(window->m_mouseEvents.count(), 0); for (const auto &ev : item->m_mouseEvents) diff --git a/tests/auto/quick/touchmouse/BLACKLIST b/tests/auto/quick/touchmouse/BLACKLIST index 49faa3f4f9..214da65864 100644 --- a/tests/auto/quick/touchmouse/BLACKLIST +++ b/tests/auto/quick/touchmouse/BLACKLIST @@ -8,4 +8,6 @@ windows gcc developer-build # QTBUG-74517 [touchButtonOnFlickable] windows gcc developer-build + +[hoverEnabled] * # QTBUG-86729 diff --git a/tests/auto/quick/touchmouse/tst_touchmouse.cpp b/tests/auto/quick/touchmouse/tst_touchmouse.cpp index d06f1337c4..976f7087c2 100644 --- a/tests/auto/quick/touchmouse/tst_touchmouse.cpp +++ b/tests/auto/quick/touchmouse/tst_touchmouse.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtQml module of the Qt Toolkit. @@ -97,7 +97,6 @@ public: : QQuickItem(parent) { setAcceptedMouseButtons(Qt::LeftButton); - setAcceptTouchEvents(true); } void touchEvent(QTouchEvent *event) @@ -305,24 +304,27 @@ void tst_TouchMouse::simpleTouchEvent() auto devPriv = QPointingDevicePrivate::get(device); // Do not accept touch or mouse + eventItem1->setAcceptTouchEvents(false); QPoint p1; p1 = QPoint(20, 20); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - // Get a touch and then mouse event offered - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); + // Get a synth-mouse event if allowed + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); + if (synthMouse) + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); p1 += QPoint(10, 0); QTest::touchEvent(window.data(), device).move(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); // Not accepted, no updates - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); QTest::touchEvent(window.data(), device).release(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); eventItem1->eventList.clear(); // Accept touch + eventItem1->setAcceptTouchEvents(true); eventItem1->acceptTouch = true; p1 = QPoint(20, 20); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); @@ -343,44 +345,37 @@ void tst_TouchMouse::simpleTouchEvent() // Accept mouse eventItem1->acceptTouch = false; eventItem1->acceptMouse = true; + eventItem1->setAcceptTouchEvents(false); eventItem1->setAcceptedMouseButtons(Qt::LeftButton); p1 = QPoint(20, 20); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); if (synthMouse) - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); QCOMPARE(devPriv->firstPointExclusiveGrabber(), synthMouse ? eventItem1 : nullptr); QPoint localPos = eventItem1->mapFromScene(p1).toPoint(); QPoint globalPos = window->mapToGlobal(p1); - QPoint scenePos = p1; // item is at 0,0 - QCOMPARE(eventItem1->eventList.at(0).points.at(0).position().toPoint(), localPos); - QCOMPARE(eventItem1->eventList.at(0).points.at(0).scenePosition().toPoint(), scenePos); - QCOMPARE(eventItem1->eventList.at(0).points.at(0).globalPosition().toPoint(), globalPos); if (synthMouse) { - QCOMPARE(eventItem1->eventList.at(1).mousePos, localPos); - QCOMPARE(eventItem1->eventList.at(1).mousePosGlobal, globalPos); + QCOMPARE(eventItem1->eventList.at(0).mousePos, localPos); + QCOMPARE(eventItem1->eventList.at(0).mousePosGlobal, globalPos); } p1 += QPoint(10, 0); QTest::touchEvent(window.data(), device).move(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 4 : 1); - if (synthMouse) { - QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchUpdate); - QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseMove); - } + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 0); + if (synthMouse) + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseMove); // else, if there was no synth-mouse and we didn't accept the touch, // TouchUpdate was not sent to eventItem1 either. QTest::touchEvent(window.data(), device).release(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 7 : 1); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 4 : 0); if (synthMouse) { - QCOMPARE(eventItem1->eventList.at(4).type, QEvent::TouchEnd); - QCOMPARE(eventItem1->eventList.at(5).type, QEvent::MouseButtonRelease); - QCOMPARE(eventItem1->eventList.at(6).type, QEvent::UngrabMouse); + QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseButtonRelease); + QCOMPARE(eventItem1->eventList.at(3).type, QEvent::UngrabMouse); } // else, if there was no synth-mouse and we didn't accept the touch, // TouchEnd was not sent to eventItem1 either. @@ -396,17 +391,16 @@ void tst_TouchMouse::simpleTouchEvent() p1 = QPoint(20, 20); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); if (synthMouse) - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); p1 += QPoint(10, 0); QTest::touchEvent(window.data(), device).move(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); QTest::touchEvent(window.data(), device).release(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1); + QCOMPARE(eventItem1->eventList.size(), synthMouse ? 1 : 0); eventItem1->eventList.clear(); // wait to avoid getting a double click event @@ -414,6 +408,7 @@ void tst_TouchMouse::simpleTouchEvent() // Accept touch and mouse eventItem1->acceptTouch = true; + eventItem1->setAcceptTouchEvents(true); eventItem1->setAcceptedMouseButtons(Qt::LeftButton); p1 = QPoint(20, 20); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); @@ -482,15 +477,16 @@ void tst_TouchMouse::mouse() // bottom item likes mouse, top likes touch eventItem1->setAcceptedMouseButtons(Qt::LeftButton); + eventItem1->setAcceptTouchEvents(false); eventItem1->acceptMouse = true; // item 2 doesn't accept anything, thus it sees a touch pass by + eventItem2->setAcceptTouchEvents(false); QPoint p1 = QPoint(30, 30); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), 2); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.size(), 1); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); } void tst_TouchMouse::touchOverMouse() @@ -512,25 +508,31 @@ void tst_TouchMouse::touchOverMouse() // bottom item likes mouse, top likes touch eventItem1->setAcceptedMouseButtons(Qt::LeftButton); - eventItem2->acceptTouch = true; + eventItem1->acceptMouse = true; + eventItem2->acceptTouch = false; // let it fall through + eventItem2->setAcceptTouchEvents(true); QCOMPARE(eventItem1->eventList.size(), 0); QPoint p1 = QPoint(20, 20); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), 0); + qCDebug(lcTests) << "expected delivered events: press(mouse)" << eventItem1->eventList; + QCOMPARE(eventItem1->eventList.size(), 1); + qCDebug(lcTests) << "expected delivered events: press(touch)" << eventItem2->eventList; QCOMPARE(eventItem2->eventList.size(), 1); QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin); p1 += QPoint(10, 0); QTest::touchEvent(window.data(), device).move(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem2->eventList.size(), 2); - QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchUpdate); + qCDebug(lcTests) << "expected delivered events: press(mouse) move(mouse)" << eventItem1->eventList; + QCOMPARE(eventItem1->eventList.size(), 2); + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseMove); QTest::touchEvent(window.data(), device).release(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem2->eventList.size(), 3); - QCOMPARE(eventItem2->eventList.at(2).type, QEvent::TouchEnd); - eventItem2->eventList.clear(); + qCDebug(lcTests) << "expected delivered events: press(mouse) move(mouse) release(mouse) ungrab(mouse)" << eventItem1->eventList; + QCOMPARE(eventItem1->eventList.size(), 4); + QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseButtonRelease); + QCOMPARE(eventItem1->eventList.at(3).type, QEvent::UngrabMouse); } void tst_TouchMouse::mouseOverTouch() @@ -554,15 +556,15 @@ void tst_TouchMouse::mouseOverTouch() eventItem1->acceptTouch = true; eventItem2->setAcceptedMouseButtons(Qt::LeftButton); eventItem2->acceptMouse = true; + eventItem2->setAcceptTouchEvents(false); QPoint p1 = QPoint(20, 20); QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); QCOMPARE(eventItem1->eventList.size(), 0); - QCOMPARE(eventItem2->eventList.size(), 2); - QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem2->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem2->eventList.size(), 1); + QCOMPARE(eventItem2->eventList.at(0).type, QEvent::MouseButtonPress); // p1 += QPoint(10, 0); @@ -594,12 +596,14 @@ void tst_TouchMouse::buttonOnFlickable() QVERIFY(eventItem1); eventItem1->setAcceptedMouseButtons(Qt::LeftButton); eventItem1->acceptMouse = true; + eventItem1->setAcceptTouchEvents(false); // should a touch button be touchable on top of flickable? yes :) EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2"); QVERIFY(eventItem2); QCOMPARE(eventItem2->eventList.size(), 0); eventItem2->acceptTouch = true; + eventItem2->setAcceptTouchEvents(true); // wait to avoid getting a double click event QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10); @@ -610,15 +614,13 @@ void tst_TouchMouse::buttonOnFlickable() QPoint p1 = QPoint(20, 130); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QTRY_COMPARE(eventItem1->eventList.size(), 2); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QTRY_COMPARE(eventItem1->eventList.size(), 1); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); QTest::touchEvent(window.data(), device).release(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), 5); - QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd); - QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease); - QCOMPARE(eventItem1->eventList.at(4).type, QEvent::UngrabMouse); + QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonRelease); + QCOMPARE(eventItem1->eventList.at(2).type, QEvent::UngrabMouse); eventItem1->eventList.clear(); // touch button @@ -655,9 +657,8 @@ void tst_TouchMouse::buttonOnFlickable() p1 = QPoint(10, 110); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), 2); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.size(), 1); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window.data()); QVERIFY(windowPriv->touchMouseId != -1); @@ -666,27 +667,25 @@ void tst_TouchMouse::buttonOnFlickable() QCOMPARE(grabMonitor.exclusiveGrabber, eventItem1); int dragDelta = -qApp->styleHints()->startDragDistance(); - p1 += QPoint(0, dragDelta); - QPoint p2 = p1 + QPoint(0, dragDelta); - QPoint p3 = p2 + QPoint(0, dragDelta); - QQuickTouchUtils::flush(window.data()); - QTest::touchEvent(window.data(), device).move(0, p1, window.data()); - QQuickTouchUtils::flush(window.data()); - QTest::touchEvent(window.data(), device).move(0, p2, window.data()); - QQuickTouchUtils::flush(window.data()); - QTest::touchEvent(window.data(), device).move(0, p3, window.data()); - QQuickTouchUtils::flush(window.data()); - QVERIFY(eventItem1->eventList.size() >= 4); - QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchUpdate); - QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseMove); + // Start dragging; eventually, Flickable steals the grab + int i = 0; + for (; i < 10 && !flickable->isMovingVertically(); ++i) { + p1 += QPoint(0, dragDelta); + QTest::touchEvent(window.data(), device).move(0, p1, window.data()); + QQuickTouchUtils::flush(window.data()); + } + QVERIFY(flickable->isMovingVertically()); + qCDebug(lcTests) << "flickable started moving after" << i << "moves, when we got to" << p1; + QCOMPARE(eventItem1->eventList.size(), 4); + QCOMPARE(eventItem1->eventList.at(2).type, QEvent::MouseMove); + QCOMPARE(eventItem1->eventList.at(3).type, QEvent::UngrabMouse); QCOMPARE(grabMonitor.exclusiveGrabber, flickable); QVERIFY(windowPriv->touchMouseId != -1); QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, flickable); -// QVERIFY(flickable->isMovingVertically()); // it will move after a couple more mouse moves - QTest::touchEvent(window.data(), device).release(0, p3, window.data()); + QTest::touchEvent(window.data(), device).release(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); } @@ -710,6 +709,7 @@ void tst_TouchMouse::touchButtonOnFlickable() QVERIFY(eventItem2); QCOMPARE(eventItem2->eventList.size(), 0); eventItem2->acceptTouch = true; + eventItem2->setAcceptTouchEvents(true); // press via touch, then drag: check that flickable moves and that the button gets ungrabbed QCOMPARE(eventItem2->eventList.size(), 0); @@ -739,10 +739,12 @@ void tst_TouchMouse::touchButtonOnFlickable() QQuickTouchUtils::flush(window.data()); QTRY_COMPARE(eventItem2->touchUngrabCount, 1); - QVERIFY(eventItem2->eventList.size() > 2); + qCDebug(lcTests) << "expected delivered events: press(touch) move(touch)" << eventItem2->eventList; + QCOMPARE(eventItem2->eventList.size(), 2); QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchUpdate); QCOMPARE(grabMonitor.exclusiveGrabber, flickable); - QVERIFY(windowPriv->touchMouseId != -1); + // both EventItem and Flickable handled the actual touch, so synth-mouse doesn't happen + QCOMPARE(windowPriv->touchMouseId, -1); QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, flickable); QVERIFY(flickable->isMovingVertically()); @@ -797,7 +799,6 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() // should a mouse area button be clickable on top of flickable? yes :) EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1"); QVERIFY(eventItem1); - eventItem1->setAcceptTouchEvents(true); // because it was that way by default in Qt 5 eventItem1->setAcceptedMouseButtons(Qt::LeftButton); eventItem1->acceptMouse = true; @@ -822,10 +823,10 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() QCOMPARE(eventItem1->eventList.size(), 0); } else { // wait until the button sees the press - qCDebug(lcTests) << "expected delivered events: press(touch), press(mouse)" << eventItem1->eventList; - QTRY_COMPARE(eventItem1->eventList.size(), 2); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + qCDebug(lcTests) << "expected delivered events: press(mouse)" << eventItem1->eventList; + qCDebug(lcTests) << "expected filtered events: actual TouchBegin and replayed TouchBegin" << filteredEventList; + QTRY_COMPARE(eventItem1->eventList.size(), 1); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); QCOMPARE(filteredEventList.count(), 2); // actual touch begin and replayed touch begin } @@ -843,9 +844,10 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() qCDebug(lcTests) << "expected filtered events: 1 TouchBegin and 3 TouchUpdate" << filteredEventList; QCOMPARE(filteredEventList.count(), 4); } else { - // see at least press, move and ungrab - QTRY_VERIFY(eventItem1->eventList.size() > 2); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); + qCDebug(lcTests) << "expected delivered events: press(mouse), move(mouse), move(mouse), ungrab(mouse)" << eventItem1->eventList; + QCOMPARE(eventItem1->eventList.size(), 4); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseMove); QCOMPARE(eventItem1->eventList.last().type, QEvent::UngrabMouse); qCDebug(lcTests) << "expected filtered events: 2 TouchBegin and 3 TouchUpdate" << filteredEventList; QCOMPARE(filteredEventList.count(), 5); @@ -862,11 +864,11 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() if (releaseBeforeDelayIsOver) { // when the touchpoint was released, the child saw the delayed press and the release in sequence - qCDebug(lcTests) << "expected delivered events: press(touch), press(mouse), release(touch), release(mouse), ungrab" << eventItem1->eventList; - qCDebug(lcTests) << "expected filtered events: delayed press, release (touch)" << filteredEventList; - QTRY_COMPARE(eventItem1->eventList.size(), 5); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); - QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease); + qCDebug(lcTests) << "expected delivered events: press(mouse), release(mouse), ungrab" << eventItem1->eventList; + qCDebug(lcTests) << "expected filtered events: press(touch), release(touch), delayed press(touch), release (touch)" << filteredEventList; + QTRY_COMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonRelease); QCOMPARE(eventItem1->eventList.last().type, QEvent::UngrabMouse); // QQuickWindow filters the delayed press and release QCOMPARE(filteredEventList.count(), 4); @@ -923,6 +925,7 @@ void tst_TouchMouse::buttonOnTouch() // Test the common case of a mouse area on top of pinch eventItem1->setAcceptedMouseButtons(Qt::LeftButton); + eventItem1->setAcceptTouchEvents(false); eventItem1->acceptMouse = true; @@ -935,12 +938,10 @@ void tst_TouchMouse::buttonOnTouch() QQuickTouchUtils::flush(window.data()); touchSeq.release(0, p1, window.data()).commit(); QQuickTouchUtils::flush(window.data()); - QCOMPARE(eventItem1->eventList.size(), 5); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); - QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd); - QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease); - QCOMPARE(eventItem1->eventList.at(4).type, QEvent::UngrabMouse); + QCOMPARE(eventItem1->eventList.size(), 3); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonRelease); + QCOMPARE(eventItem1->eventList.at(2).type, QEvent::UngrabMouse); eventItem1->eventList.clear(); // Normal mouse click @@ -1000,9 +1001,8 @@ void tst_TouchMouse::buttonOnTouch() touchSeq.press(0, p1, window.data()).press(1, p2, window.data()).commit(); QQuickTouchUtils::flush(window.data()); QCOMPARE(button1->scale(), 1.0); - QCOMPARE(eventItem1->eventList.count(), 2); - QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); + QCOMPARE(eventItem1->eventList.count(), 1); + QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress); // This event seems to be discarded, let's ignore it for now until someone digs into pincharea p1 -= QPoint(10, 0); @@ -1250,8 +1250,9 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() pinchSequence.release(0, p1, window.data()).release(1, p2, window.data()).commit(); QQuickTouchUtils::flush(window.data()); QVERIFY(rect->scale() > 1.0); + // first pinch is done - // PinchArea should steal the event after flicking started + // Press one point and drag left: Flickable flicks rect->setScale(1.0); flickable->setContentX(0.0); p = QPoint(100, 100); @@ -1269,7 +1270,7 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() pinchSequence.move(0, p, window.data()).commit(); QQuickTouchUtils::flush(window.data()); - // Add a second finger, this should lead to stealing + // Add a second finger: PinchArea should grab one touchpoint and steal the other, even though flicking is ongoing p1 = QPoint(40, 100); p2 = QPoint(60, 100); pinchSequence.stationary(0).press(1, p2, window.data()).commit(); @@ -1290,6 +1291,7 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() QQuickTouchUtils::flush(window.data()); pinchSequence.release(0, p1, window.data()).release(1, p2, window.data()).commit(); QQuickTouchUtils::flush(window.data()); + qCDebug(lcTests) << "pinch scaled to" << rect->scale(); QVERIFY(rect->scale() > 1.0); pinchSequence.release(0, p, window.data()).commit(); QQuickTouchUtils::flush(window.data()); @@ -1369,9 +1371,9 @@ void tst_TouchMouse::touchGrabCausesMouseUngrab() p1 = QPoint(leftItem->width() / 2, leftItem->height() / 2); QTest::touchEvent(window.data(), device).press(0, p1, window.data()); QQuickTouchUtils::flush(window.data()); - QCOMPARE(leftItem->eventList.size(), 2); - QCOMPARE(leftItem->eventList.at(0).type, QEvent::TouchBegin); - QCOMPARE(leftItem->eventList.at(1).type, QEvent::MouseButtonPress); + qCDebug(lcTests) << "expected delivered events: press(mouse)" << leftItem->eventList; + QCOMPARE(leftItem->eventList.size(), 1); + QCOMPARE(leftItem->eventList.at(0).type, QEvent::MouseButtonPress); QCOMPARE(grabMonitor.exclusiveGrabber, leftItem); leftItem->eventList.clear(); @@ -1421,6 +1423,10 @@ void tst_TouchMouse::touchPointDeliveryOrder() QVERIFY(left); QVERIFY(middle); QVERIFY(right); + background->setAcceptTouchEvents(true); + left->setAcceptTouchEvents(true); + middle->setAcceptTouchEvents(true); + right->setAcceptTouchEvents(true); connect(background, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); }); connect(left, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); }); connect(middle, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); }); @@ -1489,7 +1495,7 @@ void tst_TouchMouse::touchPointDeliveryOrder() touchSeq.release(0, pRightMiddle, window.data()).release(1, pLeftMiddle, window.data()).commit(); } -void tst_TouchMouse::hoverEnabled() +void tst_TouchMouse::hoverEnabled() // QTBUG-40856 { QScopedPointer<QQuickView> window(createView()); window->setSource(testFileUrl("hoverMouseAreas.qml")); @@ -1585,6 +1591,7 @@ void tst_TouchMouse::implicitUngrab() QVERIFY(root != nullptr); EventItem *eventItem = root->findChild<EventItem*>("eventItem1"); eventItem->acceptMouse = true; + eventItem->setAcceptTouchEvents(false); QPoint p1(20, 20); QTest::touchEvent(window.data(), device).press(0, p1); |