diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-10-18 13:28:52 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-10-20 21:37:57 +0200 |
commit | 59d967a8fb60bb764654a857cac20196358865eb (patch) | |
tree | 67c91b549e45742164533b9ff4e7132e3303fb16 /src/quicktestutils/quick/viewtestutils.cpp | |
parent | b8791806a317ca6aff1c237a226947064da462b2 (diff) | |
download | qtdeclarative-59d967a8fb60bb764654a857cac20196358865eb.tar.gz |
Add QQuickTest::pointerPress/Move/Release convenience functions
More autotests should test mouse, especially touch and maybe tablet
events, with similar expectations, instead of testing mainly mouse and
mostly neglecting the other device types. This makes it easier to work
with data-driven tests that take specific QPointingDevice instances as
test data.
Started using them in tst_TapHandler::gesturePolicyDragWithinBounds()
which was already data-driven by device type. Clearly, this code is
now easier to read and less repetitious.
In tst_qquickwindow::subclassWithPointerEventVirtualOverrides() the
improvement is somewhat smaller, but this test validates that
tablet events are working.
Change-Id: I74d0fcc2f082af3737a0754c58205fa2b18c1a2d
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/quicktestutils/quick/viewtestutils.cpp')
-rw-r--r-- | src/quicktestutils/quick/viewtestutils.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/quicktestutils/quick/viewtestutils.cpp b/src/quicktestutils/quick/viewtestutils.cpp index 6cdd5a3e94..19e29928bb 100644 --- a/src/quicktestutils/quick/viewtestutils.cpp +++ b/src/quicktestutils/quick/viewtestutils.cpp @@ -7,6 +7,7 @@ #include <QtQuick/QQuickView> #include <QtQuick/QQuickView> #include <QtGui/QScreen> +#include <QtGui/qpa/qwindowsysteminterface.h> #include <QtTest/QTest> @@ -446,6 +447,10 @@ namespace QQuickTouchUtils { } +namespace QTest { + int Q_TESTLIB_EXPORT defaultMouseDelay(); +} + namespace QQuickTest { /*! \internal @@ -503,6 +508,88 @@ namespace QQuickTest { return false; return true; } + + // TODO maybe move the generic pointerPress/Move/Release functions to QTestLib later on + + static Qt::MouseButton pressedTabletButton = Qt::NoButton; + static Qt::KeyboardModifiers pressedTabletModifiers = Qt::NoModifier; + + void pointerPress(const QPointingDevice *dev, QQuickWindow *window, int pointId, const QPoint &p, + Qt::MouseButton button, Qt::KeyboardModifiers modifiers) + { + switch (dev->type()) { + case QPointingDevice::DeviceType::Mouse: + case QPointingDevice::DeviceType::TouchPad: + QTest::mousePress(window, button, modifiers, p); + break; + case QPointingDevice::DeviceType::TouchScreen: + QTest::touchEvent(window, const_cast<QPointingDevice *>(dev)).press(pointId, p, window); + QQuickTouchUtils::flush(window); + break; + case QPointingDevice::DeviceType::Puck: + case QPointingDevice::DeviceType::Stylus: + case QPointingDevice::DeviceType::Airbrush: + QTest::lastMouseTimestamp += QTest::defaultMouseDelay(); + pressedTabletButton = button; + pressedTabletModifiers = modifiers; + QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, p, window->mapToGlobal(p), + button, 0.8, 0, 0, 0, 0, 0, modifiers); + break; + default: + qWarning() << "can't send a press event from" << dev; + break; + } + } + + void pointerMove(const QPointingDevice *dev, QQuickWindow *window, int pointId, const QPoint &p) + { + switch (dev->type()) { + case QPointingDevice::DeviceType::Mouse: + case QPointingDevice::DeviceType::TouchPad: + QTest::mouseMove(window, p); + break; + case QPointingDevice::DeviceType::TouchScreen: + QTest::touchEvent(window, const_cast<QPointingDevice *>(dev)).move(pointId, p, window); + QQuickTouchUtils::flush(window); + break; + case QPointingDevice::DeviceType::Puck: + case QPointingDevice::DeviceType::Stylus: + case QPointingDevice::DeviceType::Airbrush: + QTest::lastMouseTimestamp += QTest::defaultMouseDelay(); + QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, p, window->mapToGlobal(p), + pressedTabletButton, 0, 0, 0, 0, 0, 0, pressedTabletModifiers); + break; + default: + qWarning() << "can't send a move event from" << dev; + break; + } + } + + void pointerRelease(const QPointingDevice *dev, QQuickWindow *window, int pointId, const QPoint &p, + Qt::MouseButton button, Qt::KeyboardModifiers modifiers) + { + switch (dev->type()) { + case QPointingDevice::DeviceType::Mouse: + case QPointingDevice::DeviceType::TouchPad: + QTest::mouseRelease(window, button, modifiers, p); + break; + case QPointingDevice::DeviceType::TouchScreen: + QTest::touchEvent(window, const_cast<QPointingDevice *>(dev)).release(pointId, p, window); + QQuickTouchUtils::flush(window); + break; + case QPointingDevice::DeviceType::Puck: + case QPointingDevice::DeviceType::Stylus: + case QPointingDevice::DeviceType::Airbrush: + QTest::lastMouseTimestamp += QTest::defaultMouseDelay(); + QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, p, window->mapToGlobal(p), + Qt::NoButton, 0, 0, 0, 0, 0, 0, modifiers); + break; + default: + qWarning() << "can't send a press event from" << dev; + break; + } + } + } QT_END_NAMESPACE |