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 <qpa/qwindowsysteminterface.h>
45 #include <private/qquickmultipointtoucharea_p.h>
46 #include <private/qquickflickable_p.h>
47 #include <QtQuick/qquickview.h>
48 #include "../../shared/util.h"
50 class tst_QQuickMultiPointTouchArea : public QQmlDataTest
54 tst_QQuickMultiPointTouchArea() : device(0) { }
57 QQmlDataTest::initTestCase();
59 device = new QTouchDevice;
60 device->setType(QTouchDevice::TouchScreen);
61 QWindowSystemInterface::registerTouchDevice(device);
64 void cleanupTestCase() {}
70 void nonOverlapping();
75 void transformedTouchArea_data();
76 void transformedTouchArea();
79 QQuickView *createAndShowView(const QString &file);
83 void tst_QQuickMultiPointTouchArea::properties()
85 QQuickView *canvas = createAndShowView("properties.qml");
86 QVERIFY(canvas->rootObject() != 0);
88 QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
91 QCOMPARE(area->minimumTouchPoints(), 2);
92 QCOMPARE(area->maximumTouchPoints(), 4);
94 QQmlListReference ref(area, "touchPoints");
95 QCOMPARE(ref.count(), 4);
100 void tst_QQuickMultiPointTouchArea::signalTest()
102 QQuickView *canvas = createAndShowView("signalTest.qml");
103 QVERIFY(canvas->rootObject() != 0);
105 QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
114 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
116 sequence.press(0, p1).press(1, p2).commit();
118 QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
119 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
120 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
121 QCOMPARE(area->property("touchCount").toInt(), 2);
122 QMetaObject::invokeMethod(area, "clearCounts");
124 sequence.stationary(0).stationary(1).press(2, p3).commit();
126 QCOMPARE(area->property("touchPointPressCount").toInt(), 1);
127 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
128 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
129 QCOMPARE(area->property("touchCount").toInt(), 3);
130 QMetaObject::invokeMethod(area, "clearCounts");
134 sequence.move(0, p1).move(1, p2).stationary(2).commit();
136 QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
137 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 2);
138 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
139 QCOMPARE(area->property("touchCount").toInt(), 3);
140 QMetaObject::invokeMethod(area, "clearCounts");
143 sequence.release(0, p1).release(1, p2)
144 .move(2, p3).press(3, p4).press(4, p5).commit();
146 QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
147 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 1);
148 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 2);
149 QCOMPARE(area->property("touchCount").toInt(), 3);
150 QMetaObject::invokeMethod(area, "clearCounts");
152 sequence.release(2, p3).release(3, p4).release(4, p5).commit();
154 QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
155 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
156 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 3);
157 QCOMPARE(area->property("touchCount").toInt(), 0);
158 QCOMPARE(area->property("touchUpdatedHandled").toBool(), true);
159 QMetaObject::invokeMethod(area, "clearCounts");
164 void tst_QQuickMultiPointTouchArea::release()
166 QQuickView *canvas = createAndShowView("basic.qml");
167 QVERIFY(canvas->rootObject() != 0);
169 QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
171 QCOMPARE(point1->pressed(), false);
175 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
177 sequence.press(0, p1).commit();
179 QCOMPARE(point1->pressed(), true);
183 sequence.move(0, p1).commit();
185 QCOMPARE(point1->pressed(), true);
186 QCOMPARE(point1->x(), qreal(20)); QCOMPARE(point1->y(), qreal(110));
190 sequence.release(0, p1).commit();
192 //test that a release without a prior move to the release position successfully updates the point's position
193 QCOMPARE(point1->pressed(), false);
194 QCOMPARE(point1->x(), qreal(24)); QCOMPARE(point1->y(), qreal(120));
199 void tst_QQuickMultiPointTouchArea::reuse()
201 QQuickView *canvas = createAndShowView("basic.qml");
202 QVERIFY(canvas->rootObject() != 0);
204 QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
205 QQuickTouchPoint *point2 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
206 QQuickTouchPoint *point3 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point3");
208 QCOMPARE(point1->pressed(), false);
209 QCOMPARE(point2->pressed(), false);
216 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
218 sequence.press(0, p1).press(1, p2).commit();
220 QCOMPARE(point1->pressed(), true);
221 QCOMPARE(point2->pressed(), true);
222 QCOMPARE(point3->pressed(), false);
224 sequence.release(0, p1).stationary(1).press(2, p3).commit();
226 //we shouldn't reuse point 1 yet
227 QCOMPARE(point1->pressed(), false);
228 QCOMPARE(point2->pressed(), true);
229 QCOMPARE(point3->pressed(), true);
231 //back to base state (no touches)
232 sequence.release(1, p2).release(2, p3).commit();
234 QCOMPARE(point1->pressed(), false);
235 QCOMPARE(point2->pressed(), false);
236 QCOMPARE(point3->pressed(), false);
238 sequence.press(0, p1).press(1, p2).commit();
240 QCOMPARE(point1->pressed(), true);
241 QCOMPARE(point2->pressed(), true);
242 QCOMPARE(point3->pressed(), false);
244 sequence.release(0, p1).stationary(1).commit();
246 QCOMPARE(point1->pressed(), false);
247 QCOMPARE(point2->pressed(), true);
248 QCOMPARE(point3->pressed(), false);
250 sequence.press(4, p4).stationary(1).commit();
252 //the new touch point should reuse point 1
253 QCOMPARE(point1->pressed(), true);
254 QCOMPARE(point2->pressed(), true);
255 QCOMPARE(point3->pressed(), false);
257 QCOMPARE(point1->x(), qreal(80)); QCOMPARE(point1->y(), qreal(100));
262 void tst_QQuickMultiPointTouchArea::nonOverlapping()
264 QQuickView *canvas = createAndShowView("nonOverlapping.qml");
265 QVERIFY(canvas->rootObject() != 0);
267 QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
268 QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
269 QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
270 QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
271 QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
273 QCOMPARE(point11->pressed(), false);
274 QCOMPARE(point12->pressed(), false);
275 QCOMPARE(point21->pressed(), false);
276 QCOMPARE(point22->pressed(), false);
277 QCOMPARE(point23->pressed(), false);
285 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
287 sequence.press(0, p1).commit();
289 QCOMPARE(point11->pressed(), false);
290 QCOMPARE(point12->pressed(), false);
291 QCOMPARE(point21->pressed(), false);
292 QCOMPARE(point22->pressed(), false);
293 QCOMPARE(point23->pressed(), false);
295 sequence.stationary(0).press(1, p2).commit();
297 QCOMPARE(point11->pressed(), true);
298 QCOMPARE(point12->pressed(), true);
299 QCOMPARE(point21->pressed(), false);
300 QCOMPARE(point22->pressed(), false);
301 QCOMPARE(point23->pressed(), false);
303 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
304 QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
308 sequence.move(0, p1).move(1, p2).commit();
310 QCOMPARE(point11->pressed(), true);
311 QCOMPARE(point12->pressed(), true);
312 QCOMPARE(point21->pressed(), false);
313 QCOMPARE(point22->pressed(), false);
314 QCOMPARE(point23->pressed(), false);
316 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
317 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
319 sequence.stationary(0).stationary(1).press(2, p3).commit();
321 QCOMPARE(point11->pressed(), true);
322 QCOMPARE(point12->pressed(), true);
323 QCOMPARE(point21->pressed(), false);
324 QCOMPARE(point22->pressed(), false);
325 QCOMPARE(point23->pressed(), false);
327 sequence.stationary(0).stationary(1).stationary(2).press(3, p4).press(4, p5).commit();
329 QCOMPARE(point11->pressed(), true);
330 QCOMPARE(point12->pressed(), true);
331 QCOMPARE(point21->pressed(), true);
332 QCOMPARE(point22->pressed(), true);
333 QCOMPARE(point23->pressed(), true);
335 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
336 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
337 QCOMPARE(point21->x(), qreal(60)); QCOMPARE(point21->y(), qreal(20));
338 QCOMPARE(point22->x(), qreal(80)); QCOMPARE(point22->y(), qreal(20));
339 QCOMPARE(point23->x(), qreal(100)); QCOMPARE(point23->y(), qreal(20));
346 sequence.move(0, p1).move(1, p2).move(2, p3).move(3, p4).move(4, p5).commit();
348 QCOMPARE(point11->pressed(), true);
349 QCOMPARE(point12->pressed(), true);
350 QCOMPARE(point21->pressed(), true);
351 QCOMPARE(point22->pressed(), true);
352 QCOMPARE(point23->pressed(), true);
354 QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
355 QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
356 QCOMPARE(point21->x(), qreal(63)); QCOMPARE(point21->y(), qreal(20));
357 QCOMPARE(point22->x(), qreal(81)); QCOMPARE(point22->y(), qreal(19));
358 QCOMPARE(point23->x(), qreal(93)); QCOMPARE(point23->y(), qreal(30));
360 sequence.release(0, p1).release(1, p2).release(2, p3).release(3, p4).release(4, p5).commit();
362 QCOMPARE(point11->pressed(), false);
363 QCOMPARE(point12->pressed(), false);
364 QCOMPARE(point21->pressed(), false);
365 QCOMPARE(point22->pressed(), false);
366 QCOMPARE(point23->pressed(), false);
371 void tst_QQuickMultiPointTouchArea::nested()
373 QQuickView *canvas = createAndShowView("nested.qml");
374 QVERIFY(canvas->rootObject() != 0);
376 QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
377 QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
378 QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
379 QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
380 QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
382 QCOMPARE(point11->pressed(), false);
383 QCOMPARE(point12->pressed(), false);
384 QCOMPARE(point21->pressed(), false);
385 QCOMPARE(point22->pressed(), false);
386 QCOMPARE(point23->pressed(), false);
392 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
394 sequence.press(0, p1).commit();
396 QCOMPARE(point11->pressed(), false);
397 QCOMPARE(point12->pressed(), false);
398 QCOMPARE(point21->pressed(), false);
399 QCOMPARE(point22->pressed(), false);
400 QCOMPARE(point23->pressed(), false);
402 sequence.stationary(0).press(1, p2).commit();
404 QCOMPARE(point11->pressed(), true);
405 QCOMPARE(point12->pressed(), true);
406 QCOMPARE(point21->pressed(), false);
407 QCOMPARE(point22->pressed(), false);
408 QCOMPARE(point23->pressed(), false);
410 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
411 QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
415 sequence.move(0, p1).move(1, p2).commit();
417 QCOMPARE(point11->pressed(), true);
418 QCOMPARE(point12->pressed(), true);
419 QCOMPARE(point21->pressed(), false);
420 QCOMPARE(point22->pressed(), false);
421 QCOMPARE(point23->pressed(), false);
423 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
424 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
426 sequence.stationary(0).stationary(1).press(2, p3).commit();
428 QCOMPARE(point11->pressed(), true);
429 QCOMPARE(point12->pressed(), true);
430 QCOMPARE(point21->pressed(), true);
431 QCOMPARE(point22->pressed(), true);
432 QCOMPARE(point23->pressed(), true);
434 //point11 should be same as point21, point12 same as point22
435 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
436 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
437 QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
438 QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
439 QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
441 sequence.stationary(0).stationary(1).stationary(2).press(3, QPoint(80,180)).press(4, QPoint(100,180)).commit();
443 QCOMPARE(point11->pressed(), true);
444 QCOMPARE(point12->pressed(), true);
445 QCOMPARE(point21->pressed(), true);
446 QCOMPARE(point22->pressed(), true);
447 QCOMPARE(point23->pressed(), true);
449 //new touch points should be ignored (have no impact on our existing touch points)
450 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
451 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
452 QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
453 QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
454 QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
456 sequence.stationary(0).stationary(1).stationary(2).release(3, QPoint(80,180)).release(4, QPoint(100,180)).commit();
461 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
463 QCOMPARE(point11->pressed(), true);
464 QCOMPARE(point12->pressed(), true);
465 QCOMPARE(point21->pressed(), true);
466 QCOMPARE(point22->pressed(), true);
467 QCOMPARE(point23->pressed(), true);
469 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
470 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
471 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
472 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
473 QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
478 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
480 QCOMPARE(point11->pressed(), false);
481 QCOMPARE(point12->pressed(), false);
482 QCOMPARE(point21->pressed(), true);
483 QCOMPARE(point22->pressed(), true);
484 QCOMPARE(point23->pressed(), true);
486 //first two remain the same (touches now grabbed by inner touch area)
487 QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
488 QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
489 QCOMPARE(point21->x(), qreal(28)); QCOMPARE(point21->y(), qreal(130));
490 QCOMPARE(point22->x(), qreal(79)); QCOMPARE(point22->y(), qreal(134));
491 QCOMPARE(point23->x(), qreal(66)); QCOMPARE(point23->y(), qreal(180));
493 sequence.release(0, p1).release(1, p2).release(2, p3).commit();
495 sequence.press(0, p1).commit();
497 QCOMPARE(point11->pressed(), false);
498 QCOMPARE(point12->pressed(), false);
499 QCOMPARE(point21->pressed(), false);
500 QCOMPARE(point22->pressed(), false);
501 QCOMPARE(point23->pressed(), false);
503 sequence.release(0, p1).commit();
505 //test with grabbing turned off
506 canvas->rootObject()->setProperty("grabInnerArea", false);
508 sequence.press(0, p1).press(1, p2).press(2, p3).commit();
510 QCOMPARE(point11->pressed(), true);
511 QCOMPARE(point12->pressed(), true);
512 QCOMPARE(point21->pressed(), true);
513 QCOMPARE(point22->pressed(), true);
514 QCOMPARE(point23->pressed(), true);
519 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
521 QCOMPARE(point11->pressed(), true);
522 QCOMPARE(point12->pressed(), true);
523 QCOMPARE(point21->pressed(), true);
524 QCOMPARE(point22->pressed(), true);
525 QCOMPARE(point23->pressed(), true);
527 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
528 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
529 QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
530 QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
531 QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
536 sequence.move(0, p1).move(1, p2).move(2, p3).commit();
538 QCOMPARE(point11->pressed(), true);
539 QCOMPARE(point12->pressed(), true);
540 QCOMPARE(point21->pressed(), true);
541 QCOMPARE(point22->pressed(), true);
542 QCOMPARE(point23->pressed(), true);
544 //all change (touches not grabbed by inner touch area)
545 QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
546 QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
547 QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
548 QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
549 QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
551 sequence.release(0, p1).release(1, p2).release(2, p3).commit();
556 void tst_QQuickMultiPointTouchArea::inFlickable()
558 QQuickView *canvas = createAndShowView("inFlickable.qml");
559 QVERIFY(canvas->rootObject() != 0);
561 QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(canvas->rootObject());
562 QVERIFY(flickable != 0);
564 QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
565 QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
567 QCOMPARE(point11->pressed(), false);
568 QCOMPARE(point12->pressed(), false);
573 //moving one point vertically
574 QTest::touchEvent(canvas, device).press(0, p1);
577 QTest::touchEvent(canvas, device).move(0, p1);
580 QTest::touchEvent(canvas, device).move(0, p1);
583 QTest::touchEvent(canvas, device).move(0, p1);
586 QTest::touchEvent(canvas, device).move(0, p1);
588 QVERIFY(flickable->contentY() < 0);
589 QCOMPARE(point11->pressed(), false);
590 QCOMPARE(point12->pressed(), false);
592 QTest::touchEvent(canvas, device).release(0, p1);
595 QTRY_VERIFY(!flickable->isMoving());
597 //moving two points vertically
599 QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
600 QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
602 QCOMPARE(point11->pressed(), true);
603 QCOMPARE(point12->pressed(), true);
604 QCOMPARE(flickable->property("cancelCount").toInt(), 0);
605 QCOMPARE(flickable->property("touchCount").toInt(), 2);
607 p1 += QPoint(0,15); p2 += QPoint(0,15);
608 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
609 QTest::mouseMove(canvas, p1);
611 p1 += QPoint(0,15); p2 += QPoint(0,15);
612 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
613 QTest::mouseMove(canvas, p1);
615 p1 += QPoint(0,15); p2 += QPoint(0,15);
616 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
617 QTest::mouseMove(canvas, p1);
619 p1 += QPoint(0,15); p2 += QPoint(0,15);
620 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
621 QTest::mouseMove(canvas, p1);
623 QVERIFY(flickable->contentY() < 0);
624 QCOMPARE(point11->pressed(), false);
625 QCOMPARE(point12->pressed(), false);
626 QCOMPARE(flickable->property("cancelCount").toInt(), 2);
627 QCOMPARE(flickable->property("touchCount").toInt(), 0);
629 QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
630 QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
633 QTRY_VERIFY(!flickable->isMoving());
635 //moving two points horizontally, then one point vertically
638 QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
639 QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
641 QCOMPARE(point11->pressed(), true);
642 QCOMPARE(point12->pressed(), true);
644 p1 += QPoint(15,0); p2 += QPoint(15,0);
645 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
646 QTest::mouseMove(canvas, p1);
648 p1 += QPoint(15,0); p2 += QPoint(15,0);
649 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
650 QTest::mouseMove(canvas, p1);
652 p1 += QPoint(15,0); p2 += QPoint(15,0);
653 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
654 QTest::mouseMove(canvas, p1);
656 p1 += QPoint(15,0); p2 += QPoint(15,0);
657 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
658 QTest::mouseMove(canvas, p1);
660 p1 += QPoint(0,15); p2 += QPoint(0,15);
661 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
662 QTest::mouseMove(canvas, p1);
664 p1 += QPoint(0,15); p2 += QPoint(0,15);
665 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
666 QTest::mouseMove(canvas, p1);
668 p1 += QPoint(0,15); p2 += QPoint(0,15);
669 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
670 QTest::mouseMove(canvas, p1);
672 p1 += QPoint(0,15); p2 += QPoint(0,15);
673 QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
674 QTest::mouseMove(canvas, p1);
676 QVERIFY(flickable->contentY() == 0);
677 QCOMPARE(point11->pressed(), true);
678 QCOMPARE(point12->pressed(), true);
680 QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
681 QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
687 // test that dragging out of a Flickable containing a MPTA doesn't harm Flickable's state.
688 void tst_QQuickMultiPointTouchArea::inFlickable2()
690 QQuickView *canvas = createAndShowView("inFlickable2.qml");
691 QVERIFY(canvas->rootObject() != 0);
693 QQuickFlickable *flickable = canvas->rootObject()->findChild<QQuickFlickable*>("flickable");
694 QVERIFY(flickable != 0);
696 QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
699 QCOMPARE(point11->pressed(), false);
703 // move point horizontally, out of Flickable area
704 QTest::touchEvent(canvas, device).press(0, p1);
705 QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
708 QTest::touchEvent(canvas, device).move(0, p1);
709 QTest::mouseMove(canvas, p1);
712 QTest::touchEvent(canvas, device).move(0, p1);
713 QTest::mouseMove(canvas, p1);
716 QTest::touchEvent(canvas, device).move(0, p1);
717 QTest::mouseMove(canvas, p1);
720 QTest::touchEvent(canvas, device).move(0, p1);
721 QTest::mouseMove(canvas, p1);
723 QVERIFY(!flickable->isMoving());
724 QVERIFY(point11->pressed());
726 QTest::touchEvent(canvas, device).release(0, p1);
727 QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
730 QTRY_VERIFY(!flickable->isMoving());
732 // Check that we can still move the Flickable
734 QTest::touchEvent(canvas, device).press(0, p1);
736 QCOMPARE(point11->pressed(), true);
739 QTest::touchEvent(canvas, device).move(0, p1);
742 QTest::touchEvent(canvas, device).move(0, p1);
745 QTest::touchEvent(canvas, device).move(0, p1);
748 QTest::touchEvent(canvas, device).move(0, p1);
750 QVERIFY(flickable->contentY() < 0);
751 QVERIFY(flickable->isMoving());
752 QCOMPARE(point11->pressed(), true);
754 QTest::touchEvent(canvas, device).release(0, p1);
757 QTRY_VERIFY(!flickable->isMoving());
764 void tst_QQuickMultiPointTouchArea::invisible()
766 QQuickView *canvas = createAndShowView("signalTest.qml");
767 QVERIFY(canvas->rootObject() != 0);
769 QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
772 area->setVisible(false);
777 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
779 sequence.press(0, p1).press(1, p2).commit();
781 QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
782 QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
783 QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
784 QCOMPARE(area->property("touchCount").toInt(), 0);
789 void tst_QQuickMultiPointTouchArea::transformedTouchArea_data()
791 QTest::addColumn<QPoint>("p1");
792 QTest::addColumn<QPoint>("p2");
793 QTest::addColumn<QPoint>("p3");
794 QTest::addColumn<int>("total1");
795 QTest::addColumn<int>("total2");
796 QTest::addColumn<int>("total3");
798 QTest::newRow("1st point inside")
799 << QPoint(140, 200) << QPoint(260, 260) << QPoint(0, 140) << 1 << 1 << 1;
801 QTest::newRow("2nd point inside")
802 << QPoint(260, 260) << QPoint(200, 200) << QPoint(0, 0) << 0 << 1 << 1;
804 QTest::newRow("3rd point inside")
805 << QPoint(140, 260) << QPoint(260, 140) << QPoint(200, 140) << 0 << 0 << 1;
807 QTest::newRow("all points inside")
808 << QPoint(200, 140) << QPoint(200, 260) << QPoint(140, 200) << 1 << 2 << 3;
810 QTest::newRow("all points outside")
811 << QPoint(140, 140) << QPoint(260, 260) << QPoint(260, 140) << 0 << 0 << 0;
813 QTest::newRow("1st and 2nd points inside")
814 << QPoint(200, 260) << QPoint(200, 140) << QPoint(140, 140) << 1 << 2 << 2;
816 QTest::newRow("1st and 3rd points inside")
817 << QPoint(200, 200) << QPoint(0, 0) << QPoint(200, 260) << 1 << 1 << 2;
820 void tst_QQuickMultiPointTouchArea::transformedTouchArea()
829 QQuickView *canvas = createAndShowView("transformedMultiPointTouchArea.qml");
830 QVERIFY(canvas->rootObject() != 0);
832 QQuickMultiPointTouchArea *area = canvas->rootObject()->findChild<QQuickMultiPointTouchArea *>("touchArea");
835 QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
837 sequence.press(0, p1).commit();
838 QCOMPARE(area->property("pointCount").toInt(), total1);
840 sequence.stationary(0).press(1, p2).commit();
841 QCOMPARE(area->property("pointCount").toInt(), total2);
843 sequence.stationary(0).stationary(1).press(2, p3).commit();
844 QCOMPARE(area->property("pointCount").toInt(), total3);
849 QQuickView *tst_QQuickMultiPointTouchArea::createAndShowView(const QString &file)
851 QQuickView *canvas = new QQuickView(0);
852 canvas->setSource(testFileUrl(file));
854 canvas->requestActivateWindow();
855 QTest::qWaitForWindowShown(canvas);
860 QTEST_MAIN(tst_QQuickMultiPointTouchArea)
862 #include "tst_qquickmultipointtoucharea.moc"