From 45d42c8c3109abcd8ea2d6ffb1e69644cec436b8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 10 Nov 2025 23:38:19 +0300 Subject: [PATCH] Added MediaSlider color overrides structure for customizable styling. --- .../calls/group/calls_volume_item.cpp | 12 +++--- .../payments/ui/payments_reaction_box.cpp | 4 +- .../ui/widgets/continuous_sliders.cpp | 37 ++++++++++++++----- .../ui/widgets/continuous_sliders.h | 14 ++++++- 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/Telegram/SourceFiles/calls/group/calls_volume_item.cpp b/Telegram/SourceFiles/calls/group/calls_volume_item.cpp index ba8435cefc..cf80b20c5c 100644 --- a/Telegram/SourceFiles/calls/group/calls_volume_item.cpp +++ b/Telegram/SourceFiles/calls/group/calls_volume_item.cpp @@ -261,11 +261,13 @@ void MenuVolumeItem::updateSliderColor(float64 value) { Ui::ColorFromSerialized(0x24CD80), Ui::ColorFromSerialized(0x3BBCEC), } }; - _slider->setActiveFgOverride((value < 0.25) - ? anim::color(colors[0], colors[1], value / 0.25) - : (value < 0.5) - ? anim::color(colors[1], colors[2], (value - 0.25) / 0.25) - : anim::color(colors[2], colors[3], (value - 0.5) / 0.5)); + _slider->setColorOverrides({ + .activeFg = (value < 0.25) + ? anim::color(colors[0], colors[1], value / 0.25) + : (value < 0.5) + ? anim::color(colors[1], colors[2], (value - 0.25) / 0.25) + : anim::color(colors[2], colors[3], (value - 0.5) / 0.5), + }); } not_null MenuVolumeItem::action() const { diff --git a/Telegram/SourceFiles/payments/ui/payments_reaction_box.cpp b/Telegram/SourceFiles/payments/ui/payments_reaction_box.cpp index de589ee3f6..9e65ed35b7 100644 --- a/Telegram/SourceFiles/payments/ui/payments_reaction_box.cpp +++ b/Telegram/SourceFiles/payments/ui/payments_reaction_box.cpp @@ -144,7 +144,9 @@ void PaidReactionSlider( const auto update = [=](int count) { if (activeFgOverride) { - slider->setActiveFgOverride(activeFgOverride(count)); + slider->setColorOverrides({ + .activeFg = activeFgOverride(count), + }); } }; diff --git a/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp b/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp index 6c37c01920..ce51ad8378 100644 --- a/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp +++ b/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp @@ -271,8 +271,8 @@ void MediaSlider::addDivider(float64 atValue, const QSize &size) { _dividers.push_back(Divider{ atValue, size }); } -void MediaSlider::setActiveFgOverride(std::optional color) { - _activeFgOverride = color; +void MediaSlider::setColorOverrides(ColorOverrides overrides) { + _overrides = std::move(overrides); update(); } @@ -324,12 +324,14 @@ void MediaSlider::paintEvent(QPaintEvent *e) { const auto end = from + length; const auto activeFg = disabled ? _st.activeFgDisabled - : _activeFgOverride - ? QBrush(*_activeFgOverride) + : _overrides.activeFg + ? QBrush(*_overrides.activeFg) : anim::brush(_st.activeFg, _st.activeFgOver, over); const auto receivedTillFg = _st.receivedTillFg; const auto inactiveFg = disabled ? _st.inactiveFgDisabled + : _overrides.inactiveFg + ? QBrush(*_overrides.inactiveFg) : anim::brush(_st.inactiveFg, _st.inactiveFgOver, over); const auto borderFg = _st.borderFg; if (mid > from) { @@ -350,8 +352,14 @@ void MediaSlider::paintEvent(QPaintEvent *e) { till - from - borderWidth); p.setClipRect(fromClipRect); if (borderWidth > 0) { - p.setPen(QPen(borderFg, borderWidth)); - p.setBrush(horizontal ? borderFg : inactiveFg); + const auto borderPen = _overrides.activeBorder + ? QPen(*_overrides.activeBorder, borderWidth) + : QPen(borderFg, borderWidth); + const auto bgBrush = _overrides.activeBg + ? QBrush(*_overrides.activeBg) + : (horizontal ? borderFg : inactiveFg); + p.setPen(borderPen); + p.setBrush(bgBrush); } else { p.setPen(Qt::NoPen); p.setBrush(horizontal ? activeFg : inactiveFg); @@ -390,7 +398,10 @@ void MediaSlider::paintEvent(QPaintEvent *e) { end - begin - borderWidth); p.setClipRect(endClipRect); if (borderWidth > 0) { - p.setPen(QPen(borderFg, borderWidth)); + const auto endBorderPen = _overrides.inactiveBorder + ? QPen(*_overrides.inactiveBorder, borderWidth) + : QPen(borderFg, borderWidth); + p.setPen(endBorderPen); } else { p.setPen(Qt::NoPen); } @@ -450,12 +461,18 @@ void MediaSlider::paintEvent(QPaintEvent *e) { ((1. - markerSizeRatio) * size) / 2.); if (remove * 2 < size) { p.setClipRect(rect()); + const auto seekFg = _overrides.seekFg + ? QBrush(*_overrides.seekFg) + : activeFg; if (borderWidth > 0) { - p.setPen(QPen(borderFg, borderWidth)); - p.setBrush(activeFg); + const auto seekBorderPen = _overrides.seekBorder + ? QPen(*_overrides.seekBorder, borderWidth) + : QPen(borderFg, borderWidth); + p.setPen(seekBorderPen); + p.setBrush(seekFg); } else { p.setPen(Qt::NoPen); - p.setBrush(activeFg); + p.setBrush(seekFg); } const auto xshift = horizontal ? std::max( diff --git a/Telegram/SourceFiles/ui/widgets/continuous_sliders.h b/Telegram/SourceFiles/ui/widgets/continuous_sliders.h index 51eb8f2cc5..47c27e3f0e 100644 --- a/Telegram/SourceFiles/ui/widgets/continuous_sliders.h +++ b/Telegram/SourceFiles/ui/widgets/continuous_sliders.h @@ -147,6 +147,16 @@ private: class MediaSlider : public ContinuousSlider { public: + struct ColorOverrides { + std::optional activeFg; + std::optional activeBg; + std::optional activeBorder; + std::optional seekFg; + std::optional seekBorder; + std::optional inactiveFg; + std::optional inactiveBorder; + }; + MediaSlider(QWidget *parent, const style::MediaSlider &st); void setAlwaysDisplayMarker(bool alwaysDisplayMarker) { @@ -226,7 +236,7 @@ public: }); } - void setActiveFgOverride(std::optional color); + void setColorOverrides(ColorOverrides overrides); void addDivider(float64 atValue, const QSize &size); protected: @@ -246,7 +256,7 @@ private: bool _paintDisabled = false; std::vector _dividers; - std::optional _activeFgOverride; + ColorOverrides _overrides; };