From cb1a041ca363e815cbb9f63804c02b2d02d9818d Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 13 Jan 2024 04:15:42 +0400 Subject: [PATCH] Stop timer for infinite radial animation when animations are disabled --- ui/effects/radial_animation.cpp | 20 ++++++++++++++++---- ui/effects/radial_animation.h | 6 +++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ui/effects/radial_animation.cpp b/ui/effects/radial_animation.cpp index ffea2ac..2ae1d53 100644 --- a/ui/effects/radial_animation.cpp +++ b/ui/effects/radial_animation.cpp @@ -112,13 +112,25 @@ RadialState RadialAnimation::computeState() const { return { _opacity, from, length }; } +void InfiniteRadialAnimation::init() { + anim::Disables() | rpl::filter([=] { + return animating(); + }) | rpl::start_with_next([=](bool disabled) { + if (!disabled && !_animation.animating()) { + _animation.start(); + } else if (disabled && _animation.animating()) { + _animation.stop(); + } + }, _lifetime); +} + void InfiniteRadialAnimation::start(crl::time skip) { - const auto now = crl::now(); - if (_workFinished <= now && (_workFinished || !_workStarted)) { + if (!animating()) { + const auto now = crl::now(); _workStarted = std::max(now + _st.sineDuration - skip, crl::time(1)); _workFinished = 0; } - if (!_animation.animating()) { + if (!anim::Disabled() && !_animation.animating()) { _animation.start(); } } @@ -213,7 +225,7 @@ RadialState InfiniteRadialAnimation::computeState() { const auto now = crl::now(); const auto linear = kFullArcLength - int(((now * kFullArcLength) / _st.linearPeriod) % kFullArcLength); - if (!_workStarted || (_workFinished && _workFinished <= now)) { + if (!animating()) { const auto shown = 0.; _animation.stop(); return { diff --git a/ui/effects/radial_animation.h b/ui/effects/radial_animation.h index 984e49a..1ed035d 100644 --- a/ui/effects/radial_animation.h +++ b/ui/effects/radial_animation.h @@ -73,7 +73,7 @@ public: const style::InfiniteRadialAnimation &st); [[nodiscard]] bool animating() const { - return _animation.animating(); + return _workStarted && (!_workFinished || _workFinished > crl::now()); } void start(crl::time skip = 0); @@ -101,10 +101,13 @@ public: [[nodiscard]] RadialState computeState(); private: + void init(); + const style::InfiniteRadialAnimation &_st; crl::time _workStarted = 0; crl::time _workFinished = 0; Ui::Animations::Basic _animation; + rpl::lifetime _lifetime; }; @@ -114,6 +117,7 @@ inline InfiniteRadialAnimation::InfiniteRadialAnimation( const style::InfiniteRadialAnimation &st) : _st(st) , _animation(std::forward(callback)) { + init(); } } // namespace Ui