diff options
| author | Shawn Rutledge <shawn.rutledge@qt.io> | 2024-06-18 00:13:30 -0700 |
|---|---|---|
| committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2024-10-17 21:43:49 +0200 |
| commit | 79e16f5271240e3aecb28dca6cb054c9e578b900 (patch) | |
| tree | 02463a16ac3c73f6bf5c4d9346d9ebbc8c6d56f6 /src/quicktestutils/quick/viewtestutils.cpp | |
| parent | c49cf8b186ba9080d37e8db5d72f509cbca66788 (diff) | |
Replace mouse-only flick, moveAndPress, moveAndRelease in tests
Since d7623d79ef4bc9533fced027bf1d173d68b4eba6 Flickable has worked
directly with touch events; and we are expected to have stylus devices
(QTabletEvents) working well too. So we need to be able to expand the
test coverage to more types of devices. This is the first step.
The high-dpi scaling is from 0debcf3ed3f62416be1c172454f420119df0587e.
Change-Id: I93a3a4b84424eb69e0cd7c9f4ebe58b9f27082d9
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 99c6706b9208fcdf2e48f14bcd3f961567838ea4)
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 | 109 |
1 files changed, 66 insertions, 43 deletions
diff --git a/src/quicktestutils/quick/viewtestutils.cpp b/src/quicktestutils/quick/viewtestutils.cpp index db30cedd3e..848903df5f 100644 --- a/src/quicktestutils/quick/viewtestutils.cpp +++ b/src/quicktestutils/quick/viewtestutils.cpp @@ -8,6 +8,7 @@ #include <QtQuick/QQuickView> #include <QtQuick/QQuickView> #include <QtGui/QScreen> +#include <QtGui/private/qhighdpiscaling_p.h> #include <QtGui/qpa/qwindowsysteminterface.h> #include <QtTest/QTest> @@ -52,33 +53,6 @@ void QQuickViewTestUtils::moveMouseAway(QQuickView *window) #endif } -void QQuickViewTestUtils::moveAndRelease(QQuickView *window, const QPoint &position) -{ - QTest::mouseMove(window, position); - QTest::mouseRelease(window, Qt::LeftButton, {}, position); -} - -void QQuickViewTestUtils::moveAndPress(QQuickView *window, const QPoint &position) -{ - QTest::mouseMove(window, position); - QTest::mousePress(window, Qt::LeftButton, {}, position); -} - -void QQuickViewTestUtils::flick(QQuickView *window, const QPoint &from, const QPoint &to, int duration) -{ - const int pointCount = 5; - QPoint diff = to - from; - - // send press, five equally spaced moves, and release. - moveAndPress(window, from); - - for (int i = 0; i < pointCount; ++i) - QTest::mouseMove(window, from + (i+1)*diff/pointCount, duration / pointCount); - - moveAndRelease(window, to); - QTest::qWait(50); -} - QList<int> QQuickViewTestUtils::adjustIndexesForAddDisplaced(const QList<int> &indexes, int index, int count) { QList<int> result; @@ -524,50 +498,63 @@ namespace QQuickTest { static Qt::KeyboardModifiers pressedTabletModifiers = Qt::NoModifier; void pointerPress(const QPointingDevice *dev, QQuickWindow *window, int pointId, const QPoint &p, - Qt::MouseButton button, Qt::KeyboardModifiers modifiers) + Qt::MouseButton button, Qt::KeyboardModifiers modifiers, int delay) { + const auto defaultDelay = QTest::defaultMouseDelay(); switch (dev->type()) { case QPointingDevice::DeviceType::Mouse: case QPointingDevice::DeviceType::TouchPad: - QTest::mousePress(window, button, modifiers, p); + QTest::mousePress(window, button, modifiers, p, delay >= 0 ? delay : defaultDelay ? defaultDelay : 1); break; case QPointingDevice::DeviceType::TouchScreen: + // TODO apply delay when QTBUG-95421 is fixed 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(); + case QPointingDevice::DeviceType::Airbrush:{ + const QPointF nativeLocal = QHighDpi::toNativeLocalPosition(p, window); + const QPointF nativeGlobal = QHighDpi::toNativeGlobalPosition(window->mapToGlobal(p), window); + QTest::lastMouseTimestamp += delay >= 0 ? delay : defaultDelay ? defaultDelay : 1; pressedTabletButton = button; pressedTabletModifiers = modifiers; - QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, p, window->mapToGlobal(p), + QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, nativeLocal, nativeGlobal, 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) + void pointerMove(const QPointingDevice *dev, QQuickWindow *window, int pointId, const QPoint &p, int delay) { + const auto defaultDelay = QTest::defaultMouseDelay(); switch (dev->type()) { case QPointingDevice::DeviceType::Mouse: case QPointingDevice::DeviceType::TouchPad: - QTest::mouseMove(window, p); + QTest::mouseMove(window, p, delay >= 0 ? delay : defaultDelay ? defaultDelay : 1); break; case QPointingDevice::DeviceType::TouchScreen: + // TODO apply delay when QTBUG-95421 is fixed 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); + case QPointingDevice::DeviceType::Airbrush: { + const QPointF nativeLocal = QHighDpi::toNativeLocalPosition(p, window); + const QPointF nativeGlobal = QHighDpi::toNativeGlobalPosition(window->mapToGlobal(p), window); + const auto delay = QTest::defaultMouseDelay(); + // often QTest::defaultMouseDelay() == 0; but avoid infinite velocity + QTest::lastMouseTimestamp += delay >= 0 ? delay : defaultDelay ? defaultDelay : 1; + QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, nativeLocal, nativeGlobal, + pressedTabletButton, pressedTabletButton == Qt::NoButton ? 0 : 0.75, + 0, 0, 0, 0, 0, pressedTabletModifiers); break; + } default: qWarning() << "can't send a move event from" << dev; break; @@ -575,30 +562,66 @@ namespace QQuickTest { } void pointerRelease(const QPointingDevice *dev, QQuickWindow *window, int pointId, const QPoint &p, - Qt::MouseButton button, Qt::KeyboardModifiers modifiers) + Qt::MouseButton button, Qt::KeyboardModifiers modifiers, int delay) { + const auto defaultDelay = QTest::defaultMouseDelay(); switch (dev->type()) { case QPointingDevice::DeviceType::Mouse: case QPointingDevice::DeviceType::TouchPad: - QTest::mouseRelease(window, button, modifiers, p); + QTest::mouseRelease(window, button, modifiers, p, delay >= 0 ? delay : defaultDelay ? defaultDelay : 1); break; case QPointingDevice::DeviceType::TouchScreen: + // TODO apply delay when QTBUG-95421 is fixed 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), + case QPointingDevice::DeviceType::Airbrush: { + const QPointF nativeLocal = QHighDpi::toNativeLocalPosition(p, window); + const QPointF nativeGlobal = QHighDpi::toNativeGlobalPosition(window->mapToGlobal(p), window); + QTest::lastMouseTimestamp += delay >= 0 ? delay : defaultDelay ? defaultDelay : 1; + QWindowSystemInterface::handleTabletEvent(window, QTest::lastMouseTimestamp, dev, nativeLocal, nativeGlobal, Qt::NoButton, 0, 0, 0, 0, 0, 0, modifiers); break; + } default: qWarning() << "can't send a press event from" << dev; break; } } + void pointerMoveAndPress(const QPointingDevice *dev, QQuickWindow *window, + int pointId, const QPoint &p, Qt::MouseButton button, + Qt::KeyboardModifiers modifiers, int delay) + { + pointerMove(dev, window, pointId, p, delay); + pointerPress(dev, window, pointId, p, button, modifiers); + } + + void pointerMoveAndRelease(const QPointingDevice *dev, QQuickWindow *window, + int pointId, const QPoint &p, Qt::MouseButton button, + Qt::KeyboardModifiers modifiers, int delay) + { + pointerMove(dev, window, pointId, p, delay); + pointerRelease(dev, window, pointId, p, button, modifiers); + } + + void pointerFlick(const QPointingDevice *dev, QQuickWindow *window, + int pointId, const QPoint &from, const QPoint &to, int duration, + Qt::MouseButton button, Qt::KeyboardModifiers modifiers, int delay) + { + const int pointCount = 5; + const QPoint diff = to - from; + + // send press, five equally spaced moves, and release. + pointerMoveAndPress(dev, window, pointId, from, button, modifiers, delay); + + for (int i = 0; i < pointCount; ++i) + pointerMove(dev, window, pointId, from + (i + 1) * diff / pointCount, duration / pointCount); + + pointerMoveAndRelease(dev, window, pointId, to, button, modifiers); + } } QT_END_NAMESPACE |
