diff --git a/Telegram/Resources/icons/settings/star.svg b/Telegram/Resources/icons/settings/star.svg index fa6113843..ec5f637d2 100644 --- a/Telegram/Resources/icons/settings/star.svg +++ b/Telegram/Resources/icons/settings/star.svg @@ -1 +1 @@ - +gradientPlaceholder diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index cf07cd00f..6c883494c 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_premium.h" #include "ui/abstract_button.h" #include "ui/basic_click_handlers.h" +#include "ui/color_contrast.h" #include "ui/effects/gradient.h" #include "ui/effects/premium_graphics.h" #include "ui/effects/premium_stars_colored.h" @@ -66,11 +67,39 @@ using SectionCustomTopBarData = Info::Settings::SectionCustomTopBarData; constexpr auto kBodyAnimationPart = 0.90; constexpr auto kTitleAdditionalScale = 0.15; +constexpr auto kMinAcceptableContrast = 4.5; // 1.14; [[nodiscard]] QString Svg() { return u":/gui/icons/settings/star.svg"_q; } +[[nodiscard]] QByteArray ColorizedSvg() { + auto f = QFile(Svg()); + if (!f.open(QIODevice::ReadOnly)) { + return QByteArray(); + } + auto content = qs(f.readAll()); + auto stops = [] { + auto s = QString(); + for (const auto &stop : Ui::Premium::ButtonGradientStops()) { + s += QString("") + .arg(QString::number(stop.first), stop.second.name()); + } + return s; + }(); + const auto color = QString("%5") + .arg(0) + .arg(1) + .arg(1) + .arg(0) + .arg(std::move(stops)); + content.replace(u"gradientPlaceholder"_q, color); + content.replace(u"#fff"_q, u"url(#Gradient2)"_q); + f.close(); + return content.toUtf8(); +} + [[nodiscard]] Data::SubscriptionOptions SubscriptionOptionsForRows( Data::SubscriptionOptions result) { for (auto &option : result) { @@ -532,7 +561,6 @@ private: std::unique_ptr _emojiStatus; QImage _imageStar; - QRectF _ministarsRect; QRectF _starRect; }; @@ -805,16 +833,7 @@ void TopBarUser::paintEvent(QPaintEvent *e) { void TopBarUser::resizeEvent(QResizeEvent *e) { _starRect = TopBarAbstract::starRect(1., 1.); - const auto &rect = _starRect; - const auto center = rect.center(); - const auto size = QSize( - rect.width() * Ui::Premium::MiniStars::kSizeFactor, - rect.height()); - const auto ministarsRect = QRect( - QPoint(center.x() - size.width(), center.y() - size.height()), - QPoint(center.x() + size.width(), center.y() + size.height())); - _ministars.setPosition(ministarsRect.topLeft()); - _ministars.setSize(ministarsRect.size()); + _ministars.setCenter(_starRect.toRect()); if (_emojiStatus) { _emojiStatus->setCenter(_starRect.center()); @@ -840,7 +859,7 @@ private: const style::font &_titleFont; const style::margins &_titlePadding; object_ptr _about; - Ui::Premium::MiniStars _ministars; + Ui::Premium::ColoredMiniStars _ministars; QSvgRenderer _star; struct { @@ -850,7 +869,8 @@ private: float64 scaleTitle = 0.; } _progress; - QRectF _ministarsRect; + bool _isDark = false; + QRectF _starRect; QPoint _titlePosition; @@ -867,8 +887,7 @@ TopBar::TopBar( , _titleFont(st::boxTitle.style.font) , _titlePadding(st::settingsPremiumTitlePadding) , _about(this, std::move(about), st::settingsPremiumAbout) -, _ministars([=](const QRect &r) { update(r); }) -, _star(Svg()) { +, _ministars(this) { std::move( title ) | rpl::start_with_next([=](QString text) { @@ -889,6 +908,27 @@ TopBar::TopBar( }); return false; }); + + rpl::single( + rpl::empty_value() + ) | rpl::then( + style::PaletteChanged() + ) | rpl::start_with_next([=] { + const auto contrast = Ui::CountContrast( + st::boxBg->c, + st::premiumButtonFg->c); + _isDark = (contrast > kMinAcceptableContrast); + + if (!_isDark) { + _star.load(Svg()); + _ministars.setColorOverride(st::premiumButtonFg->c); + } else { + _star.load(ColorizedSvg()); + _ministars.setColorOverride(std::nullopt); + } + auto event = QResizeEvent(size(), size()); + resizeEvent(&event); + }, lifetime()); } void TopBar::setPaused(bool paused) { @@ -911,7 +951,8 @@ void TopBar::resizeEvent(QResizeEvent *e) { _progress.title = 1. - progress; _progress.scaleTitle = 1. + kTitleAdditionalScale * progress; - _ministarsRect = starRect(_progress.top, 1.); + _ministars.setCenter(starRect(_progress.top, 1.).toRect()); + _starRect = starRect(_progress.top, _progress.body); const auto &padding = st::boxRowPadding; @@ -937,22 +978,26 @@ void TopBar::paintEvent(QPaintEvent *e) { const auto r = rect(); - const auto gradientPointTop = r.height() / 3. * 2.; - auto gradient = QLinearGradient( - QPointF(0, gradientPointTop), - QPointF(r.width(), r.height() - gradientPointTop)); - gradient.setColorAt(0., st::premiumButtonBg1->c); - gradient.setColorAt(.6, st::premiumButtonBg2->c); - gradient.setColorAt(1., st::premiumButtonBg3->c); + if (!_isDark) { + const auto gradientPointTop = r.height() / 3. * 2.; + auto gradient = QLinearGradient( + QPointF(0, gradientPointTop), + QPointF(r.width(), r.height() - gradientPointTop)); + gradient.setStops(Ui::Premium::ButtonGradientStops()); - TopBarAbstract::paintEdges(p, gradient); + TopBarAbstract::paintEdges(p, gradient); + } else { + TopBarAbstract::paintEdges(p, st::boxBg); + TopBarAbstract::paintEdges(p, st::shadowFg); + TopBarAbstract::paintEdges(p, st::shadowFg); + } p.setOpacity(_progress.body); p.translate(_starRect.center()); p.scale(_progress.body, _progress.body); p.translate(-_starRect.center()); if (_progress.top) { - _ministars.paint(p, _ministarsRect); + _ministars.paint(p); } p.resetTransform(); diff --git a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp index 779caf5f2..bb73000db 100644 --- a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp @@ -1063,7 +1063,7 @@ void AddGiftOptions( p.drawRoundedRect(borderRect, round, round); } - p.setPen(st::boxBg); + p.setPen(st::premiumButtonFg); p.setFont(discountFont); p.drawText(discountRect, info.discount, style::al_center); diff --git a/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp b/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp index 7f537b1b3..4458df5e0 100644 --- a/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp @@ -29,11 +29,15 @@ void ColoredMiniStars::setSize(const QSize &size) { _mask.fill(Qt::transparent); { Painter p(&_mask); - auto gradient = QLinearGradient(0, 0, size.width(), 0); - gradient.setStops(Ui::Premium::GiftGradientStops()); - p.setPen(Qt::NoPen); - p.setBrush(gradient); - p.drawRect(0, 0, size.width(), size.height()); + if (_colorOverride) { + p.fillRect(0, 0, size.width(), size.height(), *_colorOverride); + } else { + auto gradient = QLinearGradient(0, 0, size.width(), 0); + gradient.setStops(Ui::Premium::GiftGradientStops()); + p.setPen(Qt::NoPen); + p.setBrush(gradient); + p.drawRect(0, 0, size.width(), size.height()); + } } _size = size; @@ -53,6 +57,10 @@ void ColoredMiniStars::setPosition(QPoint position) { _position = std::move(position); } +void ColoredMiniStars::setColorOverride(std::optional color) { + _colorOverride = color; +} + void ColoredMiniStars::paint(Painter &p) { _frame.fill(Qt::transparent); { @@ -69,5 +77,17 @@ void ColoredMiniStars::setPaused(bool paused) { _ministars.setPaused(paused); } +void ColoredMiniStars::setCenter(const QRect &rect) { + const auto center = rect.center(); + const auto size = QSize( + rect.width() * Ui::Premium::MiniStars::kSizeFactor, + rect.height()); + const auto ministarsRect = QRect( + QPoint(center.x() - size.width(), center.y() - size.height()), + QPoint(center.x() + size.width(), center.y() + size.height())); + setPosition(ministarsRect.topLeft()); + setSize(ministarsRect.size()); +} + } // namespace Premium } // namespace Ui diff --git a/Telegram/SourceFiles/ui/effects/premium_stars_colored.h b/Telegram/SourceFiles/ui/effects/premium_stars_colored.h index 294436764..f5c058760 100644 --- a/Telegram/SourceFiles/ui/effects/premium_stars_colored.h +++ b/Telegram/SourceFiles/ui/effects/premium_stars_colored.h @@ -20,6 +20,8 @@ public: void setSize(const QSize &size); void setPosition(QPoint position); + void setColorOverride(std::optional color); + void setCenter(const QRect &rect); void paint(Painter &p); void setPaused(bool paused); @@ -31,6 +33,7 @@ private: QImage _mask; QSize _size; QPoint _position; + std::optional _colorOverride; };