39
39
// Because QSignalSpy(UCSwipeArea, SIGNAL(UCSwipeArea::Status)) simply
41
class StatusSpy : public QObject {
41
class StatusSpy : public UCSwipeAreaStatusListener
44
StatusSpy(UCSwipeArea *edgeDragArea) {
46
connect(edgeDragArea->d, &UCSwipeAreaPrivate::statusChanged,
47
this, &StatusSpy::onStatusChanged);
44
StatusSpy(UCSwipeArea *edgeDragArea)
45
: m_edgeDragArea(edgeDragArea)
48
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(m_edgeDragArea);
49
d->addStatusChangeListener(this);
53
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(m_edgeDragArea);
54
d->removeStatusChangeListener(this);
49
57
bool recognized() {
50
58
return m_recognized;
54
void onStatusChanged(UCSwipeAreaPrivate::Status status) {
62
void swipeStatusChanged(UCSwipeAreaPrivate::Status, UCSwipeAreaPrivate::Status status) override
55
64
m_recognized |= status == UCSwipeAreaPrivate::Recognized;
68
UCSwipeArea *m_edgeDragArea;
207
217
UCSwipeArea *edgeDragArea =
208
218
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
209
219
QVERIFY(edgeDragArea != 0);
210
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
211
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
220
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
221
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
222
d->setTimeSource(m_fakeTimerFactory->timeSource());
213
224
QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea);
214
225
QPointF touchPoint = initialtouchPosition;
216
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2.0;
227
qreal desiredDragDistance = d->distanceThreshold * 2.0;
217
228
QPointF dragDirectionVector(1.0, 0.0);
218
qreal touchStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
229
qreal touchStepDistance = d->distanceThreshold * 0.1f;
219
230
// make sure we are above maximum time
220
int touchStepTimeMs = edgeDragArea->d->maxTime / 20. ;
231
int touchStepTimeMs = d->maxTime / 20. ;
221
232
QPointF touchMovement = dragDirectionVector * touchStepDistance;
223
234
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
241
252
passTime(touchStepTimeMs);
242
253
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
243
254
} while ((touchPoint - initialtouchPosition).manhattanLength() < desiredDragDistance
244
|| m_fakeTimerFactory->timeSource()->msecsSinceReference() < (edgeDragArea->d->compositionTime * 1.5f));
255
|| m_fakeTimerFactory->timeSource()->msecsSinceReference() < (d->compositionTime * 1.5f));
246
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
257
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
248
259
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
259
270
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
260
271
QVERIFY(edgeDragArea != 0);
261
272
AbstractTimer *fakeTimer = m_fakeTimerFactory->createTimer();
262
edgeDragArea->d->setRecognitionTimer(fakeTimer);
263
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
273
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
274
d->setRecognitionTimer(fakeTimer);
275
d->setTimeSource(m_fakeTimerFactory->timeSource());
265
277
int timeStepMs = 5; // some arbitrary small value.
268
280
QPointF touchPoint = initialtouchPosition;
270
282
QPointF dragDirectionVector(1.0, 0.0);
271
QPointF touchMovement = dragDirectionVector * (edgeDragArea->d->distanceThreshold * 0.2f);
283
QPointF touchMovement = dragDirectionVector * (d->distanceThreshold * 0.2f);
273
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
285
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
274
286
QVERIFY(!fakeTimer->isRunning());
276
288
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
278
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
290
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
279
291
QVERIFY(fakeTimer->isRunning());
281
293
// Move beyond distance threshold and composition time to ensure recognition
282
while (m_fakeTimerFactory->timeSource()->msecsSinceReference() <= edgeDragArea->d->compositionTime ||
283
(touchPoint - initialtouchPosition).manhattanLength() <= edgeDragArea->d->distanceThreshold) {
294
while (m_fakeTimerFactory->timeSource()->msecsSinceReference() <= d->compositionTime ||
295
(touchPoint - initialtouchPosition).manhattanLength() <= d->distanceThreshold) {
285
QCOMPARE(edgeDragArea->d->status == UCSwipeAreaPrivate::Undecided, fakeTimer->isRunning());
297
QCOMPARE(d->status == UCSwipeAreaPrivate::Undecided, fakeTimer->isRunning());
287
299
touchPoint += touchMovement;
288
300
passTime(timeStepMs);
289
301
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
292
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
304
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
293
305
QVERIFY(!fakeTimer->isRunning());
302
314
UCSwipeArea *edgeDragArea =
303
315
m_view->rootObject()->findChild<UCSwipeArea*>("hnDragArea");
304
316
QVERIFY(edgeDragArea != 0);
305
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
306
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
317
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
318
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
319
d->setTimeSource(m_fakeTimerFactory->timeSource());
307
320
edgeDragArea->setImmediateRecognition(true);
309
322
QPointF touchScenePosition(m_view->width() - (edgeDragArea->width()/2.0f), m_view->height()/2.0f);
328
341
UCSwipeArea *edgeDragArea =
329
342
m_view->rootObject()->findChild<UCSwipeArea*>("vnDragArea");
330
343
QVERIFY(edgeDragArea != 0);
331
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
332
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
344
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
345
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
346
d->setTimeSource(m_fakeTimerFactory->timeSource());
333
347
edgeDragArea->setImmediateRecognition(true);
335
349
QPointF touchScenePosition(m_view->width()/2.0f, m_view->height() - (edgeDragArea->height()/2.0f));
356
370
UCSwipeArea *edgeDragArea =
357
371
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
358
372
QVERIFY(edgeDragArea != 0);
359
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
360
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
373
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
374
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
375
d->setTimeSource(m_fakeTimerFactory->timeSource());
362
377
// Make touches evenly spaced along the edgeDragArea
363
378
QPoint touchAPos(edgeDragArea->width()/2.0f, m_view->height()*0.33f);
371
386
QTest::touchEvent(m_view, m_device)
372
387
.press(0, touchAPos);
374
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
389
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
376
391
passTime(timeStepMsecs);
377
392
QTest::touchEvent(m_view, m_device)
381
396
// A second touch point appeared during recognition, reject immediately as this
382
397
// can't be a single-touch gesture anymore.
383
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
398
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
385
400
passTime(timeStepMsecs);
386
401
QTest::touchEvent(m_view, m_device)
387
402
.release(0, touchAPos)
388
403
.move(1, touchBPos);
390
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
405
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
392
407
passTime(timeStepMsecs);
393
408
QTest::touchEvent(m_view, m_device)
394
409
.release(1, touchBPos);
396
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
411
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
398
413
// Perform the second two-finger tap
401
416
QTest::touchEvent(m_view, m_device)
402
417
.press(0, touchAPos);
404
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
419
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
406
421
passTime(timeStepMsecs);
407
422
QTest::touchEvent(m_view, m_device)
408
423
.move(0, touchAPos)
409
424
.press(1, touchBPos);
411
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
426
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
413
428
passTime(timeStepMsecs);
414
429
QTest::touchEvent(m_view, m_device)
415
430
.release(0, touchAPos)
416
431
.move(1, touchBPos);
418
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
433
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
420
435
passTime(timeStepMsecs);
421
436
QTest::touchEvent(m_view, m_device)
422
437
.release(1, touchBPos);
424
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
439
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
438
453
UCSwipeArea *edgeDragArea =
439
454
rightwardsLauncher->findChild<UCSwipeArea*>("hpDragArea");
440
455
Q_ASSERT(edgeDragArea != 0);
441
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
442
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
456
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
457
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
458
d->setTimeSource(m_fakeTimerFactory->timeSource());
444
460
QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea);
445
461
QPointF touchPoint = initialtouchPosition;
447
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2.0f;
463
qreal desiredDragDistance = d->distanceThreshold * 2.0f;
448
464
QPointF dragDirectionVector(1.0f, 0.0f);
450
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
466
qreal movementStepDistance = d->distanceThreshold * 0.1f;
451
467
QPointF touchMovement = dragDirectionVector * movementStepDistance;
452
468
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
453
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 1.5f) / totalMovementSteps;
469
int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps;
455
471
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
457
473
// Move it far ahead along the direction of the gesture
458
474
// rightwardsLauncher is a parent of our UCSwipeArea. So moving it will move our DDA
459
rightwardsLauncher->setX(rightwardsLauncher->x() + edgeDragArea->d->distanceThreshold * 5.0f);
475
rightwardsLauncher->setX(rightwardsLauncher->x() + d->distanceThreshold * 5.0f);
461
477
for (int i = 0; i < totalMovementSteps; ++i) {
462
478
touchPoint += touchMovement;
464
480
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
467
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
483
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
469
485
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
478
494
UCSwipeArea *edgeDragArea =
479
495
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
480
496
Q_ASSERT(edgeDragArea != 0);
481
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
482
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
497
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
498
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
499
d->setTimeSource(m_fakeTimerFactory->timeSource());
484
501
// Make touches evenly spaced along the edgeDragArea
485
502
QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.33f);
488
505
QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
490
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
507
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
492
509
// leave it lying around for some time
493
passTime(edgeDragArea->d->maxTime * 10);
495
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
497
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2.0f;
510
passTime(d->maxTime * 10);
512
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
514
qreal desiredDragDistance = d->distanceThreshold * 2.0f;
498
515
QPointF dragDirectionVector(1.0f, 0.0f);
500
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
517
qreal movementStepDistance = d->distanceThreshold * 0.1f;
501
518
QPointF touchMovement = dragDirectionVector * movementStepDistance;
502
519
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
503
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 1.5f) / totalMovementSteps;
520
int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps;
505
522
QTest::touchEvent(m_view, m_device)
506
523
.move(0, touch0Pos)
507
524
.press(1, touch1Pos);
509
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
526
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
511
528
for (int i = 0; i < totalMovementSteps; ++i) {
512
529
touch1Pos += touchMovement.toPoint();
516
533
.move(1, touch1Pos);
519
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
536
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
521
538
QTest::touchEvent(m_view, m_device)
522
539
.move(0, touch0Pos)
523
540
.release(1, touch1Pos);
525
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
542
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
541
558
UCSwipeArea *edgeDragArea =
542
559
rightwardsLauncher->findChild<UCSwipeArea*>("hpDragArea");
543
560
Q_ASSERT(edgeDragArea != 0);
544
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
545
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
561
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
562
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
563
d->setTimeSource(m_fakeTimerFactory->timeSource());
547
565
QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea);
548
566
QPointF touchPoint = initialtouchPosition;
550
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2.0f;
568
qreal desiredDragDistance = d->distanceThreshold * 2.0f;
551
569
QPointF dragDirectionVector(0.0f, 1.0f);
553
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
571
qreal movementStepDistance = d->distanceThreshold * 0.1f;
554
572
QPointF touchMovement = dragDirectionVector * movementStepDistance;
555
573
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
556
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 1.5f) / totalMovementSteps;
574
int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps;
558
576
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
563
581
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
566
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
584
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
568
586
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
581
599
UCSwipeArea *edgeDragArea =
582
600
rightwardsLauncher->findChild<UCSwipeArea*>("hpDragArea");
583
601
Q_ASSERT(edgeDragArea != 0);
584
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
585
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
602
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
603
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
604
d->setTimeSource(m_fakeTimerFactory->timeSource());
587
606
// to disable the position smoothing so that we can more easily check distance values
588
607
edgeDragArea->setImmediateRecognition(true);
590
609
QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea);
591
610
QPointF touchPoint = initialtouchPosition;
593
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2.0f;
612
qreal desiredDragDistance = d->distanceThreshold * 2.0f;
595
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
614
qreal movementStepDistance = d->distanceThreshold * 0.1f;
596
615
QPointF touchMovement = dragDirectionVector * movementStepDistance;
597
616
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
598
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 1.5f) / totalMovementSteps;
617
int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps;
600
619
qint64 timestamp = 0;
639
658
UCSwipeArea *edgeDragArea =
640
659
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
641
660
Q_ASSERT(edgeDragArea != 0);
642
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
643
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
661
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
662
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
663
d->setTimeSource(m_fakeTimerFactory->timeSource());
645
665
QPointF touchPoint = calculateInitialtouchPosition(edgeDragArea);
647
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2.0f;
667
qreal desiredDragDistance = d->distanceThreshold * 2.0f;
648
668
QPointF dragDirectionVector(1., 0.); // horizontal positive
650
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
670
qreal movementStepDistance = d->distanceThreshold * 0.1f;
651
671
QPointF touchMovement = dragDirectionVector * movementStepDistance;
652
672
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
653
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 1.5f) / totalMovementSteps;
673
int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps;
655
675
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
660
680
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
663
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
683
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
664
684
QCOMPARE(edgeDragArea->dragging(), true);
666
686
// disable the swipeArea while it's being dragged.
667
687
edgeDragArea->setEnabled(false);
669
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
689
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
670
690
QCOMPARE(edgeDragArea->dragging(), false);
672
692
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
677
697
UCSwipeArea *edgeDragArea =
678
698
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
679
699
Q_ASSERT(edgeDragArea != 0);
680
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
681
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
700
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
701
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
702
d->setTimeSource(m_fakeTimerFactory->timeSource());
683
704
// Disable some constraints we're not interested in
684
edgeDragArea->d->setMaxTime(60 * 1000);
705
d->setMaxTime(60 * 1000);
686
707
// And ensure others have the values we want
687
edgeDragArea->d->compositionTime = 60;
708
d->compositionTime = 60;
689
710
// Put an item right behind edgeDragArea to receive the touches ignored by it
690
711
DummyItem *dummyItem = new DummyItem;
702
723
QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
704
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
725
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
706
727
// We are now going to be way beyond compositionTime
707
passTime(edgeDragArea->d->compositionTime*3);
728
passTime(d->compositionTime*3);
709
730
QTest::touchEvent(m_view, m_device)
710
731
.move(0, touch0Pos)
752
773
UCSwipeArea *edgeDragArea =
753
774
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
754
775
Q_ASSERT(edgeDragArea != 0);
755
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
756
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
776
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
777
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
778
d->setTimeSource(m_fakeTimerFactory->timeSource());
758
780
// Disable some constraints we're not interested in
759
edgeDragArea->d->setMaxTime(60 * 1000);
781
d->setMaxTime(60 * 1000);
761
783
// Put an item right in front of edgeDragArea
762
784
DummyItem *dummyItem = new DummyItem(edgeDragArea->parentItem());
776
798
QTest::touchEvent(m_view, m_device).press(0, touchPosition);
778
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
800
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
780
802
m_touchRegistry->requestTouchOwnership(0, dummyItem);
782
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
804
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
784
806
dummyItem->grabTouchPoints({0});
785
807
dummyItem->touchEventHandler = [&](QTouchEvent *event) { event->accept(); };
788
810
QTest::touchEvent(m_view, m_device).release(0, touchPosition);
790
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
812
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
792
QVERIFY(edgeDragArea->d->activeTouches.isEmpty());
814
QVERIFY(d->activeTouches.isEmpty());
795
817
void tst_UCSwipeArea::threeFingerDrag()
797
819
UCSwipeArea *edgeDragArea =
798
820
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
799
821
Q_ASSERT(edgeDragArea != 0);
800
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
801
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
822
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
823
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
824
d->setTimeSource(m_fakeTimerFactory->timeSource());
803
826
// Disable some constraints we're not interested in
804
edgeDragArea->d->setMaxTime(60 * 1000);
827
d->setMaxTime(60 * 1000);
806
829
// And ensure others have the values we want
807
edgeDragArea->d->compositionTime = 60;
830
d->compositionTime = 60;
809
832
// Make touches evenly spaced along the edgeDragArea
810
833
QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.25f);
814
837
QTest::touchEvent(m_view, m_device)
815
838
.press(0, touch0Pos);
817
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
840
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
820
843
QTest::touchEvent(m_view, m_device)
821
844
.move(0, touch0Pos)
822
845
.press(1, touch1Pos);
824
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
847
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
827
850
QTest::touchEvent(m_view, m_device)
829
852
.move(1, touch1Pos)
830
853
.press(2, touch2Pos);
832
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
855
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
835
858
QTest::touchEvent(m_view, m_device)
866
889
UCSwipeArea *edgeDragArea =
867
890
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
868
891
Q_ASSERT(edgeDragArea != 0);
869
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
870
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
892
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
893
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
894
d->setTimeSource(m_fakeTimerFactory->timeSource());
872
896
// Disable the minimum amount of constraints to ensure immediate recognition
873
edgeDragArea->d->setDistanceThreshold(0);
874
edgeDragArea->d->compositionTime = 0;
897
d->setDistanceThreshold(0);
898
d->compositionTime = 0;
876
900
// Put an item right behind edgeDragArea to receive the touches ignored by it
877
901
DummyItem *dummyItem = new DummyItem;
890
914
QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
892
916
// check for immediate recognition
893
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
917
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
895
919
// and it is pressed
896
920
QCOMPARE(edgeDragArea->pressed(), true);
906
930
UCSwipeArea *edgeDragArea =
907
931
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
908
932
Q_ASSERT(edgeDragArea != 0);
909
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
910
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
933
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
934
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
935
d->setTimeSource(m_fakeTimerFactory->timeSource());
912
937
QPointF touchPoint = calculateInitialtouchPosition(edgeDragArea);
914
939
// Move less than the minimum needed for the drag gesture recognition
915
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 0.5f;
940
qreal desiredDragDistance = d->distanceThreshold * 0.5f;
916
941
QPointF dragDirectionVector(1., 0.); // horizontal positive
918
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
943
qreal movementStepDistance = d->distanceThreshold * 0.1f;
919
944
QPointF touchMovement = dragDirectionVector * movementStepDistance;
920
945
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
921
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 0.8f) / totalMovementSteps;
946
int movementTimeStepMs = (d->compositionTime * 0.8f) / totalMovementSteps;
923
948
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
928
953
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
931
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
956
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
933
958
// edgeDragArea should be an undecided candidate
952
977
QCOMPARE(touchInfo->candidates.size(), 0);
955
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
980
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
957
982
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
970
995
UCSwipeArea *edgeDragArea =
971
996
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
972
997
QVERIFY(edgeDragArea != nullptr);
973
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
974
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
998
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
999
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1000
d->setTimeSource(m_fakeTimerFactory->timeSource());
976
1002
QQuickMouseArea *mouseArea =
977
1003
m_view->rootObject()->findChild<QQuickMouseArea*>("mouseArea");
982
1008
QPointF initialtouchPosition = calculateInitialtouchPosition(edgeDragArea);
983
1009
QPointF touchPoint = initialtouchPosition;
985
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2;
1011
qreal desiredDragDistance = d->distanceThreshold * 2;
986
1012
QPointF dragDirectionVector(1.0f, 0.0f); // rightwards
987
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
1013
qreal movementStepDistance = d->distanceThreshold * 0.1f;
988
1014
QPointF touchMovement = dragDirectionVector * movementStepDistance;
989
1015
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
990
int movementTimeStepMs = (edgeDragArea->d->compositionTime * 1.5f) / totalMovementSteps;
1016
int movementTimeStepMs = (d->compositionTime * 1.5f) / totalMovementSteps;
992
1018
QCOMPARE(mouseArea->pressed(), false);
1008
1034
// As the UCSwipeArea recognizes the gesture, it grabs the touch from the MouseArea,
1009
1035
// which should make the MouseArea get a cancelation event, which will then cause it to
1010
1036
// reset its state (going back to "unpressed"/"released").
1011
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
1037
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
1012
1038
QCOMPARE(mouseArea->pressed(), false);
1013
1039
QCOMPARE(mouseAreaSpy.canceledCount, 1);
1020
1046
UCSwipeArea *edgeDragArea =
1021
1047
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
1022
1048
QVERIFY(edgeDragArea != 0);
1023
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1024
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1049
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
1050
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1051
d->setTimeSource(m_fakeTimerFactory->timeSource());
1026
1053
QPointF touch0 = edgeDragArea->mapToScene(
1027
1054
QPointF(edgeDragArea->width()*0.5, edgeDragArea->height()*0.3));
1029
qreal desiredDragDistance = edgeDragArea->d->distanceThreshold * 2;
1056
qreal desiredDragDistance = d->distanceThreshold * 2;
1030
1057
QPointF dragDirectionVector(1.0f, 0.0f); // rightwards
1031
qreal movementStepDistance = edgeDragArea->d->distanceThreshold * 0.1f;
1058
qreal movementStepDistance = d->distanceThreshold * 0.1f;
1032
1059
QPointF touchMovement = dragDirectionVector * movementStepDistance;
1033
1060
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
1034
int movementTimeStepMs = (edgeDragArea->d->maxTime * 0.4f) / totalMovementSteps;
1061
int movementTimeStepMs = (d->maxTime * 0.4f) / totalMovementSteps;
1036
1063
QTest::touchEvent(m_view, m_device).press(0, touch0.toPoint());
1037
1064
for (int i = 0; i < totalMovementSteps; ++i) {
1039
1066
passTime(movementTimeStepMs);
1040
1067
QTest::touchEvent(m_view, m_device).move(0, touch0.toPoint());
1042
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
1069
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
1044
1071
QPointF touch1 = edgeDragArea->mapToScene(
1045
1072
QPointF(edgeDragArea->width()*0.5, edgeDragArea->height()*0.6));
1054
1081
.move(0, touch0.toPoint())
1055
1082
.move(1, touch1.toPoint());
1057
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Recognized);
1084
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Recognized);
1059
1086
QTest::touchEvent(m_view, m_device)
1060
1087
.release(0, touch0.toPoint())
1061
1088
.move(1, touch1.toPoint());
1063
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
1090
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
1065
1092
touch1 += touchMovement;
1066
1093
passTime(movementTimeStepMs);
1067
1094
QTest::touchEvent(m_view, m_device)
1068
1095
.move(1, touch1.toPoint());
1070
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
1097
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
1072
1099
QPointF touch2 = edgeDragArea->mapToScene(
1073
1100
QPointF(edgeDragArea->width()*0.5, edgeDragArea->height()*0.9));
1075
passTime(edgeDragArea->d->compositionTime + movementTimeStepMs);
1102
passTime(d->compositionTime + movementTimeStepMs);
1076
1103
QTest::touchEvent(m_view, m_device)
1077
1104
.move(1, touch1.toPoint())
1078
1105
.press(2, touch2.toPoint());
1080
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::Undecided);
1081
QCOMPARE(edgeDragArea->d->touchId, 2);
1107
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::Undecided);
1108
QCOMPARE(d->touchId, 2);
1083
1110
touch2 += touchMovement;
1084
1111
passTime(movementTimeStepMs);
1101
1128
QTest::touchEvent(m_view, m_device)
1102
1129
.release(2, touch2.toPoint());
1104
QCOMPARE((int)edgeDragArea->d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
1131
QCOMPARE((int)d->status, (int)UCSwipeAreaPrivate::WaitingForTouch);
1115
1142
UCSwipeArea *edgeDragArea =
1116
1143
m_view->rootObject()->findChild<UCSwipeArea*>("hnDragArea");
1117
1144
QVERIFY(edgeDragArea != nullptr);
1118
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1119
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1145
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
1146
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1147
d->setTimeSource(m_fakeTimerFactory->timeSource());
1121
1149
StatusSpy *statusSpy = new StatusSpy(edgeDragArea);
1123
edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1151
d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1125
1153
sendTouchPress(319744, 0, QPointF(767.001, 719.719));
1126
1154
sendTouchUpdate(319765, 0, QPointF(765.744,729.973));
1141
1169
sendTouchUpdate(320171, 0, QPointF(447.232,1012.08));
1142
1170
sendTouchRelease(320171, 0, QPointF(447.232,1012.08));
1144
QCOMPARE(statusSpy->recognized(), true);
1172
QTRY_COMPARE_WITH_TIMEOUT(statusSpy->recognized(), true, 500);
1146
1174
delete statusSpy;
1160
1188
UCSwipeArea *edgeDragArea =
1161
1189
m_view->rootObject()->findChild<UCSwipeArea*>("hnDragArea");
1162
1190
QVERIFY(edgeDragArea != nullptr);
1163
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1164
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1191
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
1192
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1193
d->setTimeSource(m_fakeTimerFactory->timeSource());
1166
edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1195
d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1168
1197
StatusSpy *statusSpy = new StatusSpy(edgeDragArea);
1204
1233
UCSwipeArea *edgeDragArea =
1205
1234
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
1206
1235
QVERIFY(edgeDragArea != nullptr);
1207
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1208
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1236
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
1237
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1238
d->setTimeSource(m_fakeTimerFactory->timeSource());
1210
edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1240
d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1212
1242
StatusSpy *statusSpy = new StatusSpy(edgeDragArea);
1268
1298
UCSwipeArea *edgeDragArea =
1269
1299
m_view->rootObject()->findChild<UCSwipeArea*>("hpDragArea");
1270
1300
QVERIFY(edgeDragArea != nullptr);
1271
edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1272
edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1301
UCSwipeAreaPrivate *d = UCSwipeAreaPrivate::get(edgeDragArea);
1302
d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1303
d->setTimeSource(m_fakeTimerFactory->timeSource());
1274
edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1305
d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1276
1307
StatusSpy *statusSpy = new StatusSpy(edgeDragArea);