From 4430bd03288407ba939a1425179bca326508f370 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 3 Sep 2024 11:50:39 +0400 Subject: [PATCH] Improve lottie icon layout in group calls. --- .../ui/controls/call_mute_button.cpp | 60 ++++++++++++------- .../ui/controls/call_mute_button.h | 4 +- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Telegram/SourceFiles/ui/controls/call_mute_button.cpp b/Telegram/SourceFiles/ui/controls/call_mute_button.cpp index df7296b3d..b142eb7ea 100644 --- a/Telegram/SourceFiles/ui/controls/call_mute_button.cpp +++ b/Telegram/SourceFiles/ui/controls/call_mute_button.cpp @@ -82,6 +82,28 @@ constexpr auto kRadialFinishArcShift = 1200; : type; }; +[[nodiscard]] QSize AdjustedLottieSize( + not_null st) { + const auto &button = st->active.button; + const auto left = (button.width - st->lottieSize.width()) / 2; + const auto size = button.width - 2 * left; + return QSize(size, size); +} + +[[nodiscard]] int AdjustedBgSize( + not_null st) { + const auto &button = st->active.button; + const auto left = (button.width - st->active.bgSize) / 2; + return button.width - 2 * left; +} + +[[nodiscard]] int AdjustedBgSkip( + not_null st) { + const auto &button = st->active.button; + const auto bgSize = AdjustedBgSize(st); + return (button.width - bgSize) / 2; +} + auto MuteBlobs() { return std::vector{ { @@ -515,9 +537,12 @@ CallMuteButton::CallMuteButton( CallMuteButtonState initial) : _state(initial) , _st(&st) +, _lottieSize(AdjustedLottieSize(_st)) +, _bgSize(AdjustedBgSize(_st)) +, _bgSkip(AdjustedBgSkip(_st)) , _blobs(base::make_unique_q( parent, - _st->active.bgSize, + _bgSize, rpl::combine( PowerSaving::OnValue(PowerSaving::kCalls), std::move(hideBlobs), @@ -593,13 +618,13 @@ void CallMuteButton::refreshIcons() { _icons[0].emplace(Lottie::IconDescriptor{ .path = u":/icons/calls/voice.lottie"_q, .color = &st::groupCallIconFg, - .sizeOverride = _st->lottieSize, + .sizeOverride = _lottieSize, .frame = (_iconState.index ? 0 : _iconState.frameTo), }); _icons[1].emplace(Lottie::IconDescriptor{ .path = u":/icons/calls/hands.lottie"_q, .color = &st::groupCallIconFg, - .sizeOverride = _st->lottieSize, + .sizeOverride = _lottieSize, .frame = (_iconState.index ? _iconState.frameTo : 0), }); @@ -813,7 +838,7 @@ void CallMuteButton::init() { // Icon rect. _content->sizeValue( ) | rpl::start_with_next([=](QSize size) { - const auto icon = _st->lottieSize; + const auto icon = _lottieSize; _muteIconRect = QRect( (size.width() - icon.width()) / 2, _st->lottieTop, @@ -858,8 +883,8 @@ void CallMuteButton::init() { InfiniteRadialAnimation::Draw( p, r, - _st->active.bgPosition, - QSize(_st->active.bgSize, _st->active.bgSize), + QPoint(_bgSkip, _bgSkip), + QSize(_bgSize, _bgSize), _content->width(), QPen(_radialInfo.st.color), _radialInfo.st.thickness); @@ -870,8 +895,8 @@ void CallMuteButton::init() { InfiniteRadialAnimation::Draw( p, std::move(state), - _st->active.bgPosition, - QSize(_st->active.bgSize, _st->active.bgSize), + QPoint(_bgSkip, _bgSkip), + QSize(_bgSize, _bgSize), _content->width(), QPen(_radialInfo.st.color), _radialInfo.st.thickness); @@ -1027,6 +1052,9 @@ void CallMuteButton::setStyle(const style::CallMuteButton &st) { return; } _st = &st; + _lottieSize = AdjustedLottieSize(_st); + _bgSize = AdjustedBgSize(_st); + _bgSkip = AdjustedBgSkip(_st); const auto &button = _st->active.button; _content->resize(button.width, button.height); _blobs->setDiameter(_st->active.bgSize); @@ -1057,21 +1085,13 @@ rpl::producer CallMuteButton::clicks() { } QSize CallMuteButton::innerSize() const { - return innerGeometry().size(); -} - -QRect CallMuteButton::innerGeometry() const { - const auto &skip = _st->active.outerRadius; - return QRect( - _content->x(), - _content->y(), - _content->width() - 2 * skip, - _content->width() - 2 * skip); + return QSize( + _content->width() - 2 * _bgSkip, + _content->width() - 2 * _bgSkip); } void CallMuteButton::moveInner(QPoint position) { - const auto &skip = _st->active.outerRadius; - _content->move(position - QPoint(skip, skip)); + _content->move(position - QPoint(_bgSkip, _bgSkip)); { const auto offset = QPoint( diff --git a/Telegram/SourceFiles/ui/controls/call_mute_button.h b/Telegram/SourceFiles/ui/controls/call_mute_button.h index b6755f543..455c94485 100644 --- a/Telegram/SourceFiles/ui/controls/call_mute_button.h +++ b/Telegram/SourceFiles/ui/controls/call_mute_button.h @@ -73,7 +73,6 @@ public: [[nodiscard]] rpl::producer clicks(); [[nodiscard]] QSize innerSize() const; - [[nodiscard]] QRect innerGeometry() const; void moveInner(QPoint position); void shake(); @@ -165,6 +164,9 @@ private: HandleMouseState _handleMouseState = HandleMouseState::Enabled; not_null _st; + QSize _lottieSize; + int _bgSize = 0; + int _bgSkip = 0; const base::unique_qptr _blobs; const base::unique_qptr _content;