diff options
author | Jeremy Katz <jeremy@panix.com> | 2016-08-10 21:41:19 -0700 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2016-12-06 15:41:55 +0000 |
commit | 485e9fdf486446fb13012debe10137739b96d8ca (patch) | |
tree | 3ce5cc917264fef78ba49d7ded7fbf41e8385928 /src/qmltest | |
parent | ab54d0cab57121055914ff9a750f5ad975fe7525 (diff) |
Add touch event support to qmltest
[ChangeLog][QuickTest] Add support for simulating touch events
from TestCase.
Task-number: QTBUG-23083
Change-Id: Ic045e00a91b8270b6f08d398323e06b576615e79
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/qmltest')
-rw-r--r-- | src/qmltest/qmltest.pro | 2 | ||||
-rw-r--r-- | src/qmltest/quicktestevent.cpp | 93 | ||||
-rw-r--r-- | src/qmltest/quicktestevent_p.h | 24 |
3 files changed, 118 insertions, 1 deletions
diff --git a/src/qmltest/qmltest.pro b/src/qmltest/qmltest.pro index 9852861334..d13e162ff4 100644 --- a/src/qmltest/qmltest.pro +++ b/src/qmltest/qmltest.pro @@ -2,7 +2,7 @@ TARGET = QtQuickTest DEFINES += QT_NO_URL_CAST_FROM_STRING QT_NO_FOREACH QT = core testlib-private -QT_PRIVATE = quick qml-private gui core-private +QT_PRIVATE = quick qml-private gui core-private gui-private # Testlib is only a private dependency, which results in our users not # inheriting testlibs's MODULE_CONFIG transitively. Make it explicit. diff --git a/src/qmltest/quicktestevent.cpp b/src/qmltest/quicktestevent.cpp index 26f0521cdf..4b8ade761f 100644 --- a/src/qmltest/quicktestevent.cpp +++ b/src/qmltest/quicktestevent.cpp @@ -42,6 +42,7 @@ #include <QtQml/qqml.h> #include <QtQuick/qquickitem.h> #include <QtQuick/qquickwindow.h> +#include <qpa/qwindowsysteminterface.h> QT_BEGIN_NAMESPACE @@ -347,4 +348,96 @@ QWindow *QuickTestEvent::activeWindow() return eventWindow(); } +QQuickTouchEventSequence::QQuickTouchEventSequence(QuickTestEvent *testEvent, QObject *item) + : QObject(testEvent) + , m_sequence(QTest::touchEvent(testEvent->eventWindow(item), testEvent->touchDevice())) + , m_testEvent(testEvent) +{ +} + +QObject *QQuickTouchEventSequence::press(int touchId, QObject *item, qreal x, qreal y) +{ + QWindow *view = m_testEvent->eventWindow(item); + if (view) { + QPointF pos(x, y); + QQuickItem *quickItem = qobject_cast<QQuickItem *>(item); + if (quickItem) { + pos = quickItem->mapToScene(pos); + } + m_sequence.press(touchId, pos.toPoint(), view); + } + return this; +} + +QObject *QQuickTouchEventSequence::move(int touchId, QObject *item, qreal x, qreal y) +{ + QWindow *view = m_testEvent->eventWindow(item); + if (view) { + QPointF pos(x, y); + QQuickItem *quickItem = qobject_cast<QQuickItem *>(item); + if (quickItem) { + pos = quickItem->mapToScene(pos); + } + m_sequence.move(touchId, pos.toPoint(), view); + } + return this; +} + +QObject *QQuickTouchEventSequence::release(int touchId, QObject *item, qreal x, qreal y) +{ + QWindow *view = m_testEvent->eventWindow(item); + if (view) { + QPointF pos(x, y); + QQuickItem *quickItem = qobject_cast<QQuickItem *>(item); + if (quickItem) { + pos = quickItem->mapToScene(pos); + } + m_sequence.release(touchId, pos.toPoint(), view); + } + return this; +} + +QObject *QQuickTouchEventSequence::stationary(int touchId) +{ + m_sequence.stationary(touchId); + return this; +} + +QObject *QQuickTouchEventSequence::commit() +{ + m_sequence.commit(); + return this; +} + +/*! + Return a simulated touchscreen, creating one if necessary + + \internal +*/ + +QTouchDevice *QuickTestEvent::touchDevice() +{ + static QTouchDevice *device(nullptr); + + if (!device) { + device = new QTouchDevice; + device->setType(QTouchDevice::TouchScreen); + QWindowSystemInterface::registerTouchDevice(device); + } + return device; +} + +/*! + Creates a new QQuickTouchEventSequence. + + If valid, \a item determines the QWindow that touch events are sent to. + Test code should use touchEvent() from the QML TestCase type. + + \internal +*/ +QQuickTouchEventSequence *QuickTestEvent::touchEvent(QObject *item) +{ + return new QQuickTouchEventSequence(this, item); +} + QT_END_NAMESPACE diff --git a/src/qmltest/quicktestevent_p.h b/src/qmltest/quicktestevent_p.h index 1adf8f3317..c37d03ad0f 100644 --- a/src/qmltest/quicktestevent_p.h +++ b/src/qmltest/quicktestevent_p.h @@ -54,8 +54,28 @@ #include <QtQuickTest/quicktestglobal.h> #include <QtCore/qobject.h> #include <QtGui/QWindow> +#include <QtTest/qtesttouch.h> + QT_BEGIN_NAMESPACE +class QuickTestEvent; +class Q_QUICK_TEST_EXPORT QQuickTouchEventSequence : public QObject +{ + Q_OBJECT +public: + explicit QQuickTouchEventSequence(QuickTestEvent *testEvent, QObject *item = nullptr); +public slots: + QObject* press(int touchId, QObject *item, qreal x, qreal y); + QObject* move(int touchId, QObject *item, qreal x, qreal y); + QObject* release(int touchId, QObject *item, qreal x, qreal y); + QObject* stationary(int touchId); + QObject* commit(); + +private: + QTest::QTouchEventSequence m_sequence; + QuickTestEvent * const m_testEvent; +}; + class Q_QUICK_TEST_EXPORT QuickTestEvent : public QObject { Q_OBJECT @@ -91,9 +111,13 @@ public Q_SLOTS: int modifiers, int xDelta, int yDelta, int delay); #endif + QQuickTouchEventSequence *touchEvent(QObject *item = nullptr); private: QWindow *eventWindow(QObject *item = 0); QWindow *activeWindow(); + QTouchDevice *touchDevice(); + + friend class QQuickTouchEventSequence; }; QT_END_NAMESPACE |