2012-06-26 16:00:59 +00:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
2016-01-19 11:23:05 +00:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2012-06-26 16:00:59 +00:00
|
|
|
**
|
|
|
|
** This file is part of the QtQml module of the Qt Toolkit.
|
|
|
|
**
|
2016-01-19 11:23:05 +00:00
|
|
|
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
2012-09-20 05:21:40 +00:00
|
|
|
** Commercial License Usage
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2015-01-28 11:55:39 +00:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
2016-01-19 11:23:05 +00:00
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2012-09-20 05:21:40 +00:00
|
|
|
**
|
2016-01-19 11:23:05 +00:00
|
|
|
** GNU General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2012-06-26 16:00:59 +00:00
|
|
|
**
|
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include <QtTest/QtTest>
|
2018-10-02 07:34:05 +00:00
|
|
|
#include <QDebug>
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
#include <QtGui/qstylehints.h>
|
2017-05-11 11:47:58 +00:00
|
|
|
#include <private/qdebug_p.h>
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
#include <QtQuick/qquickview.h>
|
|
|
|
#include <QtQuick/qquickitem.h>
|
2016-07-24 21:15:31 +00:00
|
|
|
#include <QtQuick/private/qquickevents_p_p.h>
|
2012-06-26 16:00:59 +00:00
|
|
|
#include <QtQuick/private/qquickmousearea_p.h>
|
|
|
|
#include <QtQuick/private/qquickmultipointtoucharea_p.h>
|
|
|
|
#include <QtQuick/private/qquickpincharea_p.h>
|
|
|
|
#include <QtQuick/private/qquickflickable_p.h>
|
2016-07-24 21:15:31 +00:00
|
|
|
#include <QtQuick/private/qquickwindow_p.h>
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
#include <QtQml/qqmlengine.h>
|
|
|
|
#include <QtQml/qqmlproperty.h>
|
|
|
|
|
|
|
|
#include "../../shared/util.h"
|
2014-04-03 11:16:42 +00:00
|
|
|
#include "../shared/viewtestutil.h"
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2018-10-02 07:34:05 +00:00
|
|
|
Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
struct Event
|
|
|
|
{
|
|
|
|
Event(QEvent::Type t, QPoint mouse, QPoint global)
|
|
|
|
:type(t), mousePos(mouse), mousePosGlobal(global)
|
|
|
|
{}
|
|
|
|
|
2020-07-13 11:40:04 +00:00
|
|
|
Event(QEvent::Type t, QList<QEventPoint> touch)
|
2012-06-26 16:00:59 +00:00
|
|
|
:type(t), points(touch)
|
|
|
|
{}
|
|
|
|
|
|
|
|
QEvent::Type type;
|
|
|
|
QPoint mousePos;
|
|
|
|
QPoint mousePosGlobal;
|
2020-07-13 11:40:04 +00:00
|
|
|
QList<QEventPoint> points;
|
2012-06-26 16:00:59 +00:00
|
|
|
};
|
|
|
|
|
2017-05-11 11:47:58 +00:00
|
|
|
#ifndef QT_NO_DEBUG_STREAM
|
|
|
|
QDebug operator<<(QDebug dbg, const struct Event &event) {
|
|
|
|
QDebugStateSaver saver(dbg);
|
|
|
|
dbg.nospace();
|
|
|
|
dbg << "Event(";
|
|
|
|
QtDebugUtils::formatQEnum(dbg, event.type);
|
|
|
|
if (event.points.isEmpty())
|
|
|
|
dbg << " @ " << event.mousePos << " global " << event.mousePosGlobal;
|
|
|
|
else
|
|
|
|
dbg << ", " << event.points.count() << " touchpoints: " << event.points;
|
|
|
|
dbg << ')';
|
|
|
|
return dbg;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
class EventItem : public QQuickItem
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
2016-08-01 12:13:20 +00:00
|
|
|
|
|
|
|
Q_SIGNALS:
|
|
|
|
void onTouchEvent(QQuickItem *receiver);
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
public:
|
2018-02-21 09:41:54 +00:00
|
|
|
EventItem(QQuickItem *parent = nullptr)
|
2018-02-21 10:52:59 +00:00
|
|
|
: QQuickItem(parent)
|
2016-07-31 19:27:58 +00:00
|
|
|
{
|
|
|
|
setAcceptedMouseButtons(Qt::LeftButton);
|
2017-05-02 09:34:19 +00:00
|
|
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
2017-04-05 09:21:29 +00:00
|
|
|
setAcceptTouchEvents(true);
|
2017-05-02 09:34:19 +00:00
|
|
|
#endif
|
2016-07-31 19:27:58 +00:00
|
|
|
}
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
void touchEvent(QTouchEvent *event)
|
|
|
|
{
|
|
|
|
eventList.append(Event(event->type(), event->touchPoints()));
|
2020-07-13 11:40:04 +00:00
|
|
|
QList<QEventPoint> tps = event->touchPoints();
|
2016-10-12 08:50:22 +00:00
|
|
|
Q_ASSERT(!tps.isEmpty());
|
|
|
|
point0 = tps.first().id();
|
2012-06-26 16:00:59 +00:00
|
|
|
event->setAccepted(acceptTouch);
|
2016-08-01 12:13:20 +00:00
|
|
|
emit onTouchEvent(this);
|
2012-06-26 16:00:59 +00:00
|
|
|
}
|
|
|
|
void mousePressEvent(QMouseEvent *event)
|
|
|
|
{
|
2020-06-08 07:21:58 +00:00
|
|
|
eventList.append(Event(event->type(), event->position().toPoint(), event->globalPosition().toPoint()));
|
2012-06-26 16:00:59 +00:00
|
|
|
event->setAccepted(acceptMouse);
|
|
|
|
}
|
|
|
|
void mouseMoveEvent(QMouseEvent *event)
|
|
|
|
{
|
2020-06-08 07:21:58 +00:00
|
|
|
eventList.append(Event(event->type(), event->position().toPoint(), event->globalPosition().toPoint()));
|
2012-06-26 16:00:59 +00:00
|
|
|
event->setAccepted(acceptMouse);
|
|
|
|
}
|
|
|
|
void mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
{
|
2020-06-08 07:21:58 +00:00
|
|
|
eventList.append(Event(event->type(), event->position().toPoint(), event->globalPosition().toPoint()));
|
2012-06-26 16:00:59 +00:00
|
|
|
event->setAccepted(acceptMouse);
|
|
|
|
}
|
|
|
|
void mouseDoubleClickEvent(QMouseEvent *event)
|
|
|
|
{
|
2020-06-08 07:21:58 +00:00
|
|
|
eventList.append(Event(event->type(), event->position().toPoint(), event->globalPosition().toPoint()));
|
2012-06-26 16:00:59 +00:00
|
|
|
event->setAccepted(acceptMouse);
|
|
|
|
}
|
2014-10-10 19:54:39 +00:00
|
|
|
|
|
|
|
void mouseUngrabEvent()
|
|
|
|
{
|
|
|
|
eventList.append(Event(QEvent::UngrabMouse, QPoint(0,0), QPoint(0,0)));
|
|
|
|
}
|
|
|
|
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
void touchUngrabEvent()
|
|
|
|
{
|
|
|
|
++touchUngrabCount;
|
|
|
|
}
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
bool event(QEvent *event) {
|
|
|
|
return QQuickItem::event(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<Event> eventList;
|
2018-02-21 10:52:59 +00:00
|
|
|
int touchUngrabCount = 0;
|
|
|
|
bool acceptMouse = false;
|
|
|
|
bool acceptTouch = false;
|
|
|
|
bool filterTouch = false; // when used as event filter
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
bool eventFilter(QObject *, QEvent *event)
|
|
|
|
{
|
|
|
|
if (event->type() == QEvent::TouchBegin ||
|
|
|
|
event->type() == QEvent::TouchUpdate ||
|
|
|
|
event->type() == QEvent::TouchCancel ||
|
|
|
|
event->type() == QEvent::TouchEnd) {
|
|
|
|
QTouchEvent *touch = static_cast<QTouchEvent*>(event);
|
|
|
|
eventList.append(Event(event->type(), touch->touchPoints()));
|
2020-07-13 11:40:04 +00:00
|
|
|
QList<QEventPoint> tps = touch->touchPoints();
|
2016-10-12 08:50:22 +00:00
|
|
|
Q_ASSERT(!tps.isEmpty());
|
|
|
|
point0 = tps.first().id();
|
2012-06-26 16:00:59 +00:00
|
|
|
if (filterTouch)
|
|
|
|
event->accept();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2018-02-21 10:52:59 +00:00
|
|
|
int point0 = -1;
|
2012-06-26 16:00:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class tst_TouchMouse : public QQmlDataTest
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
tst_TouchMouse()
|
|
|
|
{}
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void initTestCase();
|
|
|
|
|
2018-01-31 11:54:40 +00:00
|
|
|
void simpleTouchEvent_data();
|
2012-06-26 16:00:59 +00:00
|
|
|
void simpleTouchEvent();
|
2013-03-07 11:08:48 +00:00
|
|
|
void testEventFilter();
|
2012-06-26 16:00:59 +00:00
|
|
|
void mouse();
|
|
|
|
void touchOverMouse();
|
|
|
|
void mouseOverTouch();
|
|
|
|
|
|
|
|
void buttonOnFlickable();
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
void touchButtonOnFlickable();
|
2016-10-03 15:04:00 +00:00
|
|
|
void buttonOnDelayedPressFlickable_data();
|
2013-11-13 11:41:19 +00:00
|
|
|
void buttonOnDelayedPressFlickable();
|
2012-06-26 16:00:59 +00:00
|
|
|
void buttonOnTouch();
|
|
|
|
|
|
|
|
void pinchOnFlickable();
|
|
|
|
void flickableOnPinch();
|
|
|
|
void mouseOnFlickableOnPinch();
|
|
|
|
|
2012-12-19 17:29:49 +00:00
|
|
|
void tapOnDismissiveTopMouseAreaClicksBottomOne();
|
|
|
|
|
2014-10-10 19:54:39 +00:00
|
|
|
void touchGrabCausesMouseUngrab();
|
2016-08-01 12:13:20 +00:00
|
|
|
void touchPointDeliveryOrder();
|
2014-10-10 19:54:39 +00:00
|
|
|
|
2015-11-30 15:39:15 +00:00
|
|
|
void hoverEnabled();
|
2017-01-13 09:02:23 +00:00
|
|
|
void implicitUngrab();
|
2015-11-30 15:39:15 +00:00
|
|
|
|
2013-11-13 11:41:19 +00:00
|
|
|
protected:
|
|
|
|
bool eventFilter(QObject *, QEvent *event)
|
|
|
|
{
|
|
|
|
if (event->type() == QEvent::MouseButtonPress ||
|
|
|
|
event->type() == QEvent::MouseMove ||
|
|
|
|
event->type() == QEvent::MouseButtonRelease) {
|
|
|
|
QMouseEvent *me = static_cast<QMouseEvent*>(event);
|
2020-06-08 07:21:58 +00:00
|
|
|
filteredEventList.append(Event(me->type(), me->position().toPoint(), me->globalPosition().toPoint()));
|
2013-11-13 11:41:19 +00:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
private:
|
|
|
|
QQuickView *createView();
|
2020-03-26 15:50:40 +00:00
|
|
|
QPointingDevice *device = QTest::createTouchDevice();
|
2013-11-13 11:41:19 +00:00
|
|
|
QList<Event> filteredEventList;
|
2012-06-26 16:00:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
QQuickView *tst_TouchMouse::createView()
|
|
|
|
{
|
2018-02-21 09:41:54 +00:00
|
|
|
QQuickView *window = new QQuickView(nullptr);
|
2012-07-11 07:32:16 +00:00
|
|
|
return window;
|
2012-06-26 16:00:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::initTestCase()
|
|
|
|
{
|
|
|
|
QQmlDataTest::initTestCase();
|
|
|
|
qmlRegisterType<EventItem>("Qt.test", 1, 0, "EventItem");
|
|
|
|
}
|
|
|
|
|
2018-01-31 11:54:40 +00:00
|
|
|
void tst_TouchMouse::simpleTouchEvent_data()
|
|
|
|
{
|
|
|
|
QTest::addColumn<bool>("synthMouse"); // AA_SynthesizeMouseForUnhandledTouchEvents
|
|
|
|
QTest::newRow("no synth") << false;
|
|
|
|
QTest::newRow("synth") << true;
|
|
|
|
}
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
void tst_TouchMouse::simpleTouchEvent()
|
|
|
|
{
|
2018-01-31 11:54:40 +00:00
|
|
|
QFETCH(bool, synthMouse);
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, synthMouse);
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("singleitem.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem1);
|
|
|
|
|
|
|
|
// Do not accept touch or mouse
|
|
|
|
QPoint p1;
|
|
|
|
p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2016-07-31 19:27:58 +00:00
|
|
|
// Get a touch and then mouse event offered
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2016-07-31 19:27:58 +00:00
|
|
|
// Not accepted, no updates
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2012-06-26 16:00:59 +00:00
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// Accept touch
|
|
|
|
eventItem1->acceptTouch = true;
|
|
|
|
p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 1);
|
|
|
|
p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 2);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 3);
|
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// Accept mouse
|
|
|
|
eventItem1->acceptTouch = false;
|
|
|
|
eventItem1->acceptMouse = true;
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
2018-01-31 11:54:40 +00:00
|
|
|
if (synthMouse)
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(window->mouseGrabberItem(), synthMouse ? eventItem1 : nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
QPoint localPos = eventItem1->mapFromScene(p1).toPoint();
|
2012-07-11 07:32:16 +00:00
|
|
|
QPoint globalPos = window->mapToGlobal(p1);
|
2012-06-26 16:00:59 +00:00
|
|
|
QPoint scenePos = p1; // item is at 0,0
|
2020-06-08 07:21:58 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).points.at(0).position().toPoint(), localPos);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).points.at(0).scenePosition().toPoint(), scenePos);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).points.at(0).globalPosition().toPoint(), globalPos);
|
2018-01-31 11:54:40 +00:00
|
|
|
if (synthMouse) {
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).mousePos, localPos);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).mousePosGlobal, globalPos);
|
|
|
|
}
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 4 : 1);
|
|
|
|
if (synthMouse) {
|
|
|
|
QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchUpdate);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseMove);
|
|
|
|
}
|
|
|
|
// else, if there was no synth-mouse and we didn't accept the touch,
|
|
|
|
// TouchUpdate was not sent to eventItem1 either.
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 7 : 1);
|
|
|
|
if (synthMouse) {
|
|
|
|
QCOMPARE(eventItem1->eventList.at(4).type, QEvent::TouchEnd);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(5).type, QEvent::MouseButtonRelease);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(6).type, QEvent::UngrabMouse);
|
|
|
|
}
|
|
|
|
// else, if there was no synth-mouse and we didn't accept the touch,
|
|
|
|
// TouchEnd was not sent to eventItem1 either.
|
2012-06-26 16:00:59 +00:00
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// Accept mouse buttons but not the event
|
|
|
|
eventItem1->acceptTouch = false;
|
|
|
|
eventItem1->acceptMouse = false;
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
2018-01-31 11:54:40 +00:00
|
|
|
if (synthMouse)
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-01-31 11:54:40 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), synthMouse ? 2 : 1);
|
2012-06-26 16:00:59 +00:00
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// Accept touch and mouse
|
|
|
|
eventItem1->acceptTouch = true;
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 1);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 2);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::TouchUpdate);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 3);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd);
|
|
|
|
eventItem1->eventList.clear();
|
|
|
|
}
|
|
|
|
|
2013-03-07 11:08:48 +00:00
|
|
|
void tst_TouchMouse::testEventFilter()
|
2012-06-26 16:00:59 +00:00
|
|
|
{
|
|
|
|
// // install event filter on item and see that it can grab events
|
2017-01-11 15:40:28 +00:00
|
|
|
// QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
// window->setSource(testFileUrl("singleitem.qml"));
|
|
|
|
// window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
// QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
// QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2012-07-11 07:32:16 +00:00
|
|
|
// QVERIFY(window->rootObject() != 0);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
// EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
// QVERIFY(eventItem1);
|
|
|
|
// eventItem1->acceptTouch = true;
|
|
|
|
|
|
|
|
// EventItem *filter = new EventItem;
|
|
|
|
// filter->filterTouch = true;
|
|
|
|
// eventItem1->installEventFilter(filter);
|
|
|
|
|
|
|
|
// QPoint p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
// QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// // QEXPECT_FAIL("", "We do not implement event filters correctly", Abort);
|
|
|
|
// QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
// QCOMPARE(filter->eventList.size(), 1);
|
2017-01-11 15:40:28 +00:00
|
|
|
// QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
// QCOMPARE(filter->eventList.size(), 2);
|
|
|
|
|
|
|
|
// delete filter;
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::mouse()
|
|
|
|
{
|
|
|
|
// eventItem1
|
|
|
|
// - eventItem2
|
|
|
|
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("twoitems.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem1);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem2);
|
|
|
|
|
|
|
|
// bottom item likes mouse, top likes touch
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
eventItem1->acceptMouse = true;
|
|
|
|
// item 2 doesn't accept anything, thus it sees a touch pass by
|
|
|
|
QPoint p1 = QPoint(30, 30);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
QCOMPARE(eventItem1->eventList.size(), 2);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::touchOverMouse()
|
|
|
|
{
|
|
|
|
// eventItem1
|
|
|
|
// - eventItem2
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("twoitems.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem1);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem2);
|
|
|
|
|
|
|
|
// bottom item likes mouse, top likes touch
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
eventItem2->acceptTouch = true;
|
|
|
|
|
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
QPoint p1 = QPoint(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 1);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem2->eventList.size(), 2);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchUpdate);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem2->eventList.size(), 3);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(2).type, QEvent::TouchEnd);
|
|
|
|
eventItem2->eventList.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::mouseOverTouch()
|
|
|
|
{
|
|
|
|
// eventItem1
|
|
|
|
// - eventItem2
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("twoitems.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem1);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem2);
|
|
|
|
|
|
|
|
// bottom item likes mouse, top likes touch
|
|
|
|
eventItem1->acceptTouch = true;
|
|
|
|
eventItem2->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
eventItem2->acceptMouse = true;
|
|
|
|
|
|
|
|
QPoint p1 = QPoint(20, 20);
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 2);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
|
|
|
|
|
|
|
|
// p1 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
// QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QCOMPARE(eventItem2->eventList.size(), 1);
|
2017-01-11 15:40:28 +00:00
|
|
|
// QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QCOMPARE(eventItem2->eventList.size(), 1);
|
|
|
|
// eventItem2->eventList.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::buttonOnFlickable()
|
|
|
|
{
|
|
|
|
// flickable - height 500 / 1000
|
|
|
|
// - eventItem1 y: 100, height 100
|
|
|
|
// - eventItem2 y: 300, height 100
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("buttononflickable.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(flickable);
|
|
|
|
|
|
|
|
// should a mouse area button be clickable on top of flickable? yes :)
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem1);
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
eventItem1->acceptMouse = true;
|
|
|
|
|
|
|
|
// should a touch button be touchable on top of flickable? yes :)
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem2);
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 0);
|
|
|
|
eventItem2->acceptTouch = true;
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// check that buttons are clickable
|
|
|
|
// mouse button
|
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
QPoint p1 = QPoint(20, 130);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2013-11-13 11:41:19 +00:00
|
|
|
QTRY_COMPARE(eventItem1->eventList.size(), 2);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 5);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease);
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(4).type, QEvent::UngrabMouse);
|
2012-06-26 16:00:59 +00:00
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// touch button
|
|
|
|
p1 = QPoint(10, 310);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem2->eventList.size(), 1);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem2->eventList.size(), 2);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchEnd);
|
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
eventItem2->eventList.clear();
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// click above button, no events please
|
|
|
|
p1 = QPoint(10, 90);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// check that flickable moves - mouse button
|
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
p1 = QPoint(10, 110);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 2);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window.data());
|
2016-10-12 08:50:22 +00:00
|
|
|
QVERIFY(windowPriv->touchMouseId != -1);
|
2020-03-26 15:50:40 +00:00
|
|
|
auto pointerEvent = windowPriv->pointerEventInstance(device);
|
2017-02-13 14:18:43 +00:00
|
|
|
QCOMPARE(pointerEvent->point(0)->exclusiveGrabber(), eventItem1);
|
2016-07-07 23:16:11 +00:00
|
|
|
QCOMPARE(window->mouseGrabberItem(), eventItem1);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
int dragDelta = -qApp->styleHints()->startDragDistance();
|
|
|
|
p1 += QPoint(0, dragDelta);
|
|
|
|
QPoint p2 = p1 + QPoint(0, dragDelta);
|
|
|
|
QPoint p3 = p2 + QPoint(0, dragDelta);
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p2, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p3, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
// we cannot really know when the events get grabbed away
|
|
|
|
QVERIFY(eventItem1->eventList.size() >= 4);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchUpdate);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseMove);
|
|
|
|
|
2016-07-07 23:16:11 +00:00
|
|
|
QCOMPARE(window->mouseGrabberItem(), flickable);
|
2016-10-12 08:50:22 +00:00
|
|
|
QVERIFY(windowPriv->touchMouseId != -1);
|
2017-02-13 14:18:43 +00:00
|
|
|
QCOMPARE(pointerEvent->point(0)->exclusiveGrabber(), flickable);
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(flickable->isMovingVertically());
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p3, window.data());
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::touchButtonOnFlickable()
|
|
|
|
{
|
|
|
|
// flickable - height 500 / 1000
|
|
|
|
// - eventItem1 y: 100, height 100
|
|
|
|
// - eventItem2 y: 300, height 100
|
|
|
|
|
|
|
|
QScopedPointer<QQuickView> window(createView());
|
|
|
|
window->setSource(testFileUrl("buttononflickable.qml"));
|
|
|
|
window->show();
|
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
|
|
|
|
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
|
|
|
|
QVERIFY(flickable);
|
|
|
|
|
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
|
|
|
QVERIFY(eventItem2);
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 0);
|
|
|
|
eventItem2->acceptTouch = true;
|
|
|
|
|
|
|
|
// press via touch, then drag: check that flickable moves and that the button gets ungrabbed
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 0);
|
|
|
|
QPoint p1 = QPoint(10, 310);
|
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 1);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
|
|
|
|
QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window.data());
|
|
|
|
QVERIFY(windowPriv->touchMouseId == -1);
|
2020-03-26 15:50:40 +00:00
|
|
|
auto pointerEvent = windowPriv->pointerEventInstance(device);
|
2017-04-13 18:56:01 +00:00
|
|
|
QCOMPARE(pointerEvent->point(0)->grabberItem(), eventItem2);
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
QCOMPARE(window->mouseGrabberItem(), nullptr);
|
|
|
|
|
|
|
|
int dragDelta = qApp->styleHints()->startDragDistance() * -0.7;
|
|
|
|
p1 += QPoint(0, dragDelta);
|
|
|
|
QPoint p2 = p1 + QPoint(0, dragDelta);
|
|
|
|
QPoint p3 = p2 + QPoint(0, dragDelta);
|
|
|
|
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p2, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p3, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
|
2018-03-02 12:56:03 +00:00
|
|
|
QTRY_COMPARE(eventItem2->touchUngrabCount, 1);
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
QVERIFY(eventItem2->eventList.size() > 2);
|
|
|
|
QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchUpdate);
|
|
|
|
QCOMPARE(window->mouseGrabberItem(), flickable);
|
|
|
|
QVERIFY(windowPriv->touchMouseId != -1);
|
2017-04-13 18:56:01 +00:00
|
|
|
QCOMPARE(pointerEvent->point(0)->grabberItem(), flickable);
|
When stealing a touchpoint as synth. mouse, ungrab touch
If you use MultiPointTouchArea to make a button component, or if you
do something similar by subclassing QQuickItem and handling touch events,
and you place such a component inside a Flickable, when the user presses
on the button and then drags far enough that the Flickable steals the grab,
the MPTA or custom item did not receive the touchUngrabEvent() callback.
Now it does, so now the button will go back to released state as a result
of having the grab stolen.
The situation here is special in that it's the only place where a touch
event is transformed to be treated as mouse in the future, usually it's
either treated as touch or mouse from the start.
When this happens, it's not enough to call setMouseGrabber because that
doesn't send touch cancel to the previous grabber. Instead we need to
explicitly call touchUngrabEvent to notify the touch handling item.
The explicit setting of the grabber which was there previously is not
needed, since grabMouse will update the grab based on touchMouseId.
tst_QQuickMultiPointTouchArea::inFlickable2 was already testing the
pressed state of the touchpoint when the grab is stolen, but it was
changed in 468626e99a90d6ac21cb311cde05c658ccb3b781; now that can be
restored, and we can also un-blacklist inFlickable, which was deemed
unstable in 6d163779711d4601931ae0f82910794fb2498136
[ChangeLog][QtQuick] MultiPointTouchArea, and any custom Item, will now
properly receive touchUngrabEvent() when the touch grab is stolen by
a filtering parent Item, such as a Flickable.
Task-number: QTBUG-57910
Change-Id: I4e1b23ed099f01e7eca2e8a0e7ab4c652ef00cfa
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2017-01-05 15:16:43 +00:00
|
|
|
QVERIFY(flickable->isMovingVertically());
|
|
|
|
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p3, window.data());
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
}
|
|
|
|
|
2016-10-03 15:04:00 +00:00
|
|
|
void tst_TouchMouse::buttonOnDelayedPressFlickable_data()
|
|
|
|
{
|
|
|
|
QTest::addColumn<bool>("scrollBeforeDelayIsOver");
|
2018-10-02 07:34:05 +00:00
|
|
|
QTest::addColumn<bool>("releaseBeforeDelayIsOver");
|
2016-10-03 15:04:00 +00:00
|
|
|
|
|
|
|
// the item should never see the event,
|
|
|
|
// due to the pressDelay which never delivers if we start moving
|
2018-10-02 07:34:05 +00:00
|
|
|
QTest::newRow("scroll before press delay is over") << true << false;
|
|
|
|
|
|
|
|
// after release, the item should see the press and release via event replay (QTBUG-61144)
|
|
|
|
QTest::newRow("release before press delay is over") << false << true;
|
2016-10-03 15:04:00 +00:00
|
|
|
|
|
|
|
// wait until the "button" sees the press but then
|
|
|
|
// start moving: the button gets a press and cancel event
|
2018-10-02 07:34:05 +00:00
|
|
|
QTest::newRow("scroll after press delay is over") << false << false;
|
2016-10-03 15:04:00 +00:00
|
|
|
}
|
|
|
|
|
2013-11-13 11:41:19 +00:00
|
|
|
void tst_TouchMouse::buttonOnDelayedPressFlickable()
|
|
|
|
{
|
|
|
|
// flickable - height 500 / 1000
|
|
|
|
// - eventItem1 y: 100, height 100
|
|
|
|
// - eventItem2 y: 300, height 100
|
2016-10-03 15:04:00 +00:00
|
|
|
QFETCH(bool, scrollBeforeDelayIsOver);
|
2018-10-02 07:34:05 +00:00
|
|
|
QFETCH(bool, releaseBeforeDelayIsOver);
|
2013-11-13 11:41:19 +00:00
|
|
|
|
2020-09-15 10:55:05 +00:00
|
|
|
#ifdef Q_OS_MACOS
|
|
|
|
QSKIP("Deadlocks or crashes due to events changes in qtbase");
|
|
|
|
#endif
|
|
|
|
|
2013-11-13 11:41:19 +00:00
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, true);
|
|
|
|
filteredEventList.clear();
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2013-11-13 11:41:19 +00:00
|
|
|
window->setSource(testFileUrl("buttononflickable.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2013-11-13 11:41:19 +00:00
|
|
|
|
|
|
|
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
|
|
|
|
QVERIFY(flickable);
|
|
|
|
|
|
|
|
window->installEventFilter(this);
|
|
|
|
|
2016-10-03 15:04:00 +00:00
|
|
|
// wait 600 ms before letting the child see the press event
|
|
|
|
flickable->setPressDelay(600);
|
2013-11-13 11:41:19 +00:00
|
|
|
|
|
|
|
// should a mouse area button be clickable on top of flickable? yes :)
|
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
|
|
|
QVERIFY(eventItem1);
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
eventItem1->acceptMouse = true;
|
|
|
|
|
|
|
|
// should a touch button be touchable on top of flickable? yes :)
|
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
|
|
|
QVERIFY(eventItem2);
|
|
|
|
QCOMPARE(eventItem2->eventList.size(), 0);
|
|
|
|
eventItem2->acceptTouch = true;
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window.data());
|
2016-10-03 15:04:00 +00:00
|
|
|
QCOMPARE(windowPriv->touchMouseId, -1); // no grabber
|
2013-11-13 11:41:19 +00:00
|
|
|
|
2016-10-03 15:04:00 +00:00
|
|
|
// touch press
|
2013-11-13 11:41:19 +00:00
|
|
|
QPoint p1 = QPoint(10, 110);
|
2018-10-02 07:34:05 +00:00
|
|
|
QPoint pEnd = p1;
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2013-11-13 11:41:19 +00:00
|
|
|
|
2018-10-02 07:34:05 +00:00
|
|
|
if (scrollBeforeDelayIsOver || releaseBeforeDelayIsOver) {
|
|
|
|
// no events yet: press is delayed
|
2016-10-03 15:04:00 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
} else {
|
|
|
|
// wait until the button sees the press
|
|
|
|
QTRY_COMPARE(eventItem1->eventList.size(), 1);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(filteredEventList.count(), 1);
|
|
|
|
}
|
2013-11-13 11:41:19 +00:00
|
|
|
|
2018-10-02 07:34:05 +00:00
|
|
|
if (!releaseBeforeDelayIsOver) {
|
|
|
|
// move the touchpoint: try to flick
|
|
|
|
p1 += QPoint(0, -10);
|
|
|
|
QPoint p2 = p1 + QPoint(0, -10);
|
|
|
|
pEnd = p2 + QPoint(0, -10);
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, p2, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).move(0, pEnd, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTRY_VERIFY(flickable->isMovingVertically());
|
|
|
|
|
|
|
|
if (scrollBeforeDelayIsOver) {
|
|
|
|
QCOMPARE(eventItem1->eventList.size(), 0);
|
|
|
|
QCOMPARE(filteredEventList.count(), 0);
|
|
|
|
} else {
|
|
|
|
// see at least press, move and ungrab
|
|
|
|
QTRY_VERIFY(eventItem1->eventList.size() > 2);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(eventItem1->eventList.last().type, QEvent::UngrabMouse);
|
|
|
|
QCOMPARE(filteredEventList.count(), 1);
|
|
|
|
}
|
2016-10-03 15:04:00 +00:00
|
|
|
|
2018-10-02 07:34:05 +00:00
|
|
|
// flickable should have the mouse grab, and have moved the itemForTouchPointId
|
|
|
|
// for the touchMouseId to the new grabber.
|
|
|
|
QCOMPARE(window->mouseGrabberItem(), flickable);
|
|
|
|
QVERIFY(windowPriv->touchMouseId != -1);
|
2020-03-26 15:50:40 +00:00
|
|
|
auto pointerEvent = windowPriv->pointerEventInstance(device);
|
2018-10-02 07:34:05 +00:00
|
|
|
QCOMPARE(pointerEvent->point(0)->grabberItem(), flickable);
|
2016-10-03 15:04:00 +00:00
|
|
|
}
|
2013-11-13 11:41:19 +00:00
|
|
|
|
2018-10-02 07:34:05 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, pEnd, window.data());
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2013-11-13 11:41:19 +00:00
|
|
|
|
2018-10-02 07:34:05 +00:00
|
|
|
if (releaseBeforeDelayIsOver) {
|
|
|
|
// when the touchpoint was released, the child saw the delayed press and the release in sequence
|
|
|
|
qCDebug(lcTests) << "expected delivered events: press, release, ungrab" << eventItem1->eventList;
|
|
|
|
qCDebug(lcTests) << "expected filtered events: delayed press, release" << filteredEventList;
|
2020-07-15 18:33:36 +00:00
|
|
|
QSKIP("QTBUG-85607");
|
2018-10-02 07:34:05 +00:00
|
|
|
QTRY_COMPARE(eventItem1->eventList.size(), 3);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonRelease);
|
|
|
|
QCOMPARE(eventItem1->eventList.last().type, QEvent::UngrabMouse);
|
|
|
|
// QQuickWindow filters the delayed press and release
|
|
|
|
QCOMPARE(filteredEventList.count(), 2);
|
|
|
|
QCOMPARE(filteredEventList.at(0).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(filteredEventList.at(1).type, QEvent::MouseButtonRelease);
|
|
|
|
} else {
|
|
|
|
// QQuickWindow filters the delayed press if there was one; otherwise nothing
|
|
|
|
if (scrollBeforeDelayIsOver) {
|
|
|
|
QCOMPARE(filteredEventList.count(), 0);
|
|
|
|
} else {
|
|
|
|
qCDebug(lcTests) << "expected filtered event: delayed press" << filteredEventList;
|
|
|
|
QCOMPARE(filteredEventList.count(), 1);
|
|
|
|
QCOMPARE(filteredEventList.at(0).type, QEvent::MouseButtonPress);
|
|
|
|
}
|
|
|
|
}
|
2013-11-13 11:41:19 +00:00
|
|
|
}
|
|
|
|
|
2012-06-26 16:00:59 +00:00
|
|
|
void tst_TouchMouse::buttonOnTouch()
|
|
|
|
{
|
|
|
|
// 400x800
|
|
|
|
// PinchArea - height 400
|
|
|
|
// - eventItem1 y: 100, height 100
|
|
|
|
// - eventItem2 y: 300, height 100
|
|
|
|
// MultiPointTouchArea - height 400
|
|
|
|
// - eventItem1 y: 100, height 100
|
|
|
|
// - eventItem2 y: 300, height 100
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("buttonontouch.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickPinchArea *pinchArea = window->rootObject()->findChild<QQuickPinchArea*>("pincharea");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(pinchArea);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickItem *button1 = window->rootObject()->findChild<QQuickItem*>("button1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(button1);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem1);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem2 = window->rootObject()->findChild<EventItem*>("eventItem2");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem2);
|
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickMultiPointTouchArea *touchArea = window->rootObject()->findChild<QQuickMultiPointTouchArea*>("toucharea");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(touchArea);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem3 = window->rootObject()->findChild<EventItem*>("eventItem3");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem3);
|
2012-07-11 07:32:16 +00:00
|
|
|
EventItem *eventItem4 = window->rootObject()->findChild<EventItem*>("eventItem4");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(eventItem4);
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window.data(), device, false);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
// Test the common case of a mouse area on top of pinch
|
|
|
|
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
eventItem1->acceptMouse = true;
|
|
|
|
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// Normal touch click
|
|
|
|
QPoint p1 = QPoint(10, 110);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, p1, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, p1, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 5);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease);
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(4).type, QEvent::UngrabMouse);
|
2012-06-26 16:00:59 +00:00
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// Normal mouse click
|
2018-02-21 09:41:54 +00:00
|
|
|
QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, p1);
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.size(), 3);
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonRelease);
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(eventItem1->eventList.at(2).type, QEvent::UngrabMouse);
|
2012-06-26 16:00:59 +00:00
|
|
|
eventItem1->eventList.clear();
|
|
|
|
|
|
|
|
// Pinch starting on the PinchArea should work
|
|
|
|
p1 = QPoint(40, 10);
|
|
|
|
QPoint p2 = QPoint(60, 10);
|
|
|
|
|
|
|
|
// Start the events after each other
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, p1, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.stationary(0).press(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
QCOMPARE(button1->scale(), 1.0);
|
|
|
|
|
|
|
|
// This event seems to be discarded, let's ignore it for now until someone digs into pincharea
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QCOMPARE(button1->scale(), 1.5);
|
|
|
|
qDebug() << "Button scale: " << button1->scale();
|
|
|
|
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QCOMPARE(button1->scale(), 2.0);
|
|
|
|
qDebug() << "Button scale: " << button1->scale();
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, p1, window.data()).release(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QVERIFY(eventItem1->eventList.isEmpty());
|
|
|
|
// QCOMPARE(button1->scale(), 2.0);
|
|
|
|
qDebug() << "Button scale: " << button1->scale();
|
|
|
|
|
|
|
|
|
|
|
|
// wait to avoid getting a double click event
|
|
|
|
QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10);
|
|
|
|
|
|
|
|
// Start pinching while on the button
|
|
|
|
button1->setScale(1.0);
|
|
|
|
p1 = QPoint(40, 110);
|
|
|
|
p2 = QPoint(60, 110);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, p1, window.data()).press(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(button1->scale(), 1.0);
|
|
|
|
QCOMPARE(eventItem1->eventList.count(), 2);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
|
|
|
|
// This event seems to be discarded, let's ignore it for now until someone digs into pincharea
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
//QCOMPARE(button1->scale(), 1.5);
|
|
|
|
qDebug() << button1->scale();
|
|
|
|
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
qDebug() << button1->scale();
|
|
|
|
//QCOMPARE(button1->scale(), 2.0);
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, p1, window.data()).release(1, p2, window.data()).commit();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// QCOMPARE(eventItem1->eventList.size(), 99);
|
|
|
|
qDebug() << button1->scale();
|
|
|
|
//QCOMPARE(button1->scale(), 2.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::pinchOnFlickable()
|
|
|
|
{
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("pinchonflickable.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickPinchArea *pinchArea = window->rootObject()->findChild<QQuickPinchArea*>("pincharea");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(pinchArea);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(flickable);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickItem *rect = window->rootObject()->findChild<QQuickItem*>("rect");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect);
|
|
|
|
|
|
|
|
// flickable - single touch point
|
2015-07-24 13:32:22 +00:00
|
|
|
QCOMPARE(flickable->contentX(), 0.0);
|
2012-06-26 16:00:59 +00:00
|
|
|
QPoint p = QPoint(100, 100);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-10-22 14:59:25 +00:00
|
|
|
QCOMPARE(rect->position(), QPointF(200.0, 200.0));
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
QGuiApplication::processEvents();
|
|
|
|
QTest::qWait(10);
|
|
|
|
QVERIFY(!flickable->isAtXBeginning());
|
|
|
|
// wait until flicking is done
|
|
|
|
QTRY_VERIFY(!flickable->isFlicking());
|
|
|
|
|
|
|
|
// pinch
|
|
|
|
QPoint p1 = QPoint(40, 20);
|
|
|
|
QPoint p2 = QPoint(60, 20);
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window.data(), device);
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
pinchSequence.press(0, p1, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// In order for the stationary point to remember its previous position,
|
|
|
|
// we have to reuse the same pinchSequence object. Otherwise if we let it
|
|
|
|
// be destroyed and then start a new sequence, point 0 will default to being
|
|
|
|
// stationary at 0, 0, and PinchArea will filter out that touchpoint because
|
|
|
|
// it is outside its bounds.
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.stationary(0).press(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10,10);
|
|
|
|
p2 += QPoint(10,10);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(rect->scale(), 1.0);
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
2014-07-22 01:31:04 +00:00
|
|
|
QVERIFY(!flickable->isDragging());
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
pinchSequence.release(0, p1, window.data()).release(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect->scale() > 1.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::flickableOnPinch()
|
|
|
|
{
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("flickableonpinch.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickPinchArea *pinchArea = window->rootObject()->findChild<QQuickPinchArea*>("pincharea");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(pinchArea);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(flickable);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickItem *rect = window->rootObject()->findChild<QQuickItem*>("rect");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect);
|
|
|
|
|
|
|
|
// flickable - single touch point
|
2015-07-24 13:32:22 +00:00
|
|
|
QCOMPARE(flickable->contentX(), 0.0);
|
2012-06-26 16:00:59 +00:00
|
|
|
QPoint p = QPoint(100, 100);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-10-22 14:59:25 +00:00
|
|
|
QCOMPARE(rect->position(), QPointF(200.0, 200.0));
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
QTest::qWait(1000);
|
|
|
|
|
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
QTest::qWait(1000);
|
|
|
|
|
|
|
|
//QVERIFY(flickable->isMovingHorizontally());
|
2012-10-22 14:59:25 +00:00
|
|
|
qDebug() << "Pos: " << rect->position();
|
2012-06-26 16:00:59 +00:00
|
|
|
// wait until flicking is done
|
|
|
|
QTRY_VERIFY(!flickable->isFlicking());
|
|
|
|
|
|
|
|
// pinch
|
|
|
|
QPoint p1 = QPoint(40, 20);
|
|
|
|
QPoint p2 = QPoint(60, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window.data(), device);
|
|
|
|
pinchSequence.press(0, p1, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// In order for the stationary point to remember its previous position,
|
|
|
|
// we have to reuse the same pinchSequence object. Otherwise if we let it
|
|
|
|
// be destroyed and then start a new sequence, point 0 will default to being
|
|
|
|
// stationary at 0, 0, and PinchArea will filter out that touchpoint because
|
|
|
|
// it is outside its bounds.
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.stationary(0).press(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10,10);
|
|
|
|
p2 += QPoint(10,10);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(rect->scale(), 1.0);
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
pinchSequence.release(0, p1, window.data()).release(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect->scale() > 1.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_TouchMouse::mouseOnFlickableOnPinch()
|
|
|
|
{
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-07-11 07:32:16 +00:00
|
|
|
window->setSource(testFileUrl("mouseonflickableonpinch.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2017-01-11 15:40:28 +00:00
|
|
|
|
2012-11-08 16:43:46 +00:00
|
|
|
QRect windowRect = QRect(window->position(), window->size());
|
|
|
|
QCursor::setPos(windowRect.center());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickPinchArea *pinchArea = window->rootObject()->findChild<QQuickPinchArea*>("pincharea");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(pinchArea);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(flickable);
|
2012-07-11 07:32:16 +00:00
|
|
|
QQuickItem *rect = window->rootObject()->findChild<QQuickItem*>("rect");
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect);
|
|
|
|
|
|
|
|
// flickable - single touch point
|
2015-07-24 13:32:22 +00:00
|
|
|
QCOMPARE(flickable->contentX(), 0.0);
|
2012-06-26 16:00:59 +00:00
|
|
|
QPoint p = QPoint(100, 100);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-10-22 14:59:25 +00:00
|
|
|
QCOMPARE(rect->position(), QPointF(200.0, 200.0));
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).move(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
//QVERIFY(flickable->isMovingHorizontally());
|
2013-08-12 03:28:17 +00:00
|
|
|
|
|
|
|
// Wait for flick to end
|
|
|
|
QTRY_VERIFY(!flickable->isMoving());
|
2012-10-22 14:59:25 +00:00
|
|
|
qDebug() << "Pos: " << rect->position();
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
// pinch
|
|
|
|
QPoint p1 = QPoint(40, 20);
|
|
|
|
QPoint p2 = QPoint(60, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window.data(), device);
|
|
|
|
pinchSequence.press(0, p1, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
// In order for the stationary point to remember its previous position,
|
|
|
|
// we have to reuse the same pinchSequence object. Otherwise if we let it
|
|
|
|
// be destroyed and then start a new sequence, point 0 will default to being
|
|
|
|
// stationary at 0, 0, and PinchArea will filter out that touchpoint because
|
|
|
|
// it is outside its bounds.
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.stationary(0).press(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10,10);
|
|
|
|
p2 += QPoint(10,10);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(rect->scale(), 1.0);
|
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(10, 0);
|
|
|
|
p2 += QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
pinchSequence.release(0, p1, window.data()).release(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect->scale() > 1.0);
|
|
|
|
|
|
|
|
// PinchArea should steal the event after flicking started
|
|
|
|
rect->setScale(1.0);
|
|
|
|
flickable->setContentX(0.0);
|
|
|
|
p = QPoint(100, 100);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.press(0, p, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-10-22 14:59:25 +00:00
|
|
|
QCOMPARE(rect->position(), QPointF(200.0, 200.0));
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-11-08 16:43:46 +00:00
|
|
|
QGuiApplication::processEvents();
|
2012-06-26 16:00:59 +00:00
|
|
|
p -= QPoint(10, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
|
2016-07-07 23:16:11 +00:00
|
|
|
QCOMPARE(window->mouseGrabberItem(), flickable);
|
2012-06-26 16:00:59 +00:00
|
|
|
|
|
|
|
// Add a second finger, this should lead to stealing
|
|
|
|
p1 = QPoint(40, 100);
|
|
|
|
p2 = QPoint(60, 100);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.stationary(0).press(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QCOMPARE(rect->scale(), 1.0);
|
|
|
|
|
|
|
|
p1 -= QPoint(5, 0);
|
|
|
|
p2 += QPoint(5, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(5, 0);
|
|
|
|
p2 += QPoint(5, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
p1 -= QPoint(5, 0);
|
|
|
|
p2 += QPoint(5, 0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.move(0, p1, window.data()).move(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
pinchSequence.release(0, p1, window.data()).release(1, p2, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
QVERIFY(rect->scale() > 1.0);
|
2017-01-11 15:40:28 +00:00
|
|
|
pinchSequence.release(0, p, window.data()).commit();
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-06-26 16:00:59 +00:00
|
|
|
}
|
|
|
|
|
2012-12-19 17:29:49 +00:00
|
|
|
/*
|
|
|
|
Regression test for the following use case:
|
|
|
|
You have two mouse areas, on on top of the other.
|
|
|
|
1 - You tap the top one.
|
|
|
|
2 - That top mouse area receives a mouse press event but doesn't accept it
|
|
|
|
Expected outcome:
|
|
|
|
3 - the bottom mouse area gets clicked (besides press and release mouse events)
|
|
|
|
Bogus outcome:
|
|
|
|
3 - the bottom mouse area gets double clicked.
|
|
|
|
*/
|
|
|
|
void tst_TouchMouse::tapOnDismissiveTopMouseAreaClicksBottomOne()
|
|
|
|
{
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2012-12-19 17:29:49 +00:00
|
|
|
window->setSource(testFileUrl("twoMouseAreas.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2012-12-19 17:29:49 +00:00
|
|
|
|
|
|
|
QQuickMouseArea *bottomMouseArea =
|
|
|
|
window->rootObject()->findChild<QQuickMouseArea*>("rear mouseArea");
|
|
|
|
|
|
|
|
QSignalSpy bottomClickedSpy(bottomMouseArea, SIGNAL(clicked(QQuickMouseEvent*)));
|
|
|
|
QSignalSpy bottomDoubleClickedSpy(bottomMouseArea,
|
|
|
|
SIGNAL(doubleClicked(QQuickMouseEvent*)));
|
|
|
|
|
|
|
|
// tap the front mouse area (see qml file)
|
|
|
|
QPoint p1(20, 20);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-12-19 17:29:49 +00:00
|
|
|
|
|
|
|
QCOMPARE(bottomClickedSpy.count(), 1);
|
|
|
|
QCOMPARE(bottomDoubleClickedSpy.count(), 0);
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2012-12-19 17:29:49 +00:00
|
|
|
|
|
|
|
QCOMPARE(bottomClickedSpy.count(), 1);
|
|
|
|
QCOMPARE(bottomDoubleClickedSpy.count(), 1);
|
|
|
|
}
|
|
|
|
|
2014-10-10 19:54:39 +00:00
|
|
|
/*
|
|
|
|
If an item grabs a touch that is currently being used for mouse pointer emulation,
|
|
|
|
the current mouse grabber should lose the mouse as mouse events will no longer
|
|
|
|
be generated from that touch point.
|
|
|
|
*/
|
|
|
|
void tst_TouchMouse::touchGrabCausesMouseUngrab()
|
|
|
|
{
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2014-10-10 19:54:39 +00:00
|
|
|
window->setSource(testFileUrl("twosiblingitems.qml"));
|
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(window->rootObject() != nullptr);
|
2014-10-10 19:54:39 +00:00
|
|
|
|
|
|
|
EventItem *leftItem = window->rootObject()->findChild<EventItem*>("leftItem");
|
|
|
|
QVERIFY(leftItem);
|
|
|
|
|
|
|
|
EventItem *rightItem = window->rootObject()->findChild<EventItem*>("rightItem");
|
|
|
|
QVERIFY(leftItem);
|
|
|
|
|
|
|
|
// Send a touch to the leftItem. But leftItem accepts only mouse events, thus
|
|
|
|
// a mouse event will be synthesized out of this touch and will get accepted by
|
|
|
|
// leftItem.
|
|
|
|
leftItem->acceptMouse = true;
|
|
|
|
leftItem->setAcceptedMouseButtons(Qt::LeftButton);
|
|
|
|
QPoint p1;
|
|
|
|
p1 = QPoint(leftItem->width() / 2, leftItem->height() / 2);
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
|
|
|
QQuickTouchUtils::flush(window.data());
|
2014-10-10 19:54:39 +00:00
|
|
|
QCOMPARE(leftItem->eventList.size(), 2);
|
|
|
|
QCOMPARE(leftItem->eventList.at(0).type, QEvent::TouchBegin);
|
|
|
|
QCOMPARE(leftItem->eventList.at(1).type, QEvent::MouseButtonPress);
|
|
|
|
QCOMPARE(window->mouseGrabberItem(), leftItem);
|
|
|
|
leftItem->eventList.clear();
|
|
|
|
|
|
|
|
rightItem->acceptTouch = true;
|
|
|
|
{
|
2020-06-22 10:12:52 +00:00
|
|
|
QList<int> ids;
|
2016-10-12 08:50:22 +00:00
|
|
|
ids.append(leftItem->point0);
|
2014-10-10 19:54:39 +00:00
|
|
|
rightItem->grabTouchPoints(ids);
|
|
|
|
}
|
|
|
|
|
|
|
|
// leftItem should have lost the mouse as the touch point that was being used to emulate it
|
|
|
|
// has been grabbed by another item.
|
|
|
|
QCOMPARE(leftItem->eventList.size(), 1);
|
|
|
|
QCOMPARE(leftItem->eventList.at(0).type, QEvent::UngrabMouse);
|
2018-02-21 09:41:54 +00:00
|
|
|
QCOMPARE(window->mouseGrabberItem(), (QQuickItem*)nullptr);
|
2014-10-10 19:54:39 +00:00
|
|
|
}
|
|
|
|
|
2016-08-01 12:13:20 +00:00
|
|
|
void tst_TouchMouse::touchPointDeliveryOrder()
|
|
|
|
{
|
|
|
|
// Touch points should be first delivered to the item under the primary finger
|
|
|
|
QScopedPointer<QQuickView> window(createView());
|
|
|
|
window->setSource(testFileUrl("touchpointdeliveryorder.qml"));
|
2017-01-11 15:40:28 +00:00
|
|
|
window->show();
|
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
|
|
|
|
2016-08-01 12:13:20 +00:00
|
|
|
/*
|
|
|
|
The items are positioned from left to right:
|
|
|
|
| background |
|
|
|
|
| left |
|
|
|
|
| | right |
|
|
|
|
| middle |
|
|
|
|
0 150 300 450 600
|
|
|
|
*/
|
|
|
|
QPoint pLeft = QPoint(100, 100);
|
|
|
|
QPoint pRight = QPoint(500, 100);
|
|
|
|
QPoint pLeftMiddle = QPoint(200, 100);
|
|
|
|
QPoint pRightMiddle = QPoint(350, 100);
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window.data(), device, false);
|
2016-08-01 12:13:20 +00:00
|
|
|
|
|
|
|
QVector<QQuickItem*> events;
|
|
|
|
EventItem *background = window->rootObject()->findChild<EventItem*>("background");
|
|
|
|
EventItem *left = window->rootObject()->findChild<EventItem*>("left");
|
|
|
|
EventItem *middle = window->rootObject()->findChild<EventItem*>("middle");
|
|
|
|
EventItem *right = window->rootObject()->findChild<EventItem*>("right");
|
|
|
|
QVERIFY(background);
|
|
|
|
QVERIFY(left);
|
|
|
|
QVERIFY(middle);
|
|
|
|
QVERIFY(right);
|
|
|
|
connect(background, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); });
|
|
|
|
connect(left, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); });
|
|
|
|
connect(middle, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); });
|
|
|
|
connect(right, &EventItem::onTouchEvent, [&events](QQuickItem* receiver){ events.append(receiver); });
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, pLeft, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
|
|
|
|
// Touch on left, then background
|
|
|
|
QCOMPARE(events.size(), 2);
|
|
|
|
QCOMPARE(events.at(0), left);
|
|
|
|
QCOMPARE(events.at(1), background);
|
|
|
|
events.clear();
|
|
|
|
|
|
|
|
// New press events are deliverd first, the stationary point was not accepted, thus it doesn't get delivered
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.stationary(0).press(1, pRightMiddle, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QCOMPARE(events.size(), 3);
|
|
|
|
QCOMPARE(events.at(0), middle);
|
|
|
|
QCOMPARE(events.at(1), right);
|
|
|
|
QCOMPARE(events.at(2), background);
|
|
|
|
events.clear();
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, pLeft, window.data()).release(1, pRightMiddle, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QCOMPARE(events.size(), 0); // no accepted events
|
|
|
|
|
|
|
|
// Two presses, the first point should come first
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, pLeft, window.data()).press(1, pRight, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QCOMPARE(events.size(), 3);
|
|
|
|
QCOMPARE(events.at(0), left);
|
|
|
|
QCOMPARE(events.at(1), right);
|
|
|
|
QCOMPARE(events.at(2), background);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, pLeft, window.data()).release(1, pRight, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
events.clear();
|
|
|
|
|
|
|
|
// Again, pressing right first
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, pRight, window.data()).press(1, pLeft, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
QQuickTouchUtils::flush(window.data());
|
|
|
|
QCOMPARE(events.size(), 3);
|
|
|
|
QCOMPARE(events.at(0), right);
|
|
|
|
QCOMPARE(events.at(1), left);
|
|
|
|
QCOMPARE(events.at(2), background);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, pRight, window.data()).release(1, pLeft, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
events.clear();
|
|
|
|
|
|
|
|
// Two presses, both hitting the middle item on top, then branching left and right, then bottom
|
|
|
|
// Each target should be offered the events exactly once, middle first, left must come before right (id 0)
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, pLeftMiddle, window.data()).press(1, pRightMiddle, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
QCOMPARE(events.size(), 4);
|
|
|
|
QCOMPARE(events.at(0), middle);
|
|
|
|
QCOMPARE(events.at(1), left);
|
|
|
|
QCOMPARE(events.at(2), right);
|
|
|
|
QCOMPARE(events.at(3), background);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, pLeftMiddle, window.data()).release(1, pRightMiddle, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
events.clear();
|
|
|
|
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.press(0, pRightMiddle, window.data()).press(1, pLeftMiddle, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
qDebug() << events;
|
|
|
|
QCOMPARE(events.size(), 4);
|
|
|
|
QCOMPARE(events.at(0), middle);
|
|
|
|
QCOMPARE(events.at(1), right);
|
|
|
|
QCOMPARE(events.at(2), left);
|
|
|
|
QCOMPARE(events.at(3), background);
|
2018-07-03 12:38:46 +00:00
|
|
|
touchSeq.release(0, pRightMiddle, window.data()).release(1, pLeftMiddle, window.data()).commit();
|
2016-08-01 12:13:20 +00:00
|
|
|
}
|
|
|
|
|
2015-11-30 15:39:15 +00:00
|
|
|
void tst_TouchMouse::hoverEnabled()
|
|
|
|
{
|
2017-01-11 15:40:28 +00:00
|
|
|
QScopedPointer<QQuickView> window(createView());
|
2015-11-30 15:39:15 +00:00
|
|
|
window->setSource(testFileUrl("hoverMouseAreas.qml"));
|
2017-01-11 15:40:28 +00:00
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QQuickViewTestUtil::moveMouseAway(window.data());
|
2015-11-30 15:39:15 +00:00
|
|
|
window->show();
|
2017-01-11 15:40:28 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
2015-11-30 15:39:15 +00:00
|
|
|
QQuickItem *root = window->rootObject();
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(root != nullptr);
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
QQuickMouseArea *mouseArea1 = root->findChild<QQuickMouseArea*>("mouseArea1");
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(mouseArea1 != nullptr);
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
QQuickMouseArea *mouseArea2 = root->findChild<QQuickMouseArea*>("mouseArea2");
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(mouseArea2 != nullptr);
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
QSignalSpy enterSpy1(mouseArea1, SIGNAL(entered()));
|
|
|
|
QSignalSpy exitSpy1(mouseArea1, SIGNAL(exited()));
|
|
|
|
QSignalSpy clickSpy1(mouseArea1, SIGNAL(clicked(QQuickMouseEvent *)));
|
|
|
|
|
|
|
|
QSignalSpy enterSpy2(mouseArea2, SIGNAL(entered()));
|
|
|
|
QSignalSpy exitSpy2(mouseArea2, SIGNAL(exited()));
|
|
|
|
QSignalSpy clickSpy2(mouseArea2, SIGNAL(clicked(QQuickMouseEvent *)));
|
|
|
|
|
|
|
|
QPoint p1(150, 150);
|
|
|
|
QPoint p2(150, 250);
|
|
|
|
|
|
|
|
// ------------------------- Mouse move to mouseArea1
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::mouseMove(window.data(), p1);
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
QVERIFY(enterSpy1.count() == 1);
|
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(!mouseArea2->hovered());
|
|
|
|
|
|
|
|
// ------------------------- Touch click on mouseArea1
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
2015-11-30 15:39:15 +00:00
|
|
|
|
2016-08-17 13:05:24 +00:00
|
|
|
QCOMPARE(enterSpy1.count(), 1);
|
|
|
|
QCOMPARE(enterSpy2.count(), 0);
|
2015-11-30 15:39:15 +00:00
|
|
|
QVERIFY(mouseArea1->pressed());
|
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(!mouseArea2->hovered());
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
2015-11-30 15:39:15 +00:00
|
|
|
QVERIFY(clickSpy1.count() == 1);
|
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(!mouseArea2->hovered());
|
|
|
|
|
|
|
|
// ------------------------- Touch click on mouseArea2
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p2, window.data());
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(mouseArea2->hovered());
|
|
|
|
QVERIFY(mouseArea2->pressed());
|
2016-08-17 13:05:24 +00:00
|
|
|
QCOMPARE(enterSpy1.count(), 1);
|
|
|
|
QCOMPARE(enterSpy2.count(), 1);
|
2015-11-30 15:39:15 +00:00
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p2, window.data());
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
QVERIFY(clickSpy2.count() == 1);
|
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(!mouseArea2->hovered());
|
2016-08-17 13:05:24 +00:00
|
|
|
QCOMPARE(exitSpy1.count(), 0);
|
|
|
|
QCOMPARE(exitSpy2.count(), 1);
|
2015-11-30 15:39:15 +00:00
|
|
|
|
|
|
|
// ------------------------- Another touch click on mouseArea1
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
|
2015-11-30 15:39:15 +00:00
|
|
|
|
2016-08-17 13:05:24 +00:00
|
|
|
QCOMPARE(enterSpy1.count(), 1);
|
|
|
|
QCOMPARE(enterSpy2.count(), 1);
|
2015-11-30 15:39:15 +00:00
|
|
|
QVERIFY(mouseArea1->pressed());
|
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(!mouseArea2->hovered());
|
|
|
|
|
2017-01-11 15:40:28 +00:00
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1, window.data());
|
2016-08-17 13:05:24 +00:00
|
|
|
QCOMPARE(clickSpy1.count(), 2);
|
2015-11-30 15:39:15 +00:00
|
|
|
QVERIFY(mouseArea1->hovered());
|
|
|
|
QVERIFY(!mouseArea1->pressed());
|
|
|
|
QVERIFY(!mouseArea2->hovered());
|
|
|
|
}
|
|
|
|
|
2017-01-13 09:02:23 +00:00
|
|
|
void tst_TouchMouse::implicitUngrab()
|
|
|
|
{
|
|
|
|
QScopedPointer<QQuickView> window(createView());
|
|
|
|
window->setSource(testFileUrl("singleitem.qml"));
|
|
|
|
window->show();
|
|
|
|
QQuickViewTestUtil::centerOnScreen(window.data());
|
|
|
|
QQuickViewTestUtil::moveMouseAway(window.data());
|
|
|
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
|
|
|
|
|
|
|
QQuickItem *root = window->rootObject();
|
2018-02-21 09:41:54 +00:00
|
|
|
QVERIFY(root != nullptr);
|
2017-01-13 09:02:23 +00:00
|
|
|
EventItem *eventItem = root->findChild<EventItem*>("eventItem1");
|
|
|
|
eventItem->acceptMouse = true;
|
|
|
|
QPoint p1(20, 20);
|
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1);
|
|
|
|
|
|
|
|
QCOMPARE(window->mouseGrabberItem(), eventItem);
|
|
|
|
eventItem->eventList.clear();
|
|
|
|
eventItem->setEnabled(false);
|
|
|
|
QVERIFY(!eventItem->eventList.isEmpty());
|
|
|
|
QCOMPARE(eventItem->eventList.at(0).type, QEvent::UngrabMouse);
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1); // clean up potential state
|
|
|
|
|
|
|
|
eventItem->setEnabled(true);
|
|
|
|
QTest::touchEvent(window.data(), device).press(0, p1);
|
|
|
|
eventItem->eventList.clear();
|
|
|
|
eventItem->setVisible(false);
|
|
|
|
QVERIFY(!eventItem->eventList.isEmpty());
|
|
|
|
QCOMPARE(eventItem->eventList.at(0).type, QEvent::UngrabMouse);
|
|
|
|
QTest::touchEvent(window.data(), device).release(0, p1); // clean up potential state
|
|
|
|
}
|
2012-06-26 16:00:59 +00:00
|
|
|
QTEST_MAIN(tst_TouchMouse)
|
|
|
|
|
|
|
|
#include "tst_touchmouse.moc"
|
|
|
|
|