From b1931d43b97e1c381fa5f0130737983f1a6f66a8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 3 Apr 2022 16:27:10 +0200 Subject: [PATCH] stop animation, when start/endValues are chaged. Otherwise we will run into crashes, when value types have not been aligned or can't be aligned --- src/controls/QskVariantAnimator.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index a23fd356..c54d4ea3 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -53,13 +53,13 @@ Q_CONSTRUCTOR_FUNCTION( qskRegisterInterpolator ) #endif #if defined( Q_CC_CLANG ) -#if __has_feature( address_sanitizer ) -#define QSK_DECL_INSANE __attribute__( ( no_sanitize( "undefined" ) ) ) -#endif + #if __has_feature( address_sanitizer ) + #define QSK_DECL_INSANE __attribute__( ( no_sanitize( "undefined" ) ) ) + #endif #endif #if !defined( QSK_DECL_INSANE ) -#define QSK_DECL_INSANE + #define QSK_DECL_INSANE #endif QSK_DECL_INSANE static inline QVariant qskInterpolate( @@ -112,11 +112,13 @@ QskVariantAnimator::~QskVariantAnimator() void QskVariantAnimator::setStartValue( const QVariant& value ) { + stop(); m_startValue = value; } void QskVariantAnimator::setEndValue( const QVariant& value ) { + stop(); m_endValue = value; } @@ -171,7 +173,7 @@ void QskVariantAnimator::setup() if ( convertValues( m_startValue, m_endValue ) ) { - if ( m_startValue != m_endValue ) + if ( m_startValue != m_endValue ) { const auto id = m_startValue.userType(); @@ -191,6 +193,8 @@ void QskVariantAnimator::advance( qreal progress ) if ( qFuzzyCompare( progress, 1.0 ) ) progress = 1.0; + Q_ASSERT( qskMetaType( m_startValue ) == qskMetaType( m_endValue ) ); + m_currentValue = qskInterpolate( m_interpolator, m_startValue, m_endValue, progress ); }