diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp index efe1675fe5c..dec81abd8b0 100644 --- a/src/corelib/animation/qvariantanimation.cpp +++ b/src/corelib/animation/qvariantanimation.cpp @@ -230,7 +230,8 @@ void QVariantAnimationPrivate::recalculateCurrentInterval(bool force/*=false*/) return; const qreal endProgress = (direction == QAbstractAnimation::Forward) ? qreal(1) : qreal(0); - const qreal progress = easing.valueForProgress(((duration == 0) ? endProgress : qreal(currentTime) / qreal(duration))); + const qreal progress = easing.value().valueForProgress( + duration == 0 ? endProgress : qreal(currentTime) / qreal(duration)); //0 and 1 are still the boundaries if (force || (currentInterval.start.first > 0 && progress < currentInterval.start.first) @@ -386,8 +387,17 @@ QEasingCurve QVariantAnimation::easingCurve() const void QVariantAnimation::setEasingCurve(const QEasingCurve &easing) { Q_D(QVariantAnimation); + const bool valueChanged = easing != d->easing; d->easing = easing; d->recalculateCurrentInterval(); + if (valueChanged) + d->easing.notify(); +} + +QBindable QVariantAnimation::bindableEasingCurve() +{ + Q_D(QVariantAnimation); + return &d->easing; } typedef QList QInterpolatorVector; @@ -506,10 +516,19 @@ void QVariantAnimation::setDuration(int msecs) qWarning("QVariantAnimation::setDuration: cannot set a negative duration"); return; } - if (d->duration == msecs) + if (d->duration == msecs) { + d->duration.removeBindingUnlessInWrapper(); return; + } d->duration = msecs; d->recalculateCurrentInterval(); + d->duration.notify(); +} + +QBindable QVariantAnimation::bindableDuration() +{ + Q_D(QVariantAnimation); + return &d->duration; } /*! diff --git a/src/corelib/animation/qvariantanimation.h b/src/corelib/animation/qvariantanimation.h index f1721b8a651..a639a0b1f35 100644 --- a/src/corelib/animation/qvariantanimation.h +++ b/src/corelib/animation/qvariantanimation.h @@ -57,8 +57,9 @@ class Q_CORE_EXPORT QVariantAnimation : public QAbstractAnimation Q_PROPERTY(QVariant startValue READ startValue WRITE setStartValue) Q_PROPERTY(QVariant endValue READ endValue WRITE setEndValue) Q_PROPERTY(QVariant currentValue READ currentValue NOTIFY valueChanged) - Q_PROPERTY(int duration READ duration WRITE setDuration) - Q_PROPERTY(QEasingCurve easingCurve READ easingCurve WRITE setEasingCurve) + Q_PROPERTY(int duration READ duration WRITE setDuration BINDABLE bindableDuration) + Q_PROPERTY(QEasingCurve easingCurve READ easingCurve WRITE setEasingCurve + BINDABLE bindableEasingCurve) public: typedef QPair KeyValue; @@ -83,9 +84,11 @@ public: int duration() const override; void setDuration(int msecs); + QBindable bindableDuration(); QEasingCurve easingCurve() const; void setEasingCurve(const QEasingCurve &easing); + QBindable bindableEasingCurve(); typedef QVariant (*Interpolator)(const void *from, const void *to, qreal progress); diff --git a/src/corelib/animation/qvariantanimation_p.h b/src/corelib/animation/qvariantanimation_p.h index 3425777ba56..a5013d97ad6 100644 --- a/src/corelib/animation/qvariantanimation_p.h +++ b/src/corelib/animation/qvariantanimation_p.h @@ -56,6 +56,7 @@ #include #include "private/qabstractanimation_p.h" +#include "private/qproperty_p.h" #include @@ -87,8 +88,14 @@ public: QVariantAnimation::KeyValue start, end; } currentInterval; - QEasingCurve easing; - int duration; + void setEasingCurve(const QEasingCurve &easing) { q_func()->setEasingCurve(easing); } + Q_OBJECT_COMPAT_PROPERTY(QVariantAnimationPrivate, QEasingCurve, easing, + &QVariantAnimationPrivate::setEasingCurve) + + void setDuration(int msecs) { q_func()->setDuration(msecs); } + Q_OBJECT_COMPAT_PROPERTY(QVariantAnimationPrivate, int, duration, + &QVariantAnimationPrivate::setDuration) + QVariantAnimation::KeyValues keyValues; QVariantAnimation::Interpolator interpolator; diff --git a/tests/auto/corelib/animation/qvariantanimation/CMakeLists.txt b/tests/auto/corelib/animation/qvariantanimation/CMakeLists.txt index aa85e1fb5c3..08fd743e338 100644 --- a/tests/auto/corelib/animation/qvariantanimation/CMakeLists.txt +++ b/tests/auto/corelib/animation/qvariantanimation/CMakeLists.txt @@ -7,4 +7,6 @@ qt_internal_add_test(tst_qvariantanimation SOURCES tst_qvariantanimation.cpp + LIBRARIES + Qt::TestPrivate ) diff --git a/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp b/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp index ed1cea3fcf3..cbb73296b49 100644 --- a/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp +++ b/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp @@ -29,6 +29,7 @@ #include #include +#include class tst_QVariantAnimation : public QObject { @@ -44,6 +45,8 @@ private slots: void keyValues(); void duration(); void interpolation(); + void durationBindings(); + void easingCurveBindings(); }; class TestableQVariantAnimation : public QVariantAnimation @@ -154,6 +157,32 @@ void tst_QVariantAnimation::interpolation() QCOMPARE(pointAnim.currentValue().toPoint(), QPoint(50, 50)); } +void tst_QVariantAnimation::durationBindings() +{ + QVariantAnimation animation; + + // duration property + QProperty duration; + animation.bindableDuration().setBinding(Qt::makePropertyBinding(duration)); + + // negative values must be ignored + QTest::ignoreMessage(QtWarningMsg, + "QVariantAnimation::setDuration: cannot set a negative duration"); + duration = -1; + QVERIFY(animation.duration() != duration); + + QTestPrivate::testReadWritePropertyBasics(animation, 42, 43, "duration"); +} + +void tst_QVariantAnimation::easingCurveBindings() +{ + QVariantAnimation animation; + + QTestPrivate::testReadWritePropertyBasics(animation, QEasingCurve(QEasingCurve::InQuad), + QEasingCurve(QEasingCurve::BezierSpline), + "easingCurve"); +} + QTEST_MAIN(tst_QVariantAnimation) #include "tst_qvariantanimation.moc"