diff options
Diffstat (limited to 'src/quicktestutils/quick/visualtestutils.cpp')
-rw-r--r-- | src/quicktestutils/quick/visualtestutils.cpp | 80 |
1 files changed, 78 insertions, 2 deletions
diff --git a/src/quicktestutils/quick/visualtestutils.cpp b/src/quicktestutils/quick/visualtestutils.cpp index 12da74d519..eb04bf086b 100644 --- a/src/quicktestutils/quick/visualtestutils.cpp +++ b/src/quicktestutils/quick/visualtestutils.cpp @@ -1,13 +1,17 @@ // Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "visualtestutils_p.h" #include <QtCore/QCoreApplication> +#include <QtCore/private/qvariantanimation_p.h> #include <QtCore/QDebug> #include <QtQuick/QQuickItem> +#if QT_CONFIG(quick_itemview) #include <QtQuick/private/qquickitemview_p.h> +#endif #include <QtQuickTest/QtQuickTest> +#include <QtQuickTestUtils/private/viewtestutils_p.h> QT_BEGIN_NAMESPACE @@ -58,7 +62,62 @@ void QQuickVisualTestUtils::centerOnScreen(QQuickWindow *window) window->setFramePosition(screenGeometry.center() - offset); } -bool QQuickVisualTestUtils::delegateVisible(QQuickItem *item) +QPoint QQuickVisualTestUtils::lerpPoints(const QPoint &point1, const QPoint &point2, qreal t) +{ + return QPoint(_q_interpolate(point1.x(), point2.x(), t), _q_interpolate(point1.y(), point2.y(), t)); +}; + +/*! + \internal + + Convenience class to linearly interpolate between two pointer move points. + + \code + PointLerper pointLerper(window); + // Lerps from {0, 0} to {15, 15}. + pointLerper.move(15, 15); + QVERIFY(parentButton->isHovered()); + + // Lerps from {15, 15} to {25, 25}. + pointLerper.move(25, 25); + QVERIFY(childButton->isHovered()); + \endcode +*/ +QQuickVisualTestUtils::PointLerper::PointLerper(QQuickWindow *window, const QPointingDevice *pointingDevice) + : mWindow(window) + , mPointingDevice(pointingDevice) +{ +} + +/*! + \internal + + Moves from the last pos (or {0, 0} if there have been no calls + to this function yet) to \a pos using linear interpolation + over 10 (default value) steps with 1 ms (default value) delays + between each step. +*/ +void QQuickVisualTestUtils::PointLerper::move(const QPoint &pos, int steps, int delayInMilliseconds) +{ + forEachStep(steps, [&](qreal progress) { + QQuickTest::pointerMove(mPointingDevice, mWindow, 0, lerpPoints(mFrom, pos, progress)); + QTest::qWait(delayInMilliseconds); + }); + mFrom = pos; +}; + +void QQuickVisualTestUtils::PointLerper::move(int x, int y, int steps, int delayInMilliseconds) +{ + move(QPoint(x, y), steps, delayInMilliseconds); +}; + +/*! + \internal + + Returns \c true if \c {item->isVisible()} returns \c true, and + the item is not culled. +*/ +bool QQuickVisualTestUtils::isDelegateVisible(QQuickItem *item) { return item->isVisible() && !QQuickItemPrivate::get(item)->culled; } @@ -111,6 +170,7 @@ bool QQuickVisualTestUtils::compareImages(const QImage &ia, const QImage &ib, QS return true; } +#if QT_CONFIG(quick_itemview) /*! \internal @@ -139,6 +199,7 @@ QQuickItem *QQuickVisualTestUtils::findViewDelegateItem(QQuickItemView *itemView return itemView->itemAtIndex(index); } +#endif QQuickVisualTestUtils::QQuickApplicationHelper::QQuickApplicationHelper(QQmlDataTest *testCase, const QString &testFilePath, const QVariantMap &initialProperties, const QStringList &qmlImportPaths) @@ -198,6 +259,21 @@ void QQuickVisualTestUtils::MnemonicKeySimulator::click(Qt::Key key) release(key); } +QPoint QQuickVisualTestUtils::mapCenterToWindow(const QQuickItem *item) +{ + return item->mapToScene(QPointF(item->width() / 2, item->height() / 2)).toPoint(); +} + +QPoint QQuickVisualTestUtils::mapToWindow(const QQuickItem *item, qreal relativeX, qreal relativeY) +{ + return item->mapToScene(QPointF(relativeX, relativeY)).toPoint(); +} + +QPoint QQuickVisualTestUtils::mapToWindow(const QQuickItem *item, const QPointF &relativePos) +{ + return mapToWindow(item, relativePos.x(), relativePos.y()); +} + QT_END_NAMESPACE #include "moc_visualtestutils_p.cpp" |