diff --git a/src/corelib/animation/qpauseanimation.cpp b/src/corelib/animation/qpauseanimation.cpp index 5f8a8b3590..d6fa0eb210 100644 --- a/src/corelib/animation/qpauseanimation.cpp +++ b/src/corelib/animation/qpauseanimation.cpp @@ -63,18 +63,22 @@ #include "qpauseanimation.h" #include "qabstractanimation_p.h" +#include "private/qproperty_p.h" QT_BEGIN_NAMESPACE class QPauseAnimationPrivate : public QAbstractAnimationPrivate { + Q_DECLARE_PUBLIC(QPauseAnimation) public: QPauseAnimationPrivate() : QAbstractAnimationPrivate(), duration(250) { isPause = true; } - int duration; + void setDuration(int msecs) { q_func()->setDuration(msecs); } + Q_OBJECT_COMPAT_PROPERTY(QPauseAnimationPrivate, int, duration, + &QPauseAnimationPrivate::setDuration) }; /*! @@ -128,6 +132,12 @@ void QPauseAnimation::setDuration(int msecs) d->duration = msecs; } +QBindable QPauseAnimation::bindableDuration() +{ + Q_D(QPauseAnimation); + return &d->duration; +} + /*! \reimp */ diff --git a/src/corelib/animation/qpauseanimation.h b/src/corelib/animation/qpauseanimation.h index 6bdbeefdbd..1bbc52132d 100644 --- a/src/corelib/animation/qpauseanimation.h +++ b/src/corelib/animation/qpauseanimation.h @@ -51,7 +51,7 @@ class QPauseAnimationPrivate; class Q_CORE_EXPORT QPauseAnimation : public QAbstractAnimation { Q_OBJECT - Q_PROPERTY(int duration READ duration WRITE setDuration) + Q_PROPERTY(int duration READ duration WRITE setDuration BINDABLE bindableDuration) public: QPauseAnimation(QObject *parent = nullptr); QPauseAnimation(int msecs, QObject *parent = nullptr); @@ -59,6 +59,7 @@ public: int duration() const override; void setDuration(int msecs); + QBindable bindableDuration(); protected: bool event(QEvent *e) override; diff --git a/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp b/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp index a10930b517..0688eafda8 100644 --- a/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp +++ b/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp @@ -105,6 +105,7 @@ private slots: void sequentialGroupWithPause(); void multipleSequentialGroups(); void zeroDuration(); + void bindings(); }; void tst_QPauseAnimation::initTestCase() @@ -442,5 +443,45 @@ void tst_QPauseAnimation::zeroDuration() QCOMPARE(animation.m_updateCurrentTimeCount, 1); } +void tst_QPauseAnimation::bindings() +{ + TestablePauseAnimation animation; + + QProperty duration; + animation.bindableDuration().setBinding(Qt::makePropertyBinding(duration)); + + duration = 42; + QCOMPARE(animation.duration(), 42); + + // negative values must be ignored + QTest::ignoreMessage(QtWarningMsg, + "QPauseAnimation::setDuration: cannot set a negative duration"); + duration = -1; + QCOMPARE(animation.duration(), 42); + QCOMPARE(duration, -1); + + // Setting an invalid value shouldn't clear the binding + QTest::ignoreMessage(QtWarningMsg, + "QPauseAnimation::setDuration: cannot set a negative duration"); + animation.setDuration(-1); + QVERIFY(animation.bindableDuration().hasBinding()); + QCOMPARE(animation.duration(), 42); + + QProperty durationObserver; + durationObserver.setBinding(animation.bindableDuration().makeBinding()); + + animation.setDuration(46); + QCOMPARE(durationObserver, 46); + + // Setting a valid value should clear the binding + QVERIFY(!animation.bindableDuration().hasBinding()); + + // Setting an invalid value also doesn't affect the observer + QTest::ignoreMessage(QtWarningMsg, + "QPauseAnimation::setDuration: cannot set a negative duration"); + animation.setDuration(-1); + QCOMPARE(durationObserver, 46); +} + QTEST_MAIN(tst_QPauseAnimation) #include "tst_qpauseanimation.moc"