From 07359392c2e19ac08b633258eb1d7a9f45e271cd Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 30 Nov 2020 12:29:59 +0300 Subject: [PATCH] Added ability to override background and ripple colors in CallButton. --- ui/widgets/call_button.cpp | 21 +++++++++++++++++++-- ui/widgets/call_button.h | 9 +++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/ui/widgets/call_button.cpp b/ui/widgets/call_button.cpp index fbd67e9..c43f870 100644 --- a/ui/widgets/call_button.cpp +++ b/ui/widgets/call_button.cpp @@ -126,7 +126,12 @@ void CallButton::paintEvent(QPaintEvent *e) { p.drawEllipse(outerRect); } - if (paintFrom) { + if (_bgOverride) { + const auto &s = _stFrom->bgSize; + p.setPen(Qt::NoPen); + p.setBrush(*_bgOverride); + p.drawEllipse(QRect(_stFrom->bgPosition, QSize(s, s))); + } else if (paintFrom) { p.drawPixmap(bgPosition, _bgFrom); } else if (paintTo) { p.drawPixmap(bgPosition, _bgTo); @@ -137,7 +142,9 @@ void CallButton::paintEvent(QPaintEvent *e) { auto rippleColorInterpolated = QColor(); auto rippleColorOverride = &rippleColorInterpolated; - if (paintFrom) { + if (_rippleOverride) { + rippleColorOverride = &(*_rippleOverride); + } else if (paintFrom) { rippleColorOverride = nullptr; } else if (paintTo) { rippleColorOverride = &_stTo->button.ripple.color->c; @@ -202,6 +209,16 @@ void CallButton::onStateChanged(State was, StateChangeSource source) { } } +void CallButton::setColorOverrides(rpl::producer &&colors) { + std::move( + colors + ) | rpl::start_with_next([=](const CallButtonColors &c) { + _bgOverride = c.bg; + _rippleOverride = c.ripple; + update(); + }, lifetime()); +} + QPoint CallButton::prepareRippleStartPosition() const { return mapFromGlobal(QCursor::pos()) - _stFrom->button.rippleAreaPosition; } diff --git a/ui/widgets/call_button.h b/ui/widgets/call_button.h index c02c441..cb65c57 100644 --- a/ui/widgets/call_button.h +++ b/ui/widgets/call_button.h @@ -14,6 +14,11 @@ namespace Ui { class FlatLabel; +struct CallButtonColors { + std::optional bg; + std::optional ripple; +}; + class CallButton final : public RippleButton { public: CallButton( @@ -24,6 +29,7 @@ public: void setProgress(float64 progress); void setOuterValue(float64 value); void setText(rpl::producer text); + void setColorOverrides(rpl::producer &&colors); protected: void paintEvent(QPaintEvent *e) override; @@ -43,6 +49,9 @@ private: object_ptr _label = { nullptr }; + std::optional _bgOverride; + std::optional _rippleOverride; + QImage _bgMask, _bg; QPixmap _bgFrom, _bgTo; QImage _iconMixedMask, _iconFrom, _iconTo, _iconMixed;