/*
* Copyright (C) 2014-2015 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "GestureTest.h"
#include
class tst_TouchDispatcher : public GestureTest
{
Q_OBJECT
public:
tst_TouchDispatcher();
private Q_SLOTS:
void sendMouseEventIfTouchIgnored_data();
void sendMouseEventIfTouchIgnored();
void mouseDoubleClick_data();
void mouseDoubleClick();
};
tst_TouchDispatcher::tst_TouchDispatcher()
: GestureTest(QStringLiteral("empty.qml"))
{
}
void tst_TouchDispatcher::sendMouseEventIfTouchIgnored_data()
{
QTest::addColumn("itemAcceptsTouch");
QTest::addColumn("acceptedMouseButtons");
QTest::addColumn("shouldGetMousePress");
QTest::newRow("accepts touch and doesn't accept mouse buttons") << true << (int)Qt::NoButton << false;
QTest::newRow("ignores touch and accepts mouse buttons") << false << (int)Qt::LeftButton << true;
QTest::newRow("ignores touch and doesn't accept mouse buttons") << false << (int)Qt::NoButton << false;
}
void tst_TouchDispatcher::sendMouseEventIfTouchIgnored()
{
QFETCH(bool, itemAcceptsTouch);
QFETCH(int, acceptedMouseButtons);
QFETCH(bool, shouldGetMousePress);
DummyItem *dummyItem = new DummyItem(m_view->rootObject());
TouchDispatcher touchDispatcher;
touchDispatcher.setTargetItem(dummyItem);
QList touchPoints;
QTouchEvent::TouchPoint touchPoint;
touchPoint.setId(0);
touchPoint.setState(Qt::TouchPointPressed);
touchPoints.append(touchPoint);
bool gotTouchEvent = false;
bool gotMousePressEvent = false;
dummyItem->setAcceptedMouseButtons((Qt::MouseButtons)acceptedMouseButtons);
dummyItem->touchEventHandler = [&](QTouchEvent *event) {
gotTouchEvent = true;
event->setAccepted(itemAcceptsTouch);
};
dummyItem->mousePressEventHandler = [&](QMouseEvent *event) {
gotMousePressEvent = true;
event->accept();
};
touchDispatcher.dispatch(m_device, Qt::NoModifier, touchPoints, m_view, 12345 /* timestamp */);
QVERIFY(gotTouchEvent);
QCOMPARE(gotMousePressEvent, shouldGetMousePress);
}
void tst_TouchDispatcher::mouseDoubleClick_data()
{
QTest::addColumn("timeBetweenClicks");
QTest::addColumn("shouldSendDoubleClick");
QTest::newRow("double click") << static_cast(qApp->styleHints()->mouseDoubleClickInterval() / 10) << true;
QTest::newRow("two separate clicks") << static_cast(qApp->styleHints()->mouseDoubleClickInterval() * 2) << false;
}
void tst_TouchDispatcher::mouseDoubleClick()
{
QFETCH(ulong, timeBetweenClicks);
QFETCH(bool, shouldSendDoubleClick);
DummyItem *dummyItem = new DummyItem(m_view->rootObject());
dummyItem->setAcceptedMouseButtons(Qt::LeftButton);
TouchDispatcher touchDispatcher;
touchDispatcher.setTargetItem(dummyItem);
bool gotDoubleClickEvent = false;
dummyItem->mouseDoubleClickEventHandler = [&](QMouseEvent *event) {
gotDoubleClickEvent = true;
event->accept();
};
dummyItem->touchEventHandler = [&](QTouchEvent *event) {
event->ignore();
};
ulong doubleClickInterval = static_cast(qApp->styleHints()->mouseDoubleClickInterval());
QList touchPoints;
{
QTouchEvent::TouchPoint touchPoint;
touchPoint.setId(0);
touchPoint.setState(Qt::TouchPointPressed);
touchPoints.append(touchPoint);
}
ulong timestamp = 12345;
touchDispatcher.dispatch(m_device, Qt::NoModifier, touchPoints, m_view, timestamp);
touchPoints[0].setState(Qt::TouchPointReleased);
timestamp += doubleClickInterval / 10;
touchDispatcher.dispatch(m_device, Qt::NoModifier, touchPoints, m_view, timestamp);
touchPoints[0].setId(1);
touchPoints[0].setState(Qt::TouchPointPressed);
timestamp += timeBetweenClicks;
touchDispatcher.dispatch(m_device, Qt::NoModifier, touchPoints, m_view, timestamp);
QCOMPARE(gotDoubleClickEvent, shouldSendDoubleClick);
}
QTEST_MAIN(tst_TouchDispatcher)
#include "tst_TouchDispatcher.moc"