1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include <QtTest/QtTest>
43 #include <QtTest/QSignalSpy>
44 #include <private/qquickmultipointtoucharea_p.h>
45 #include <private/qquickflickable_p.h>
46 #include <QtQuick/qquickview.h>
47 #include "../../shared/util.h"
49 class tst_QQuickMultiPointTouchArea : public QQmlDataTest
53 tst_QQuickMultiPointTouchArea() : device(0) { }
56 QQmlDataTest::initTestCase();
58 device = new QTouchDevice;
59 device->setType(QTouchDevice::TouchScreen);
60 QWindowSystemInterface::registerTouchDevice(device);
63 void cleanupTestCase() {}
69 void nonOverlapping();
74 void transformedTouchArea_data();
75 void transformedTouchArea();
78 QQuickView *createAndShowView(const QString &file);
82 void tst_QQuickMultiPointTouchArea::properties()
84 QQuickView *window = createAndShowView("properties.qml");
85 QVERIFY(window->rootObject() != 0);
87 QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(window->rootObject());
90 QCOMPARE(area->minimumTouchPoints(), 2);
91 QCOMPARE(area->maximumTouchPoints(), 4);
93 QQmlListReference ref(area, "touchPoints");
94 QCOMPARE(ref.count(), 4);
99 void tst_QQuickMultiPointTouchArea::signalTest()
101 QQuickView *window = createAndShowView("signalTest.qml");
102 QVERIFY(window->rootObject() != 0);
104 QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(window->rootObject());
113 QTest::QTouchEventSequence sequence = QTest::touchEvent(window, device);
115 sequence.press(0, p1).press(1, p2).commit();
117 QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
118 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
119 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
120 QCOMPARE(area->property("touchCount").toInt(), 2);
121 QMetaObject::invokeMethod(area, "clearCounts");
123 sequence.stationary(0).stationary(1).press(2, p3).commit();
125 QCOMPARE(area->property("touchPointPressCount").toInt(), 1);
126 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
127 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
128 QCOMPARE(area->property("touchCount").toInt(), 3);
129 QMetaObject::invokeMethod(area, "clearCounts");
133 sequence.move(0, p1).move(1, p2).stationary(2).commit();
135 QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
136 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 2);
137 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
138 QCOMPARE(area->property("touchCount").toInt(), 3);
139 QMetaObject::invokeMethod(area, "clearCounts");
142 sequence.release(0, p1).release(1, p2)
143 .move(2, p3).press(3, p4).press(4, p5).commit();
145 QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
146 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 1);
147 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 2);
148 QCOMPARE(area->property("touchCount").toInt(), 3);
149 QMetaObject::invokeMethod(area, "clearCounts");
151 sequence.release(2, p3).release(3, p4).release(4, p5).commit();
153 QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
154 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
155 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 3);
156 QCOMPARE(area->property("touchCount").toInt(), 0);
157 QCOMPARE(area->property("touchUpdatedHandled").toBool(), true);
158 QMetaObject::invokeMethod(area, "clearCounts");
163 void tst_QQuickMultiPointTouchArea::release()
165 QQuickView *window = createAndShowView("basic.qml");
166 QVERIFY(window->rootObject() != 0);
168 QQuickTouchPoint *point1 = window->rootObject()->findChild<QQuickTouchPoint*>("point1");
170 QCOMPARE(point1->pressed(), false);
174 QTest::QTouchEventSequence sequence = QTest::touchEvent(window, device);
176 sequence.press(0, p1).commit();
178 QCOMPARE(point1->pressed(), true);
182 sequence.move(0, p1).commit();
184 QCOMPARE(point1->pressed(), true);
185 QCOMPARE(point1->x(), qreal(20)); QCOMPARE(point1->y(), qreal(110));
189 sequence.release(0, p1).commit();
191 //test that a release without a prior move to the release position successfully updates the point's position
192 QCOMPARE(point1->pressed(), false);
193 QCOMPARE(point1->x(), qreal(24)); QCOMPARE(point1->y(), qreal(120));
198 void tst_QQuickMultiPointTouchArea::reuse()
200 QQuickView *window = createAndShowView("basic.qml");
201 QVERIFY(window->rootObject() != 0);
203 QQuickTouchPoint *point1 = window->rootObject()->findChild<QQuickTouchPoint*>("point1");
204 QQuickTouchPoint *point2 = window->rootObject()->findChild<QQuickTouchPoint*>("point2");
205 QQuickTouchPoint *point3 = window->rootObject()->findChild<QQuickTouchPoint*>("point3");
207 QCOMPARE(point1->pressed(), false);
208 QCOMPARE(point2->pressed(), false);
215 QTest::QTouchEventSequence sequence = QTest::touchEvent(window, device);
217 sequence.press(0, p1).press(1, p2).commit();
219 QCOMPARE(point1->pressed(), true);
220 QCOMPARE(point2->pressed(), true);
221 QCOMPARE(point3->pressed(), false);
223 sequence.release(0, p1).stationary(1).press(2, p3).commit();
225 //we shouldn't reuse point 1 yet
226 QCOMPARE(point1->pressed(), false);
227 QCOMPARE(point2->pressed(), true);
228 QCOMPARE(point3->pressed(), true);
230 //back to base state (no touches)
231 sequence.release(1, p2).release(2, p3).commit();
233 QCOMPARE(point1->pressed(), false);
234 QCOMPARE(point2->pressed(), false);
235 QCOMPARE(point3->pressed(), false);
237 sequence.press(0, p1).press(1, p2).commit();
239 QCOMPARE(point1->pressed(), true);
240 QCOMPARE(point2->pressed(), true);
241 QCOMPARE(point3->pressed(), false);
243 sequence.release(0, p1).stationary(1).commit();
245 QCOMPARE(point1->pressed(), false);
246 QCOMPARE(point2->pressed(), true);
247 QCOMPARE(point3->pressed(), false);
249 sequence.press(4, p4).stationary(1).commit();
251 //the new touch point should reuse point 1
252 QCOMPARE(point1->pressed(), true);
253 QCOMPARE(point2->pressed(), true);
254 QCOMPARE(point3->pressed(), false);
256 QCOMPARE(point1->x(), qreal(80)); QCOMPARE(point1->y(), qreal(100));
261 void tst_QQuickMultiPointTouchArea::nonOverlapping()
263 QQuickView *window = createAndShowView("nonOverlapping.qml");
264 QVERIFY(window->rootObject() != 0);
266 QQuickTouchPoint *point11 = window->rootObject()->findChild<QQuickTouchPoint*>("point11");
267 QQuickTouchPoint *point12 = window->rootObject()->findChild<QQuickTouchPoint*>("point12");
268 QQuickTouchPoint *point21 = window->rootObject()->findChild<QQuickTouchPoint*>("point21");
269 QQuickTouchPoint *point22 = window->rootObject()->findChild<QQuickTouchPoint*>("point22");
270 QQuickTouchPoint *point23 = window->rootObject()->findChild<QQuickTouchPoint*>("point23");
272 QCOMPARE(point11->pressed(), false);
273 QCOMPARE(point12->pressed(), false);
274 QCOMPARE(point21->pressed(), false);
275 QCOMPARE(point22->pressed(), false);
276 QCOMPARE(point23->pressed(), false);
284 QTest::QTouchEventSequence sequence = QTest::touchEvent(window, device);
286 sequence.press(0, p1).commit();
288 QCOMPARE(point11->pressed(), false);
289 QCOMPARE(point12->pressed(), false);
290 QCOMPARE(point21->pressed(), false);
291 QCOMPARE(point22->pressed(), false);
292 QCOMPARE(point23->pressed(), false);
294 sequence.stationary(0).press(1, p2).commit();
296 QCOMPARE(point11->pressed(), true);
297 QCOMPARE(point12->pressed(), true);
298 QCOMPARE(point21->pressed(), false);
299 QCOMPARE(point22->pressed(), false);
300 QCOMPARE(point23->pressed(), false);
302 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
303 QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
307 sequence.move(0, p1).move(1, p2).commit();
309 QCOMPARE(point11->pressed(), true);
310 QCOMPARE(point12->pressed(), true);
311 QCOMPARE(point21->pressed(), false);
312 QCOMPARE(point22->pressed(), false);
313 QCOMPARE(point23->pressed(), false);
315 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
316 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
318 sequence.stationary(0).stationary(1).press(2, p3).commit();
320 QCOMPARE(point11->pressed(), true);
321 QCOMPARE(point12->pressed(), true);
322 QCOMPARE(point21->pressed(), false);
323 QCOMPARE(point22->pressed(), false);
324 QCOMPARE(point23->pressed(), false);
326 sequence.stationary(0).stationary(1).stationary(2).press(3, p4).press(4, p5).commit();
328 QCOMPARE(point11->pressed(), true);
329 QCOMPARE(point12->pressed(), true);
330 QCOMPARE(point21->pressed(), true);
331 QCOMPARE(point22->pressed(), true);
332 QCOMPARE(point23->pressed(), true);
334 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
335 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
336 QCOMPARE(point21->x(), qreal(60)); QCOMPARE(point21->y(), qreal(20));
337 QCOMPARE(point22->x(), qreal(80)); QCOMPARE(point22->y(), qreal(20));
338 QCOMPARE(point23->x(), qreal(100)); QCOMPARE(point23->y(), qreal(20));
345 sequence.move(0, p1).move(1, p2).move(2, p3).move(3, p4).move(4, p5).commit();
347 QCOMPARE(point11->pressed(), true);
348 QCOMPARE(point12->pressed(), true);
349 QCOMPARE(point21->pressed(), true);
350 QCOMPARE(point22->pressed(), true);
351 QCOMPARE(point23->pressed(), true);
353 QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
354 QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
355 QCOMPARE(point21->x(), qreal(63)); QCOMPARE(point21->y(), qreal(20));
356 QCOMPARE(point22->x(), qreal(81)); QCOMPARE(point22->y(), qreal(19));
357 QCOMPARE(point23->x(), qreal(93)); QCOMPARE(point23->y(), qreal(30));
359 sequence.release(0, p1).release(1, p2).release(2, p3).release(3, p4).release(4, p5).commit();
361 QCOMPARE(point11->pressed(), false);
362 QCOMPARE(point12->pressed(), false);
363 QCOMPARE(point21->pressed(), false);
364 QCOMPARE(point22->pressed(), false);
365 QCOMPARE(point23->pressed(), false);
370 void tst_QQuickMultiPointTouchArea::nested()
372 QQuickView *window = createAndShowView("nested.qml");
373 QVERIFY(window->rootObject() != 0);
375 QQuickTouchPoint *point11 = window->rootObject()->findChild<QQuickTouchPoint*>("point11");
376 QQuickTouchPoint *point12 = window->rootObject()->findChild<QQuickTouchPoint*>("point12");
377 QQuickTouchPoint *point21 = window->rootObject()->findChild<QQuickTouchPoint*>("point21");
378 QQuickTouchPoint *point22 = window->rootObject()->findChild<QQuickTouchPoint*>("point22");
379 QQuickTouchPoint *point23 = window->rootObject()->findChild<QQuickTouchPoint*>("point23");
381 QCOMPARE(point11->pressed(), false);
382 QCOMPARE(point12->pressed(), false);
383 QCOMPARE(point21->pressed(), false);
384 QCOMPARE(point22->pressed(), false);
385 QCOMPARE(point23->pressed(), false);
391 QTest::QTouchEventSequence sequence = QTest::touchEvent(window, device);
393 sequence.press(0, p1).commit();
395 QCOMPARE(point11->pressed(), false);
396 QCOMPARE(point12->pressed(), false);
397 QCOMPARE(point21->pressed(), false);
398 QCOMPARE(point22->pressed(), false);
399 QCOMPARE(point23->pressed(), false);
401 sequence.stationary(0).press(1, p2).commit();
403 QCOMPARE(point11->pressed(), true);
404 QCOMPARE(point12->pressed(), true);
405 QCOMPARE(point21->pressed(), false);
406 QCOMPARE(point22->pressed(), false);
407 QCOMPARE(point23->pressed(), false);
409 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
410 QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
414 sequence.move(0, p1).move(1, p2).commit();
416 QCOMPARE(point11->pressed(), true);
417 QCOMPARE(point12->pressed(), true);
418 QCOMPARE(point21->pressed(), false);
419 QCOMPARE(point22->pressed(), false);
420 QCOMPARE(point23->pressed(), false);
422 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
423 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
425 sequence.stationary(0).stationary(1).press(2, p3).commit();
427 QCOMPARE(point11->pressed(), true);
428 QCOMPARE(point12->pressed(), true);
429 QCOMPARE(point21->pressed(), true);
430 QCOMPARE(point22->pressed(), true);
431 QCOMPARE(point23->pressed(), true);
433 //point11 should be same as point21, point12 same as point22
434 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
435 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
436 QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
437 QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
438 QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
440 sequence.stationary(0).stationary(1).stationary(2).press(3, QPoint(80,180)).press(4, QPoint(100,180)).commit();
442 QCOMPARE(point11->pressed(), true);
443 QCOMPARE(point12->pressed(), true);
444 QCOMPARE(point21->pressed(), true);
445 QCOMPARE(point22->pressed(), true);
446 QCOMPARE(point23->pressed(), true);
448 //new touch points should be ignored (have no impact on our existing touch points)
449 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
450 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
451 QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
452 QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
453 QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
455 sequence.stationary(0).stationary(1).stationary(2).release(3, QPoint(80,180)).release(4, QPoint(100,180)).commit();
460 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
462 QCOMPARE(point11->pressed(), true);
463 QCOMPARE(point12->pressed(), true);
464 QCOMPARE(point21->pressed(), true);
465 QCOMPARE(point22->pressed(), true);
466 QCOMPARE(point23->pressed(), true);
468 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
469 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
470 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
471 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
472 QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
477 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
479 QCOMPARE(point11->pressed(), false);
480 QCOMPARE(point12->pressed(), false);
481 QCOMPARE(point21->pressed(), true);
482 QCOMPARE(point22->pressed(), true);
483 QCOMPARE(point23->pressed(), true);
485 //first two remain the same (touches now grabbed by inner touch area)
486 QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
487 QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
488 QCOMPARE(point21->x(), qreal(28)); QCOMPARE(point21->y(), qreal(130));
489 QCOMPARE(point22->x(), qreal(79)); QCOMPARE(point22->y(), qreal(134));
490 QCOMPARE(point23->x(), qreal(66)); QCOMPARE(point23->y(), qreal(180));
492 sequence.release(0, p1).release(1, p2).release(2, p3).commit();
494 sequence.press(0, p1).commit();
496 QCOMPARE(point11->pressed(), false);
497 QCOMPARE(point12->pressed(), false);
498 QCOMPARE(point21->pressed(), false);
499 QCOMPARE(point22->pressed(), false);
500 QCOMPARE(point23->pressed(), false);
502 sequence.release(0, p1).commit();
504 //test with grabbing turned off
505 window->rootObject()->setProperty("grabInnerArea", false);
507 sequence.press(0, p1).press(1, p2).press(2, p3).commit();
509 QCOMPARE(point11->pressed(), true);
510 QCOMPARE(point12->pressed(), true);
511 QCOMPARE(point21->pressed(), true);
512 QCOMPARE(point22->pressed(), true);
513 QCOMPARE(point23->pressed(), true);
518 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
520 QCOMPARE(point11->pressed(), true);
521 QCOMPARE(point12->pressed(), true);
522 QCOMPARE(point21->pressed(), true);
523 QCOMPARE(point22->pressed(), true);
524 QCOMPARE(point23->pressed(), true);
526 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
527 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
528 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
529 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
530 QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
535 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
537 QCOMPARE(point11->pressed(), true);
538 QCOMPARE(point12->pressed(), true);
539 QCOMPARE(point21->pressed(), true);
540 QCOMPARE(point22->pressed(), true);
541 QCOMPARE(point23->pressed(), true);
543 //all change (touches not grabbed by inner touch area)
544 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
545 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
546 QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
547 QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
548 QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
550 sequence.release(0, p1).release(1, p2).release(2, p3).commit();
555 void tst_QQuickMultiPointTouchArea::inFlickable()
557 QQuickView *window = createAndShowView("inFlickable.qml");
558 QVERIFY(window->rootObject() != 0);
560 QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(window->rootObject());
561 QVERIFY(flickable != 0);
563 QQuickTouchPoint *point11 = window->rootObject()->findChild<QQuickTouchPoint*>("point1");
564 QQuickTouchPoint *point12 = window->rootObject()->findChild<QQuickTouchPoint*>("point2");
566 QCOMPARE(point11->pressed(), false);
567 QCOMPARE(point12->pressed(), false);
572 //moving one point vertically
573 QTest::touchEvent(window, device).press(0, p1);
576 QTest::touchEvent(window, device).move(0, p1);
579 QTest::touchEvent(window, device).move(0, p1);
582 QTest::touchEvent(window, device).move(0, p1);
585 QTest::touchEvent(window, device).move(0, p1);
587 QVERIFY(flickable->contentY() < 0);
588 QCOMPARE(point11->pressed(), false);
589 QCOMPARE(point12->pressed(), false);
591 QTest::touchEvent(window, device).release(0, p1);
594 QTRY_VERIFY(!flickable->isMoving());
596 //moving two points vertically
598 QTest::touchEvent(window, device).press(0, p1).press(1, p2);
599 QTest::mousePress(window, Qt::LeftButton, 0, p1);
601 QCOMPARE(point11->pressed(), true);
602 QCOMPARE(point12->pressed(), true);
603 QCOMPARE(flickable->property("cancelCount").toInt(), 0);
604 QCOMPARE(flickable->property("touchCount").toInt(), 2);
606 p1 += QPoint(0,15); p2 += QPoint(0,15);
607 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
608 QTest::mouseMove(window, p1);
610 p1 += QPoint(0,15); p2 += QPoint(0,15);
611 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
612 QTest::mouseMove(window, p1);
614 p1 += QPoint(0,15); p2 += QPoint(0,15);
615 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
616 QTest::mouseMove(window, p1);
618 p1 += QPoint(0,15); p2 += QPoint(0,15);
619 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
620 QTest::mouseMove(window, p1);
622 QVERIFY(flickable->contentY() < 0);
623 QCOMPARE(point11->pressed(), false);
624 QCOMPARE(point12->pressed(), false);
625 QCOMPARE(flickable->property("cancelCount").toInt(), 2);
626 QCOMPARE(flickable->property("touchCount").toInt(), 0);
628 QTest::touchEvent(window, device).release(0, p1).release(1, p2);
629 QTest::mouseRelease(window,Qt::LeftButton, 0, p1);
632 QTRY_VERIFY(!flickable->isMoving());
634 //moving two points horizontally, then one point vertically
637 QTest::touchEvent(window, device).press(0, p1).press(1, p2);
638 QTest::mousePress(window, Qt::LeftButton, 0, p1);
640 QCOMPARE(point11->pressed(), true);
641 QCOMPARE(point12->pressed(), true);
643 p1 += QPoint(15,0); p2 += QPoint(15,0);
644 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
645 QTest::mouseMove(window, p1);
647 p1 += QPoint(15,0); p2 += QPoint(15,0);
648 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
649 QTest::mouseMove(window, p1);
651 p1 += QPoint(15,0); p2 += QPoint(15,0);
652 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
653 QTest::mouseMove(window, p1);
655 p1 += QPoint(15,0); p2 += QPoint(15,0);
656 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
657 QTest::mouseMove(window, p1);
659 p1 += QPoint(0,15); p2 += QPoint(0,15);
660 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
661 QTest::mouseMove(window, p1);
663 p1 += QPoint(0,15); p2 += QPoint(0,15);
664 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
665 QTest::mouseMove(window, p1);
667 p1 += QPoint(0,15); p2 += QPoint(0,15);
668 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
669 QTest::mouseMove(window, p1);
671 p1 += QPoint(0,15); p2 += QPoint(0,15);
672 QTest::touchEvent(window, device).move(0, p1).move(1, p2);
673 QTest::mouseMove(window, p1);
675 QVERIFY(flickable->contentY() == 0);
676 QCOMPARE(point11->pressed(), true);
677 QCOMPARE(point12->pressed(), true);
679 QTest::touchEvent(window, device).release(0, p1).release(1, p2);
680 QTest::mouseRelease(window,Qt::LeftButton, 0, p1);
686 // test that dragging out of a Flickable containing a MPTA doesn't harm Flickable's state.
687 void tst_QQuickMultiPointTouchArea::inFlickable2()
689 QQuickView *window = createAndShowView("inFlickable2.qml");
690 QVERIFY(window->rootObject() != 0);
692 QQuickFlickable *flickable = window->rootObject()->findChild<QQuickFlickable*>("flickable");
693 QVERIFY(flickable != 0);
695 QQuickTouchPoint *point11 = window->rootObject()->findChild<QQuickTouchPoint*>("point1");
698 QCOMPARE(point11->pressed(), false);
702 // move point horizontally, out of Flickable area
703 QTest::touchEvent(window, device).press(0, p1);
704 QTest::mousePress(window, Qt::LeftButton, 0, p1);
707 QTest::touchEvent(window, device).move(0, p1);
708 QTest::mouseMove(window, p1);
711 QTest::touchEvent(window, device).move(0, p1);
712 QTest::mouseMove(window, p1);
715 QTest::touchEvent(window, device).move(0, p1);
716 QTest::mouseMove(window, p1);
719 QTest::touchEvent(window, device).move(0, p1);
720 QTest::mouseMove(window, p1);
722 QVERIFY(!flickable->isMoving());
723 QVERIFY(point11->pressed());
725 QTest::touchEvent(window, device).release(0, p1);
726 QTest::mouseRelease(window,Qt::LeftButton, 0, p1);
729 QTRY_VERIFY(!flickable->isMoving());
731 // Check that we can still move the Flickable
733 QTest::touchEvent(window, device).press(0, p1);
735 QCOMPARE(point11->pressed(), true);
738 QTest::touchEvent(window, device).move(0, p1);
741 QTest::touchEvent(window, device).move(0, p1);
744 QTest::touchEvent(window, device).move(0, p1);
747 QTest::touchEvent(window, device).move(0, p1);
749 QVERIFY(flickable->contentY() < 0);
750 QVERIFY(flickable->isMoving());
751 QCOMPARE(point11->pressed(), true);
753 QTest::touchEvent(window, device).release(0, p1);
756 QTRY_VERIFY(!flickable->isMoving());
763 void tst_QQuickMultiPointTouchArea::invisible()
765 QQuickView *window = createAndShowView("signalTest.qml");
766 QVERIFY(window->rootObject() != 0);
768 QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(window->rootObject());
771 area->setVisible(false);
776 QTest::QTouchEventSequence sequence = QTest::touchEvent(window, device);
778 sequence.press(0, p1).press(1, p2).commit();
780 QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
781 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
782 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
783 QCOMPARE(area->property("touchCount").toInt(), 0);
788 void tst_QQuickMultiPointTouchArea::transformedTouchArea_data()
790 QTest::addColumn<QPoint>("p1");
791 QTest::addColumn<QPoint>("p2");
792 QTest::addColumn<QPoint>("p3");
793 QTest::addColumn<int>("total1");
794 QTest::addColumn<int>("total2");
795 QTest::addColumn<int>("total3");
797 QTest::newRow("1st point inside")
798 << QPoint(140, 200) << QPoint(260, 260) << QPoint(0, 140) << 1 << 1 << 1;
800 QTest::newRow("2nd point inside")
801 << QPoint(260, 260) << QPoint(200, 200) << QPoint(0, 0) << 0 << 1 << 1;
803 QTest::newRow("3rd point inside")
804 << QPoint(140, 260) << QPoint(260, 140) << QPoint(200, 140) << 0 << 0 << 1;
806 QTest::newRow("all points inside")
807 << QPoint(200, 140) << QPoint(200, 260) << QPoint(140, 200) << 1 << 2 << 3;
809 QTest::newRow("all points outside")
810 << QPoint(140, 140) << QPoint(260, 260) << QPoint(260, 140) << 0 << 0 << 0;
812 QTest::newRow("1st and 2nd points inside")
813 << QPoint(200, 260) << QPoint(200, 140) << QPoint(140, 140) << 1 << 2 << 2;
815 QTest::newRow("1st and 3rd points inside")
816 << QPoint(200, 200) << QPoint(0, 0) << QPoint(200, 260) << 1 << 1 << 2;
819 void tst_QQuickMultiPointTouchArea::transformedTouchArea()
828 QQuickView *view = createAndShowView("transformedMultiPointTouchArea.qml");
829 QVERIFY(view->rootObject() != 0);
831 QQuickMultiPointTouchArea *area = view->rootObject()->findChild<QQuickMultiPointTouchArea *>("touchArea");
834 QTest::QTouchEventSequence sequence = QTest::touchEvent(view, device);
836 sequence.press(0, p1).commit();
837 QCOMPARE(area->property("pointCount").toInt(), total1);
839 sequence.stationary(0).press(1, p2).commit();
840 QCOMPARE(area->property("pointCount").toInt(), total2);
842 sequence.stationary(0).stationary(1).press(2, p3).commit();
843 QCOMPARE(area->property("pointCount").toInt(), total3);
848 QQuickView *tst_QQuickMultiPointTouchArea::createAndShowView(const QString &file)
850 QQuickView *window = new QQuickView(0);
851 window->setSource(testFileUrl(file));
853 window->requestActivateWindow();
854 QTest::qWaitForWindowShown(window);
859 QTEST_MAIN(tst_QQuickMultiPointTouchArea)
861 #include "tst_qquickmultipointtoucharea.moc"