From 75dc131a2837b47c0f46cfb7e31eb6ed3851b140 Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Fri, 25 Aug 2023 14:37:14 +0200 Subject: [PATCH] QVariantAnimation: fix binding loops Rewrite the logic of the setters to use removeBindingUnlessInWrapper() and {set}ValueBypassingBindings() calls. The logic of both setters didn't change, because previously the pre-existing bindings were implicitly removed when calling the assignment operator. The new code just makes it explicit. Task-number: QTBUG-116346 Change-Id: I475e6cd65fc73796176f257835cb67b9e70a1e34 Reviewed-by: Ulf Hermann (cherry picked from commit df9651c3fcdd026255add31744b2f75dc2ecdd62) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/animation/qvariantanimation.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp index cf84200f2a5..d62946f222b 100644 --- a/src/corelib/animation/qvariantanimation.cpp +++ b/src/corelib/animation/qvariantanimation.cpp @@ -353,8 +353,9 @@ QEasingCurve QVariantAnimation::easingCurve() const void QVariantAnimation::setEasingCurve(const QEasingCurve &easing) { Q_D(QVariantAnimation); - const bool valueChanged = easing != d->easing; - d->easing = easing; + d->easing.removeBindingUnlessInWrapper(); + const bool valueChanged = easing != d->easing.valueBypassingBindings(); + d->easing.setValueBypassingBindings(easing); d->recalculateCurrentInterval(); if (valueChanged) d->easing.notify(); @@ -482,13 +483,12 @@ void QVariantAnimation::setDuration(int msecs) qWarning("QVariantAnimation::setDuration: cannot set a negative duration"); return; } - if (d->duration == msecs) { - d->duration.removeBindingUnlessInWrapper(); - return; + d->duration.removeBindingUnlessInWrapper(); + if (d->duration.valueBypassingBindings() != msecs) { + d->duration.setValueBypassingBindings(msecs); + d->recalculateCurrentInterval(); + d->duration.notify(); } - d->duration = msecs; - d->recalculateCurrentInterval(); - d->duration.notify(); } QBindable QVariantAnimation::bindableDuration()