From 37d939a65066a00eb60c0ad30a0641c6eaeb5b00 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 11 Dec 2020 09:54:22 +0300 Subject: [PATCH] Replaced CallButton with AbstractButton in mute button. --- ui/widgets/call_mute_button.cpp | 125 +++++++++++++++++--------------- ui/widgets/call_mute_button.h | 15 ++-- 2 files changed, 76 insertions(+), 64 deletions(-) diff --git a/ui/widgets/call_mute_button.cpp b/ui/widgets/call_mute_button.cpp index c85c34e..019b452 100644 --- a/ui/widgets/call_mute_button.cpp +++ b/ui/widgets/call_mute_button.cpp @@ -6,12 +6,14 @@ // #include "ui/widgets/call_mute_button.h" -#include "base/event_filter.h" #include "base/flat_map.h" +#include "ui/abstract_button.h" #include "ui/effects/gradient.h" #include "ui/effects/radial_animation.h" #include "ui/paint/blobs.h" #include "ui/painter.h" +#include "ui/widgets/call_button.h" +#include "ui/widgets/labels.h" #include "styles/palette.h" #include "styles/style_widgets.h" @@ -46,8 +48,8 @@ constexpr auto kOverrideColorRippleAlpha = 50; constexpr auto kSwitchStateDuration = 120; -auto MuteBlobs() -> std::array { - return {{ +auto MuteBlobs() { + return std::vector{ { .segmentsCount = 6, .minScale = 1., @@ -82,7 +84,7 @@ auto MuteBlobs() -> std::array { .speedScale = 1., .alpha = (76. / 255.), }, - }}; + }; } auto Colors() { @@ -158,7 +160,7 @@ BlobsWidget::BlobsWidget( not_null parent, rpl::producer &&hideBlobs) : RpWidget(parent) -, _blobs(MuteBlobs() | ranges::to_vector, kLevelDuration, kMaxLevel) +, _blobs(MuteBlobs(), kLevelDuration, kMaxLevel) , _blobBrush(Qt::transparent) , _glowBrush(Qt::transparent) , _blobsLastTime(crl::now()) { @@ -278,6 +280,7 @@ CallMuteButton::CallMuteButton( rpl::producer &&hideBlobs, CallMuteButtonState initial) : _state(initial) +, _st(st::callMuteButtonActive) , _blobs(base::make_unique_q( parent, rpl::combine( @@ -290,25 +293,40 @@ CallMuteButton::CallMuteButton( ) | rpl::map([](bool animDisabled, bool hide, bool isConnecting) { return isConnecting || !(!animDisabled && !hide); }))) -, _content(parent, st::callMuteButtonActive, &st::callMuteButtonMuted) +, _content(base::make_unique_q(parent)) +, _label(base::make_unique_q( + _content, + _state.value( + ) | rpl::map([](const CallMuteButtonState &state) { + return state.text; + }), + _st.label)) , _radial(nullptr) , _colors(Colors()) , _crossLineMuteAnimation(st::callMuteCrossLine) { init(); +} + +void CallMuteButton::init() { + _content->resize(_st.button.width, _st.button.height); style::PaletteChanged( ) | rpl::start_with_next([=] { _crossLineMuteAnimation.invalidate(); }, lifetime()); -} -void CallMuteButton::init() { // Label text. - auto text = _state.value( - ) | rpl::map([](const CallMuteButtonState &state) { - return state.text; - }); - _content.setText(std::move(text)); + _label->show(); + rpl::combine( + _content->sizeValue(), + _label->sizeValue() + ) | rpl::start_with_next([=](QSize my, QSize label) { + _label->moveToLeft( + (my.width() - label.width()) / 2, + my.height() - label.height(), + my.width()); + }, _label->lifetime()); + _label->setAttribute(Qt::WA_TransparentForMouseEvents); _radialShowProgress.value( ) | rpl::start_with_next([=](float64 value) { @@ -319,7 +337,7 @@ void CallMuteButton::init() { } if ((value > 0.) && !anim::Disabled() && !_radial) { _radial = std::make_unique( - [=] { _content.update(); }, + [=] { _content->update(); }, st::callConnectingRadial); _radial->start(); } @@ -387,7 +405,7 @@ void CallMuteButton::init() { : InterpolateF(crossFrom, crossTo, value); if (crossProgress != _crossLineProgress) { _crossLineProgress = crossProgress; - _content.update(_muteIconPosition); + _content->update(_muteIconPosition); } const auto radialShowProgress = (radialShowFrom == radialShowTo) @@ -412,10 +430,10 @@ void CallMuteButton::init() { }, lifetime()); // Icon rect. - _content.sizeValue( + _content->sizeValue( ) | rpl::start_with_next([=](QSize size) { - const auto &icon = st::callMuteButtonActive.button.icon; - const auto &pos = st::callMuteButtonActive.button.iconPosition; + const auto &icon = _st.button.icon; + const auto &pos = _st.button.iconPosition; _muteIconPosition = QRect( (pos.x() < 0) ? ((size.width() - icon.width()) / 2) : pos.x(), @@ -425,34 +443,23 @@ void CallMuteButton::init() { }, lifetime()); // Paint. - auto filterCallback = [=](not_null e) { - if (e->type() != QEvent::Paint) { - return base::EventFilterResult::Continue; - } - contentPaint(); - return base::EventFilterResult::Cancel; - }; + _content->paintRequest( + ) | rpl::start_with_next([=](QRect clip) { + Painter p(_content); - auto filter = base::install_event_filter( - &_content, - std::move(filterCallback)); - - lifetime().make_state>(std::move(filter)); -} - -void CallMuteButton::contentPaint() { - Painter p(&_content); - - const auto progress = 1. - _crossLineProgress; - _crossLineMuteAnimation.paint(p, _muteIconPosition.topLeft(), progress); - - if (_radial) { - p.setOpacity(_radialShowProgress.current()); - _radial->draw( + _crossLineMuteAnimation.paint( p, - st::callMuteButtonActive.bgPosition, - _content.width()); - } + _muteIconPosition.topLeft(), + 1. - _crossLineProgress); + + if (_radial) { + p.setOpacity(_radialShowProgress.current()); + _radial->draw( + p, + _st.bgPosition, + _content->width()); + } + }, _content->lifetime()); } void CallMuteButton::setState(const CallMuteButtonState &state) { @@ -465,7 +472,7 @@ void CallMuteButton::setLevel(float level) { } rpl::producer CallMuteButton::clicks() const { - return _content.clicks(); + return _content->clicks(); } QSize CallMuteButton::innerSize() const { @@ -473,43 +480,43 @@ QSize CallMuteButton::innerSize() const { } QRect CallMuteButton::innerGeometry() const { - const auto skip = st::callMuteButtonActive.outerRadius; + const auto &skip = _st.outerRadius; return QRect( - _content.x(), - _content.y(), - _content.width() - 2 * skip, - _content.width() - 2 * skip); + _content->x(), + _content->y(), + _content->width() - 2 * skip, + _content->width() - 2 * skip); } void CallMuteButton::moveInner(QPoint position) { - const auto skip = st::callMuteButtonActive.outerRadius; - _content.move(position - QPoint(skip, skip)); + const auto &skip = _st.outerRadius; + _content->move(position - QPoint(skip, skip)); { const auto offset = QPoint( - (_blobs->width() - _content.width()) / 2, - (_blobs->height() - _content.width()) / 2); - _blobs->move(_content.pos() - offset); + (_blobs->width() - _content->width()) / 2, + (_blobs->height() - _content->width()) / 2); + _blobs->move(_content->pos() - offset); } } void CallMuteButton::setVisible(bool visible) { - _content.setVisible(visible); + _content->setVisible(visible); _blobs->setVisible(visible); } void CallMuteButton::raise() { _blobs->raise(); - _content.raise(); + _content->raise(); } void CallMuteButton::lower() { - _content.lower(); + _content->lower(); _blobs->lower(); } void CallMuteButton::setEnableMouse(bool value) { - _content.setAttribute(Qt::WA_TransparentForMouseEvents, !value); + _content->setAttribute(Qt::WA_TransparentForMouseEvents, !value); } void CallMuteButton::overridesColors( diff --git a/ui/widgets/call_mute_button.h b/ui/widgets/call_mute_button.h index 4dfb53d..83bab67 100644 --- a/ui/widgets/call_mute_button.h +++ b/ui/widgets/call_mute_button.h @@ -9,14 +9,17 @@ #include "base/unique_qptr.h" #include "ui/effects/animations.h" #include "ui/effects/cross_line.h" -#include "ui/widgets/call_button.h" - -#include namespace Ui { class BlobsWidget; + +class AbstractButton; +class FlatLabel; class InfiniteRadialAnimation; +class RpWidget; + +struct CallButtonColors; enum class CallMuteButtonType { Connecting, @@ -62,7 +65,6 @@ public: private: void init(); - void contentPaint(); void overridesColors( CallMuteButtonType fromType, CallMuteButtonType toType, @@ -76,8 +78,11 @@ private: rpl::variable _radialShowProgress = 0.; QRect _muteIconPosition; + const style::CallButton &_st; + const base::unique_qptr _blobs; - CallButton _content; + const base::unique_qptr _content; + const base::unique_qptr _label; std::unique_ptr _radial; const base::flat_map> _colors;