From 5437c8865dc35dd75d7474cdbcbfcba56ad5eb76 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 3 Dec 2020 18:09:10 +0300 Subject: [PATCH] Added initial animation of Blobs hiding. --- ui/paint/blobs.h | 2 ++ ui/widgets/call_mute_button.cpp | 32 ++++++++++++++++++++++++++++---- ui/widgets/call_mute_button.h | 1 + 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ui/paint/blobs.h b/ui/paint/blobs.h index 07d35f9..6a61d70 100644 --- a/ui/paint/blobs.h +++ b/ui/paint/blobs.h @@ -42,6 +42,8 @@ public: [[nodiscard]] int size() const; [[nodiscard]] float64 currentLevel() const; + static constexpr auto kHideBlobsDuration = 2000; + private: void init(); diff --git a/ui/widgets/call_mute_button.cpp b/ui/widgets/call_mute_button.cpp index 6821d53..ace6e9d 100644 --- a/ui/widgets/call_mute_button.cpp +++ b/ui/widgets/call_mute_button.cpp @@ -148,6 +148,7 @@ private: QRect _inner; crl::time _blobsLastTime = 0; + crl::time _blobsHideLastTime = 0; Animations::Basic _animation; @@ -174,6 +175,18 @@ BlobsWidget::BlobsWidget( }) | rpl::distinct_until_changed(); _blobs.setRadiusesAt(std::move(radiusesChange), i); } + + std::move( + hideBlobs + ) | rpl::start_with_next([=](bool hide) { + if (hide) { + setLevel(0.); + } + _blobsHideLastTime = hide ? crl::now() : 0; + if (!hide && !_animation.animating()) { + _animation.start(); + } + }, lifetime()); } void BlobsWidget::init() { @@ -223,6 +236,11 @@ void BlobsWidget::init() { }, lifetime()); _animation.init([=](crl::time now) { + if (const auto &last = _blobsHideLastTime; (last > 0) + && (now - last >= Paint::Blobs::kHideBlobsDuration)) { + _animation.stop(); + return false; + } _blobs.updateLevel(now - _blobsLastTime); _blobsLastTime = now; @@ -258,19 +276,25 @@ void BlobsWidget::setGlowBrush(QBrush brush) { } void BlobsWidget::setLevel(float level) { + if (_blobsHideLastTime) { + return; + } _blobs.setLevel(level); } CallMuteButton::CallMuteButton( not_null parent, + rpl::producer &&hideBlobs, CallMuteButtonState initial) : _state(initial) , _blobs(base::make_unique_q( parent, - _state.value( - ) | rpl::map([](const CallMuteButtonState &state) { - return IsConnecting(state.type); - }))) + rpl::merge( + std::move(hideBlobs), + _state.value( + ) | rpl::map([](const CallMuteButtonState &state) { + return IsConnecting(state.type); + })))) , _content(parent, st::callMuteButtonActive, &st::callMuteButtonMuted) , _radial(nullptr) , _colors(Colors()) diff --git a/ui/widgets/call_mute_button.h b/ui/widgets/call_mute_button.h index 8cad8a8..4dfb53d 100644 --- a/ui/widgets/call_mute_button.h +++ b/ui/widgets/call_mute_button.h @@ -34,6 +34,7 @@ class CallMuteButton final { public: explicit CallMuteButton( not_null parent, + rpl::producer &&hideBlobs, CallMuteButtonState initial = CallMuteButtonState()); ~CallMuteButton();