From 7f20cf59d1963931ccb1c0fd1ad4574d906f4427 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 18 Oct 2024 06:33:55 +0300 Subject: [PATCH] Added ministars to button in service messages for gifts. --- .../view/media/history_view_premium_gift.cpp | 4 +++ .../view/media/history_view_premium_gift.h | 1 + .../view/media/history_view_service_box.cpp | 34 +++++++++++++++++-- .../view/media/history_view_service_box.h | 8 +++++ .../ui/effects/premium_stars_colored.cpp | 6 ++++ .../ui/effects/premium_stars_colored.h | 1 + 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp index e12ab3d3f5..12e9f1ffcb 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp @@ -151,6 +151,10 @@ rpl::producer PremiumGift::button() { : tr::lng_prize_open(); } +bool PremiumGift::buttonMinistars() { + return true; +} + ClickHandlerPtr PremiumGift::createViewLink() { if (starGift() && outgoingGift()) { return nullptr; diff --git a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.h b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.h index 00883240db..db976370e9 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.h +++ b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.h @@ -29,6 +29,7 @@ public: QString title() override; TextWithEntities subtitle() override; rpl::producer button() override; + bool buttonMinistars() override; QString cornerTagText() override; int buttonSkip() override; void draw( diff --git a/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp b/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp index 0252e32817..cda0204c64 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp @@ -16,9 +16,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "ui/chat/chat_style.h" #include "ui/effects/animation_value.h" +#include "ui/effects/premium_stars_colored.h" #include "ui/effects/ripple_animation.h" #include "ui/text/text_utilities.h" #include "ui/painter.h" +#include "ui/rect.h" #include "ui/power_saving.h" #include "styles/style_chat.h" #include "styles/style_premium.h" @@ -98,6 +100,12 @@ ServiceBox::ServiceBox( } }, _lifetime); } + if (_content->buttonMinistars()) { + _button.stars = std::make_unique( + [=](const QRect &) { repaint(); }, + Ui::Premium::MiniStars::Type::SlowStars); + _button.lastFg = std::make_unique(); + } } ServiceBox::~ServiceBox() = default; @@ -117,7 +125,21 @@ void ServiceBox::draw(Painter &p, const PaintContext &context) const { const auto radius = st::msgServiceGiftBoxRadius; p.setPen(Qt::NoPen); p.setBrush(context.st->msgServiceBg()); - p.drawRoundedRect(QRect(QPoint(), _innerSize), radius, radius); + p.drawRoundedRect(Rect(_innerSize), radius, radius); + + if (_button.stars) { + const auto &c = context.st->msgServiceFg()->c; + if ((*_button.lastFg) != c) { + _button.lastFg->setRgb(c.red(), c.green(), c.blue()); + const auto padding = _button.size.height() / 2; + _button.stars->setColorOverride(QGradientStops{ + { 0., anim::with_alpha(c, .3) }, + { 1., c }, + }); + _button.stars->setCenter( + Rect(_button.size) - QMargins(padding, 0, padding, 0)); + } + } const auto content = contentRect(); auto top = content.top() + content.height(); @@ -340,7 +362,15 @@ bool ServiceBox::Button::empty() const { void ServiceBox::Button::drawBg(QPainter &p) const { const auto radius = size.height() / 2.; - p.drawRoundedRect(0, 0, size.width(), size.height(), radius, radius); + const auto r = Rect(size); + p.drawRoundedRect(r, radius, radius); + if (stars) { + auto clipPath = QPainterPath(); + clipPath.addRoundedRect(r, radius, radius); + p.setClipPath(clipPath); + stars->paint(p); + p.setClipping(false); + } } } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/media/history_view_service_box.h b/Telegram/SourceFiles/history/view/media/history_view_service_box.h index 2a52e7336b..733176c7dc 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_service_box.h +++ b/Telegram/SourceFiles/history/view/media/history_view_service_box.h @@ -11,6 +11,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Ui { class RippleAnimation; +namespace Premium { +class ColoredMiniStars; +} // namespace Premium } // namespace Ui namespace HistoryView { @@ -28,6 +31,9 @@ public: return top(); } [[nodiscard]] virtual rpl::producer button() = 0; + [[nodiscard]] virtual bool buttonMinistars() { + return false; + } [[nodiscard]] virtual QString cornerTagText() { return {}; } @@ -106,6 +112,8 @@ private: ClickHandlerPtr link; std::unique_ptr ripple; + std::unique_ptr stars; + std::unique_ptr lastFg; mutable QPoint lastPoint; } _button; diff --git a/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp b/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp index 5e20cfd22f..c90dc97aba 100644 --- a/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_stars_colored.cpp @@ -27,6 +27,12 @@ ColoredMiniStars::ColoredMiniStars( type) { } +ColoredMiniStars::ColoredMiniStars( + Fn update, + MiniStars::Type type) +: _ministars(update, true, type) { +} + void ColoredMiniStars::setSize(const QSize &size) { _frame = QImage( size * style::DevicePixelRatio(), diff --git a/Telegram/SourceFiles/ui/effects/premium_stars_colored.h b/Telegram/SourceFiles/ui/effects/premium_stars_colored.h index d0ae77b007..2b56d93aa2 100644 --- a/Telegram/SourceFiles/ui/effects/premium_stars_colored.h +++ b/Telegram/SourceFiles/ui/effects/premium_stars_colored.h @@ -21,6 +21,7 @@ public: not_null parent, bool optimizeUpdate, MiniStars::Type type = MiniStars::Type::MonoStars); + ColoredMiniStars(Fn update, MiniStars::Type type); void setSize(const QSize &size); void setPosition(QPoint position);