From 7a1fdcedfce0a67345dc74cd77be4a8ecf0cbc1e Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Fri, 11 Dec 2020 16:06:56 +0100 Subject: [PATCH] Port QVariantAnimation to the new property system Skipped startValue/endValue properties, since they are computed and writable, which is not supported at the moment. Skipped currentValue, since its setter might be called inside the getter, which is not recommended. Task-number: QTBUG-85520 Change-Id: I1f872b4fcc7227ed91b6915891bbc66019151826 Reviewed-by: Ivan Solovev Reviewed-by: Andreas Buhr Reviewed-by: Edward Welbourne --- src/corelib/animation/qvariantanimation.cpp | 23 +++++++++++++-- src/corelib/animation/qvariantanimation.h | 7 +++-- src/corelib/animation/qvariantanimation_p.h | 11 +++++-- .../qvariantanimation/CMakeLists.txt | 2 ++ .../tst_qvariantanimation.cpp | 29 +++++++++++++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) 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"