704
700
QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
704
A Rightwards DDA that is rotated 90 degrees clockwise should recognize gestures
705
that are done downwards in scene coordinates. I.e. the gesture recognition direction
706
should be in local coordinates, not scene coordinates.
708
void tst_DirectionalDragArea::rotated()
710
QQuickItem *baseItem = m_view->rootObject()->findChild<QQuickItem*>("baseItem");
711
baseItem->setRotation(90.);
713
QQuickItem *rightwardsLauncher = m_view->rootObject()->findChild<QQuickItem*>("rightwardsLauncher");
714
Q_ASSERT(rightwardsLauncher != 0);
716
DirectionalDragArea *edgeDragArea =
717
rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
718
Q_ASSERT(edgeDragArea != 0);
719
edgeDragArea->setRecognitionTimer(fakeTimer);
720
edgeDragArea->setTimeSource(fakeTimeSource);
722
QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
723
QPointF touchPoint = initialTouchPos;
725
qreal desiredDragDistance = edgeDragArea->distanceThreshold()*2.0f;
726
QPointF dragDirectionVector(0.0f, 1.0f);
728
qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
729
QPointF touchMovement = dragDirectionVector * movementStepDistance;
730
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
731
int movementTimeStepMs = (edgeDragArea->compositionTime() * 1.5f) / totalMovementSteps;
733
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
735
for (int i = 0; i < totalMovementSteps; ++i) {
736
touchPoint += touchMovement;
737
passTime(movementTimeStepMs);
738
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
741
QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
743
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
746
void tst_DirectionalDragArea::sceneDistance()
748
QQuickItem *baseItem = m_view->rootObject()->findChild<QQuickItem*>("baseItem");
749
QFETCH(qreal, rotation);
750
QFETCH(QPointF, dragDirectionVector);
751
baseItem->setRotation(rotation);
753
QQuickItem *rightwardsLauncher = m_view->rootObject()->findChild<QQuickItem*>("rightwardsLauncher");
754
Q_ASSERT(rightwardsLauncher != 0);
756
DirectionalDragArea *edgeDragArea =
757
rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
758
Q_ASSERT(edgeDragArea != 0);
759
edgeDragArea->setRecognitionTimer(fakeTimer);
760
edgeDragArea->setTimeSource(fakeTimeSource);
762
QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
763
QPointF touchPoint = initialTouchPos;
765
qreal desiredDragDistance = edgeDragArea->distanceThreshold()*2.0f;
767
qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
768
QPointF touchMovement = dragDirectionVector * movementStepDistance;
769
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
770
int movementTimeStepMs = (edgeDragArea->compositionTime() * 1.5f) / totalMovementSteps;
772
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
774
for (int i = 0; i < totalMovementSteps; ++i) {
775
touchPoint += touchMovement;
776
passTime(movementTimeStepMs);
777
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
780
qreal actualDragDistance = ((qreal)totalMovementSteps) * movementStepDistance;
782
// DirectionalDragArea::sceneDistance() must match the actual drag distance as the
783
// drag was aligned with the gesture direction
784
// NB: qFuzzyCompare(), used internally by QCOMPARE(), is broken.
785
QVERIFY(qAbs(edgeDragArea->sceneDistance() - actualDragDistance) < 0.001);
787
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
790
void tst_DirectionalDragArea::sceneDistance_data()
792
QTest::addColumn<qreal>("rotation");
793
QTest::addColumn<QPointF>("dragDirectionVector");
795
QTest::newRow("not rotated") << 0. << QPointF(1., 0.);
796
QTest::newRow("rotated by 90 degrees") << 90. << QPointF(0., 1.);
800
Regression test for https://bugs.launchpad.net/unity8/+bug/1276122
803
If setting "enabled: false" while the DirectionalDragArea's (DDA) dragging
804
property is true, the DDA stays in that state and doesn't recover any more.
806
void tst_DirectionalDragArea::disabledWhileDragging()
808
DirectionalDragArea *edgeDragArea =
809
m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
810
Q_ASSERT(edgeDragArea != 0);
811
edgeDragArea->setRecognitionTimer(fakeTimer);
812
edgeDragArea->setTimeSource(fakeTimeSource);
814
QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
816
qreal desiredDragDistance = edgeDragArea->distanceThreshold()*2.0f;
817
QPointF dragDirectionVector(1., 0.); // horizontal positive
819
qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
820
QPointF touchMovement = dragDirectionVector * movementStepDistance;
821
int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
822
int movementTimeStepMs = (edgeDragArea->compositionTime() * 1.5f) / totalMovementSteps;
824
QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
826
for (int i = 0; i < totalMovementSteps; ++i) {
827
touchPoint += touchMovement;
828
passTime(movementTimeStepMs);
829
QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
832
QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
833
QCOMPARE(edgeDragArea->dragging(), true);
835
// disable the dragArea while it's being dragged.
836
edgeDragArea->setEnabled(false);
838
QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
839
QCOMPARE(edgeDragArea->dragging(), false);
841
QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
707
844
QTEST_MAIN(tst_DirectionalDragArea)
709
846
#include "tst_DirectionalDragArea.moc"