From ee969568acec6b5de416276ecee7c0907780ed49 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 30 Nov 2020 06:08:03 +0300 Subject: [PATCH] Added transforming blob to circle in mute button for connecting state. --- ui/widgets/call_mute_button.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/ui/widgets/call_mute_button.cpp b/ui/widgets/call_mute_button.cpp index 3801b75..f896f70 100644 --- a/ui/widgets/call_mute_button.cpp +++ b/ui/widgets/call_mute_button.cpp @@ -33,6 +33,9 @@ constexpr auto kScaleSmallMax = kScaleSmallMin + kScaleSmall; constexpr auto kMainRadiusFactor = 50. / 57.; +constexpr auto kMainMinRadius = 57. * kMainRadiusFactor; +constexpr auto kMainMaxRadius = 63. * kMainRadiusFactor; + constexpr auto kSwitchStateDuration = 120; constexpr auto MuteBlobs() -> std::array { @@ -40,8 +43,8 @@ constexpr auto MuteBlobs() -> std::array { { .segmentsCount = 6, .minScale = 1., - .minRadius = 57. * kMainRadiusFactor, - .maxRadius = 63. * kMainRadiusFactor, + .minRadius = kMainMinRadius, + .maxRadius = kMainMaxRadius, .speedScale = .4, .alpha = 1., }, @@ -105,6 +108,7 @@ public: void setLevel(float level); void setBrush(QBrush brush); + void setMainRadius(rpl::producer &&radius); private: void init(); @@ -178,6 +182,10 @@ void BlobsWidget::setLevel(float level) { _blobs.setLevel(level); } +void BlobsWidget::setMainRadius(rpl::producer &&radius) { + _blobs.setRadiusAt(std::move(radius), 0, true); +} + CallMuteButton::CallMuteButton( not_null parent, CallMuteButtonState initial) @@ -276,6 +284,17 @@ void CallMuteButton::init() { icon.height()); }, lifetime()); + // Main blob radius. + { + auto radius = _state.value( + ) | rpl::map([](const CallMuteButtonState &state) -> float { + return IsConnecting(state.type) + ? kMainMinRadius + : kMainMaxRadius; + }) | rpl::distinct_until_changed(); + _blobs->setMainRadius(std::move(radius)); + } + // Paint. auto filterCallback = [=](not_null e) { if (e->type() != QEvent::Paint) {