diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-11-21 17:51:31 +0000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-21 19:01:16 +0100 |
commit | fbbc3cab4ac57b99387c7955e712cfea7cd72856 (patch) | |
tree | 25089694b0ca98571eca11c94ce5608012e428bc /src/declarative | |
parent | af0af6fa1ad428931c729738a14bdf6fbb910887 (diff) |
Adding custom easing curves to property animations
QDeclarativeEasingValueType gets the property customBezierCurve.
This allows to define a custom easing curve as a cubic bezier curve.
Change-Id: I33ae128ce29bba2834eedcbb90a9769a5391f997
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/items/qquickcanvas.h | 3 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevaluetype.cpp | 46 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevaluetype_p.h | 7 |
3 files changed, 54 insertions, 2 deletions
diff --git a/src/declarative/items/qquickcanvas.h b/src/declarative/items/qquickcanvas.h index a5a975785d..bf8693a354 100644 --- a/src/declarative/items/qquickcanvas.h +++ b/src/declarative/items/qquickcanvas.h @@ -52,9 +52,10 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QQuickItem; class QSGEngine; +class QQuickItem; class QSGTexture; +class QInputMethodEvent; class QQuickCanvasPrivate; class QOpenGLFramebufferObject; class QDeclarativeIncubationController; diff --git a/src/declarative/qml/qdeclarativevaluetype.cpp b/src/declarative/qml/qdeclarativevaluetype.cpp index 9a941e63f9..ffd0041f7e 100644 --- a/src/declarative/qml/qdeclarativevaluetype.cpp +++ b/src/declarative/qml/qdeclarativevaluetype.cpp @@ -958,6 +958,52 @@ void QDeclarativeEasingValueType::setPeriod(qreal period) easing.setPeriod(period); } +void QDeclarativeEasingValueType::setBezierCurve(const QVariantList &customCurveVariant) +{ + if (customCurveVariant.isEmpty()) + return; + + QVariantList variantList = customCurveVariant; + if ((variantList.count() % 6) == 0) { + bool allRealsOk = true; + QList<qreal> reals; + for (int i = 0; i < variantList.count(); i++) { + bool ok; + const qreal real = variantList.at(i).toReal(&ok); + reals.append(real); + if (!ok) + allRealsOk = false; + } + if (allRealsOk) { + QEasingCurve newEasingCurve(QEasingCurve::BezierSpline); + for (int i = 0; i < reals.count() / 6; i++) { + const qreal c1x = reals.at(i * 6); + const qreal c1y = reals.at(i * 6 + 1); + const qreal c2x = reals.at(i * 6 + 2); + const qreal c2y = reals.at(i * 6 + 3); + const qreal c3x = reals.at(i * 6 + 4); + const qreal c3y = reals.at(i * 6 + 5); + + const QPointF c1(c1x, c1y); + const QPointF c2(c2x, c2y); + const QPointF c3(c3x, c3y); + + newEasingCurve.addCubicBezierSegment(c1, c2, c3); + easing = newEasingCurve; + } + } + } +} + +QVariantList QDeclarativeEasingValueType::bezierCurve() const +{ + QVariantList rv; + QList<QPointF> points = easing.cubicBezierSpline(); + for (int ii = 0; ii < points.count(); ++ii) + rv << QVariant(points.at(ii).x()) << QVariant(points.at(ii).y()); + return rv; +} + QDeclarativeFontValueType::QDeclarativeFontValueType(QObject *parent) : QDeclarativeValueType(parent), pixelSizeSet(false), pointSizeSet(false) { diff --git a/src/declarative/qml/qdeclarativevaluetype_p.h b/src/declarative/qml/qdeclarativevaluetype_p.h index 1feab4147b..9f00d97800 100644 --- a/src/declarative/qml/qdeclarativevaluetype_p.h +++ b/src/declarative/qml/qdeclarativevaluetype_p.h @@ -456,6 +456,7 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeEasingValueType : public QDeclara Q_PROPERTY(qreal amplitude READ amplitude WRITE setAmplitude) Q_PROPERTY(qreal overshoot READ overshoot WRITE setOvershoot) Q_PROPERTY(qreal period READ period WRITE setPeriod) + Q_PROPERTY(QVariantList bezierCurve READ bezierCurve WRITE setBezierCurve) public: enum Type { Linear = QEasingCurve::Linear, @@ -480,7 +481,8 @@ public: InBounce = QEasingCurve::InBounce, OutBounce = QEasingCurve::OutBounce, InOutBounce = QEasingCurve::InOutBounce, OutInBounce = QEasingCurve::OutInBounce, InCurve = QEasingCurve::InCurve, OutCurve = QEasingCurve::OutCurve, - SineCurve = QEasingCurve::SineCurve, CosineCurve = QEasingCurve::CosineCurve + SineCurve = QEasingCurve::SineCurve, CosineCurve = QEasingCurve::CosineCurve, + Bezier = QEasingCurve::BezierSpline }; QDeclarativeEasingValueType(QObject *parent = 0); @@ -500,6 +502,9 @@ public: void setAmplitude(qreal); void setOvershoot(qreal); void setPeriod(qreal); + void setBezierCurve(const QVariantList &); + QVariantList bezierCurve() const; + private: QEasingCurve easing; |