Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add QQuickWindow synthMouseFromTouch test
Similar to the one for QQuickWidget, it tests the effect of
AA_SynthesizeMouseForUnhandledTouchEvents and verifies the
source() of the synthesized mouse event.

Change-Id: Ib706b5cc7b9a374850f3197ca6ce2c3aed4d1ba2
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
  • Loading branch information
ec1oud committed Feb 3, 2018
1 parent b483144 commit c2bd33a
Showing 1 changed file with 107 additions and 0 deletions.
107 changes: 107 additions & 0 deletions tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
Expand Up @@ -47,6 +47,8 @@
#include <QOpenGLFunctions>
#include <QSGRendererInterface>

Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")

struct TouchEventData {
QEvent::Type type;
QWidget *widget;
Expand Down Expand Up @@ -271,6 +273,70 @@ Q_OBJECT
}
};

class MouseRecordingWindow : public QQuickWindow
{
public:
explicit MouseRecordingWindow(QWindow *parent = nullptr) : QQuickWindow(parent) { }

protected:
void mousePressEvent(QMouseEvent *event) override {
qCDebug(lcTests) << event;
m_mouseEvents << *event;
QQuickWindow::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent *event) override {
qCDebug(lcTests) << event;
m_mouseEvents << *event;
QQuickWindow::mouseMoveEvent(event);
}
void mouseReleaseEvent(QMouseEvent *event) override {
qCDebug(lcTests) << event;
m_mouseEvents << *event;
QQuickWindow::mouseReleaseEvent(event);
}

public:
QList<QMouseEvent> m_mouseEvents;
};

class MouseRecordingItem : public QQuickItem
{
public:
MouseRecordingItem(bool acceptTouch, QQuickItem *parent = nullptr)
: QQuickItem(parent)
, m_acceptTouch(acceptTouch)
{
setSize(QSizeF(300, 300));
setAcceptedMouseButtons(Qt::LeftButton);
}

protected:
void touchEvent(QTouchEvent* event) override {
event->setAccepted(m_acceptTouch);
m_touchEvents << *event;
qCDebug(lcTests) << "accepted?" << event->isAccepted() << event;
}
void mousePressEvent(QMouseEvent *event) override {
qCDebug(lcTests) << event;
m_mouseEvents << *event;
}
void mouseMoveEvent(QMouseEvent *event) override {
qCDebug(lcTests) << event;
m_mouseEvents << *event;
}
void mouseReleaseEvent(QMouseEvent *event) override {
qCDebug(lcTests) << event;
m_mouseEvents << *event;
}

public:
QList<QMouseEvent> m_mouseEvents;
QList<QTouchEvent> m_touchEvents;

private:
bool m_acceptTouch;
};

class tst_qquickwindow : public QQmlDataTest
{
Q_OBJECT
Expand Down Expand Up @@ -308,6 +374,8 @@ private slots:
void mergeTouchPointLists();

void mouseFromTouch_basic();
void synthMouseFromTouch_data();
void synthMouseFromTouch();

void clearWindow();

Expand Down Expand Up @@ -1074,6 +1142,45 @@ void tst_qquickwindow::mouseFromTouch_basic()
delete item;
}

void tst_qquickwindow::synthMouseFromTouch_data()
{
QTest::addColumn<bool>("synthMouse"); // AA_SynthesizeMouseForUnhandledTouchEvents
QTest::addColumn<bool>("acceptTouch"); // QQuickItem::touchEvent: setAccepted()

QTest::newRow("no synth, accept") << false << true; // suitable for touch-capable UIs
QTest::newRow("no synth, don't accept") << false << false;
QTest::newRow("synth and accept") << true << true;
QTest::newRow("synth, don't accept") << true << false; // the default
}

void tst_qquickwindow::synthMouseFromTouch()
{
QFETCH(bool, synthMouse);
QFETCH(bool, acceptTouch);

QCoreApplication::setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, synthMouse);
QScopedPointer<MouseRecordingWindow> window(new MouseRecordingWindow);
QScopedPointer<MouseRecordingItem> item(new MouseRecordingItem(acceptTouch, nullptr));
item->setParentItem(window->contentItem());
window->resize(250, 250);
window->setPosition(100, 100);
window->setTitle(QTest::currentTestFunction());
window->show();
QVERIFY(QTest::qWaitForWindowActive(window.data()));

QPoint p1 = QPoint(20, 20);
QPoint p2 = QPoint(30, 30);
QTest::touchEvent(window.data(), touchDevice).press(0, p1, window.data());
QTest::touchEvent(window.data(), touchDevice).move(0, p2, window.data());
QTest::touchEvent(window.data(), touchDevice).release(0, p2, window.data());

QCOMPARE(item->m_touchEvents.count(), 3);
QCOMPARE(item->m_mouseEvents.count(), acceptTouch ? 0 : 3);
QCOMPARE(window->m_mouseEvents.count(), 0);
for (const QMouseEvent &ev : item->m_mouseEvents)
QCOMPARE(ev.source(), Qt::MouseEventSynthesizedByQt);
}

void tst_qquickwindow::clearWindow()
{
QQuickWindow *window = new QQuickWindow;
Expand Down

0 comments on commit c2bd33a

Please sign in to comment.