From 64dbbd7d09df1dd6b9da22c5b418e3341677a5b7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 3 Dec 2024 15:10:39 +0400 Subject: [PATCH] Green badges for commissions. --- .../starref/info_bot_starref_join_widget.cpp | 95 +++++++++++++++++-- Telegram/SourceFiles/ui/effects/premium.style | 2 + 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp index 5aab0da6e..5d888e07b 100644 --- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp @@ -39,6 +39,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/padding_wrap.h" #include "ui/wrap/slide_wrap.h" #include "ui/wrap/vertical_layout.h" +#include "ui/painter.h" #include "ui/ui_utility.h" #include "ui/vertical_list.h" #include "styles/style_info.h" @@ -126,6 +127,89 @@ private: }; +class Row final : public PeerListRow { +public: + Row(not_null peer, StarRefProgram program); + + void paintStatusText( + Painter &p, + const style::PeerListItem &st, + int x, + int y, + int availableWidth, + int outerWidth, + bool selected) override; + +private: + void refreshStatus() override; + + StarRefProgram _program; + QImage _badge; + +}; + +Row::Row(not_null peer, StarRefProgram program) +: PeerListRow(peer) +, _program(program) { +} + +void Row::paintStatusText( + Painter &p, + const style::PeerListItem &st, + int x, + int y, + int availableWidth, + int outerWidth, + bool selected) { + const auto top = y + + st::contactsStatusFont->ascent + - st::starrefCommissionFont->ascent + - st::lineWidth; + p.drawImage(x, top, _badge); + + const auto space = st::normalFont->spacew; + auto shift = (_badge.width() / _badge.devicePixelRatio()) + space; + x += shift; + availableWidth -= shift; + + PeerListRow::paintStatusText( + p, + st, + x, + y, + availableWidth, + outerWidth, + selected); +} + +void Row::refreshStatus() { + const auto text = FormatCommission(_program.commission); + const auto padding = st::starrefCommissionPadding; + const auto font = st::starrefCommissionFont; + const auto width = font->width(text); + const auto inner = QRect(0, 0, width, font->height); + const auto outer = inner.marginsAdded(padding); + const auto ratio = style::DevicePixelRatio(); + _badge = QImage( + outer.size() * ratio, + QImage::Format_ARGB32_Premultiplied); + _badge.setDevicePixelRatio(ratio); + _badge.fill(Qt::transparent); + + auto p = QPainter(&_badge); + p.setBrush(st::historyPeer2UserpicBg2); + p.setPen(Qt::NoPen); + const auto radius = st::roundRadiusSmall; + p.drawRoundedRect(outer.translated(-outer.topLeft()), radius, radius); + p.setFont(font); + p.setBrush(Qt::NoBrush); + p.setPen(st::historyPeerUserpicFg); + p.drawText(padding.left(), padding.top() + font->ascent, text); + p.end(); + + setCustomStatus(FormatProgramDuration(_program.durationMonths)); +} + void Resolve( not_null peer, not_null bot, @@ -168,16 +252,7 @@ Main::Session &ListController::session() const { std::unique_ptr ListController::createRow(ConnectedBot bot) { _states.emplace(bot.bot, bot.state); - auto result = std::make_unique(bot.bot); - const auto program = bot.state.program; - if (bot.state.revoked) { - result->setCustomStatus(u"Revoked"_q); - } else { - result->setCustomStatus(u"+%1, %2"_q.arg( - FormatCommission(program.commission), - FormatProgramDuration(program.durationMonths))); - } - return result; + return std::make_unique(bot.bot, bot.state.program); } void ListController::prepare() { diff --git a/Telegram/SourceFiles/ui/effects/premium.style b/Telegram/SourceFiles/ui/effects/premium.style index b63121921..b4477fdc0 100644 --- a/Telegram/SourceFiles/ui/effects/premium.style +++ b/Telegram/SourceFiles/ui/effects/premium.style @@ -478,6 +478,8 @@ starrefLinkCountPadding: margins(2px, 0px, 3px, 1px); starrefRecipientBg: lightButtonBgOver; starrefRecipientBgDisabled: windowBgOver; starrefRecipientArrow: icon{{ "intro_country_dropdown", lightButtonFg }}; +starrefCommissionFont: font(10px semibold); +starrefCommissionPadding: margins(3px, 0px, 3px, 0px); starrefAddForBotIcon: icon {{ "menu/bot_add", lightButtonFg }}; starrefAddForBotIconPosition: point(23px, 2px);