diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2011-09-01 08:47:56 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-09-08 00:05:26 +0200 |
commit | fee3fe7d76f1a4556130a097dceb818cc6f33c47 (patch) | |
tree | 21bef8d90e8b9fc02f05fefb8f8909faa05fc08e /tests/auto | |
parent | ca6d931bb7714de7293dab5d14a19f74dc98d103 (diff) |
Add new path functionality.
Introduces new elements PathCurve, PathArc, PathSvg,
PathAnimation, and PathInterpolator.
Change-Id: I0f5b6284511f332e826ed373018418d2e2a8c07e
Reviewed-on: http://codereview.qt-project.org/4220
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'tests/auto')
9 files changed, 373 insertions, 0 deletions
diff --git a/tests/auto/declarative/qdeclarativeanimations/data/pathAnimation.qml b/tests/auto/declarative/qdeclarativeanimations/data/pathAnimation.qml new file mode 100644 index 0000000000..d2006a1c6a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/pathAnimation.qml @@ -0,0 +1,27 @@ +import QtQuick 2.0 + +Rectangle { + width: 400 + height: 400 + + Rectangle { + id: redRect + color: "red" + width: 100; height: 100 + x: 50; y: 50 + } + + PathAnimation { + target: redRect + duration: 100; + path: Path { + startX: 50; startY: 50 + PathCubic { + x: 300; y: 300 + + control1X: 300; control1Y: 50 + control2X: 50; control2Y: 300 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/pathInterpolator.qml b/tests/auto/declarative/qdeclarativeanimations/data/pathInterpolator.qml new file mode 100644 index 0000000000..0104412d7c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/pathInterpolator.qml @@ -0,0 +1,13 @@ +import QtQuick 2.0 + +PathInterpolator { + path: Path { + startX: 50; startY: 50 + PathCubic { + x: 300; y: 300 + + control1X: 300; control1Y: 50 + control2X: 50; control2Y: 300 + } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/pathTransition.qml b/tests/auto/declarative/qdeclarativeanimations/data/pathTransition.qml new file mode 100644 index 0000000000..55ffc33f95 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/pathTransition.qml @@ -0,0 +1,41 @@ +import QtQuick 2.0 + +Rectangle { + width: 800 + height: 800 + + Rectangle { + id: redRect; objectName: "redRect" + color: "red" + width: 50; height: 50 + x: 500; y: 50 + } + + states: State { + name: "moved" + PropertyChanges { + target: redRect + x: 100; y: 700 + } + } + + transitions: Transition { + to: "moved"; reversible: true + PathAnimation { + id: pathAnim + target: redRect + duration: 300 + path: Path { + PathCurve { x: 100; y: 100 } + PathCurve { x: 200; y: 350 } + PathCurve { x: 600; y: 500 } + PathCurve {} + } + } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = parent.state == "moved" ? "" : "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp index 367de014b4..df840e9d5c 100644 --- a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp +++ b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp @@ -44,6 +44,8 @@ #include <QtDeclarative/qsgview.h> #include <QtDeclarative/private/qsgrectangle_p.h> #include <QtDeclarative/private/qdeclarativeanimation_p.h> +#include <QtDeclarative/private/qsganimation_p.h> +#include <QtDeclarative/private/qdeclarativepathinterpolator_p.h> #include <QtDeclarative/private/qsgitem_p.h> #include <QVariantAnimation> #include <QEasingCurve> @@ -68,6 +70,8 @@ private slots: void simpleNumber(); void simpleColor(); void simpleRotation(); + void simplePath(); + void pathInterpolator(); void alwaysRunToEnd(); void complete(); void resume(); @@ -77,6 +81,7 @@ private slots: void mixedTypes(); void properties(); void propertiesTransition(); + void pathTransition(); void disabledTransition(); void invalidDuration(); void attached(); @@ -213,6 +218,62 @@ void tst_qdeclarativeanimations::simpleRotation() QCOMPARE(rect.rotation(), qreal(135)); } +void tst_qdeclarativeanimations::simplePath() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathAnimation.qml")); + QSGRectangle *rect = qobject_cast<QSGRectangle*>(c.create()); + QVERIFY(rect); + + QSGRectangle *redRect = rect->findChild<QSGRectangle*>(); + QVERIFY(redRect); + QSGPathAnimation *pathAnim = rect->findChild<QSGPathAnimation*>(); + QVERIFY(pathAnim); + + pathAnim->start(); + pathAnim->pause(); + + pathAnim->setCurrentTime(50); + QCOMPARE(redRect->x(), qreal(175)); + QCOMPARE(redRect->y(), qreal(175)); + + pathAnim->setCurrentTime(100); + QCOMPARE(redRect->x(), qreal(300)); + QCOMPARE(redRect->y(), qreal(300)); + + //verify animation runs to end + pathAnim->start(); + QCOMPARE(redRect->x(), qreal(50)); + QCOMPARE(redRect->y(), qreal(50)); + QTRY_COMPARE(redRect->x(), qreal(300)); + QCOMPARE(redRect->y(), qreal(300)); +} + +void tst_qdeclarativeanimations::pathInterpolator() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathInterpolator.qml")); + QDeclarativePathInterpolator *interpolator = qobject_cast<QDeclarativePathInterpolator*>(c.create()); + QVERIFY(interpolator); + + QCOMPARE(interpolator->progress(), qreal(0)); + QCOMPARE(interpolator->x(), qreal(50)); + QCOMPARE(interpolator->y(), qreal(50)); + QCOMPARE(interpolator->angle(), qreal(0)); + + interpolator->setProgress(.5); + QCOMPARE(interpolator->progress(), qreal(.5)); + QCOMPARE(interpolator->x(), qreal(175)); + QCOMPARE(interpolator->y(), qreal(175)); + QCOMPARE(interpolator->angle(), qreal(270)); + + interpolator->setProgress(1); + QCOMPARE(interpolator->progress(), qreal(1)); + QCOMPARE(interpolator->x(), qreal(300)); + QCOMPARE(interpolator->y(), qreal(300)); + QCOMPARE(interpolator->angle(), qreal(0)); +} + void tst_qdeclarativeanimations::alwaysRunToEnd() { QSGRectangle rect; @@ -577,6 +638,26 @@ void tst_qdeclarativeanimations::propertiesTransition() } +void tst_qdeclarativeanimations::pathTransition() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathTransition.qml")); + QSGRectangle *rect = qobject_cast<QSGRectangle*>(c.create()); + QVERIFY(rect); + + QSGRectangle *myRect = rect->findChild<QSGRectangle*>("redRect"); + QVERIFY(myRect); + + QSGItemPrivate::get(rect)->setState("moved"); + QTRY_VERIFY(myRect->x() < 500 && myRect->x() > 100 && myRect->y() > 50 && myRect->y() < 700 ); //animation started + QTRY_VERIFY(qFuzzyCompare(myRect->x(), qreal(100)) && qFuzzyCompare(myRect->y(), qreal(700))); + QTest::qWait(100); + + QSGItemPrivate::get(rect)->setState(""); + QTRY_VERIFY(myRect->x() < 500 && myRect->x() > 100 && myRect->y() > 50 && myRect->y() < 700 ); //animation started + QTRY_VERIFY(qFuzzyCompare(myRect->x(), qreal(500)) && qFuzzyCompare(myRect->y(), qreal(50))); +} + void tst_qdeclarativeanimations::disabledTransition() { QDeclarativeEngine engine; diff --git a/tests/auto/declarative/qdeclarativepath/data/arc.qml b/tests/auto/declarative/qdeclarativepath/data/arc.qml new file mode 100644 index 0000000000..000221c784 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepath/data/arc.qml @@ -0,0 +1,11 @@ +import QtQuick 2.0 + +Path { + startX: 0; startY: 0 + + PathArc { + x: 100; y: 100 + radiusX: 100; radiusY: 100 + direction: PathArc.Clockwise + } +} diff --git a/tests/auto/declarative/qdeclarativepath/data/curve.qml b/tests/auto/declarative/qdeclarativepath/data/curve.qml new file mode 100644 index 0000000000..c571186496 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepath/data/curve.qml @@ -0,0 +1,9 @@ +import QtQuick 2.0 + +Path { + startX: 0; startY: 0 + + PathCurve { x: 100; y: 50 } + PathCurve { x: 50; y: 100 } + PathCurve { x: 100; y: 150 } +} diff --git a/tests/auto/declarative/qdeclarativepath/data/svg.qml b/tests/auto/declarative/qdeclarativepath/data/svg.qml new file mode 100644 index 0000000000..cec0f75061 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepath/data/svg.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Path { + PathSvg { path: "M200,300 Q400,50 600,300 T1000,300" } +} diff --git a/tests/auto/declarative/qdeclarativepath/qdeclarativepath.pro b/tests/auto/declarative/qdeclarativepath/qdeclarativepath.pro new file mode 100644 index 0000000000..d6fe1cf789 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepath/qdeclarativepath.pro @@ -0,0 +1,17 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativepath.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +QT += core-private gui-private v8-private declarative-private diff --git a/tests/auto/declarative/qdeclarativepath/tst_qdeclarativepath.cpp b/tests/auto/declarative/qdeclarativepath/tst_qdeclarativepath.cpp new file mode 100644 index 0000000000..d8a539ea2a --- /dev/null +++ b/tests/auto/declarative/qdeclarativepath/tst_qdeclarativepath.cpp @@ -0,0 +1,169 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtDeclarative/qdeclarativeengine.h> +#include <QtDeclarative/qdeclarativecomponent.h> +#include <QtDeclarative/private/qdeclarativepath_p.h> + +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativePath : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativePath() {} + +private slots: + void arc(); + void catmullromCurve(); + void svg(); +}; + +void tst_QDeclarativePath::arc() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/arc.qml")); + QDeclarativePath *obj = qobject_cast<QDeclarativePath*>(c.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->startX(), 0.); + QCOMPARE(obj->startY(), 0.); + + QDeclarativeListReference list(obj, "pathElements"); + QCOMPARE(list.count(), 1); + + QDeclarativePathArc* arc = qobject_cast<QDeclarativePathArc*>(list.at(0)); + QVERIFY(arc != 0); + QCOMPARE(arc->x(), 100.); + QCOMPARE(arc->y(), 100.); + QCOMPARE(arc->radiusX(), 100.); + QCOMPARE(arc->radiusY(), 100.); + QCOMPARE(arc->useLargeArc(), false); + QCOMPARE(arc->direction(), QDeclarativePathArc::Clockwise); + + QPainterPath path = obj->path(); + QVERIFY(path != QPainterPath()); + + QPointF pos = obj->pointAt(0); + QCOMPARE(pos, QPointF(0,0)); + pos = obj->pointAt(.25); + QCOMPARE(pos.toPoint(), QPoint(39,8)); //fuzzy compare + pos = obj->pointAt(.75); + QCOMPARE(pos.toPoint(), QPoint(92,61)); //fuzzy compare + pos = obj->pointAt(1); + QCOMPARE(pos, QPointF(100,100)); +} + +void tst_QDeclarativePath::catmullromCurve() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/curve.qml")); + QDeclarativePath *obj = qobject_cast<QDeclarativePath*>(c.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->startX(), 0.); + QCOMPARE(obj->startY(), 0.); + + QDeclarativeListReference list(obj, "pathElements"); + QCOMPARE(list.count(), 3); + + QDeclarativePathCatmullRomCurve* arc = qobject_cast<QDeclarativePathCatmullRomCurve*>(list.at(0)); +// QVERIFY(arc != 0); +// QCOMPARE(arc->x(), 100.); +// QCOMPARE(arc->y(), 100.); +// QCOMPARE(arc->radiusX(), 100.); +// QCOMPARE(arc->radiusY(), 100.); +// QCOMPARE(arc->useLargeArc(), false); +// QCOMPARE(arc->direction(), QDeclarativePathArc::Clockwise); + + QPainterPath path = obj->path(); + QVERIFY(path != QPainterPath()); + + QPointF pos = obj->pointAt(0); + QCOMPARE(pos, QPointF(0,0)); + pos = obj->pointAt(.25); + QCOMPARE(pos.toPoint(), QPoint(63,26)); //fuzzy compare + pos = obj->pointAt(.75); + QCOMPARE(pos.toPoint(), QPoint(51,105)); //fuzzy compare + pos = obj->pointAt(1); + QCOMPARE(pos, QPointF(100,150)); +} + +void tst_QDeclarativePath::svg() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/svg.qml")); + QDeclarativePath *obj = qobject_cast<QDeclarativePath*>(c.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->startX(), 0.); + QCOMPARE(obj->startY(), 0.); + + QDeclarativeListReference list(obj, "pathElements"); + QCOMPARE(list.count(), 1); + + QDeclarativePathSvg* svg = qobject_cast<QDeclarativePathSvg*>(list.at(0)); + QVERIFY(svg != 0); + QCOMPARE(svg->path(), QLatin1String("M200,300 Q400,50 600,300 T1000,300")); + + QPainterPath path = obj->path(); + QVERIFY(path != QPainterPath()); + + QPointF pos = obj->pointAt(0); + QCOMPARE(pos, QPointF(200,300)); + pos = obj->pointAt(.25); + QCOMPARE(pos.toPoint(), QPoint(400,175)); //fuzzy compare + pos = obj->pointAt(.75); + QCOMPARE(pos.toPoint(), QPoint(800,425)); //fuzzy compare + pos = obj->pointAt(1); + QCOMPARE(pos, QPointF(1000,300)); +} + + +QTEST_MAIN(tst_QDeclarativePath) + +#include "tst_qdeclarativepath.moc" |