From fbce06cb26ffd587c1fc1b7881534663ccd0ae01 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 13 Nov 2024 10:33:43 +0300 Subject: [PATCH] Added support of subscription status when it is cancelled by bot. --- Telegram/Resources/langs/lang.strings | 2 + .../info_statistics_list_controllers.cpp | 60 ++++++++++++++----- .../settings/settings_credits_graphics.cpp | 8 ++- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index d0988628c..6d6e3ed67 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2520,12 +2520,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_credits_subscription_off_button" = "Renew Subscription"; "lng_credits_subscription_off_about" = "You have canceled your subscription."; +"lng_credits_subscription_off_by_bot_about" = "{bot} has canceled your subscription."; "lng_credits_subscription_status_on" = "renews on {date}"; "lng_credits_subscription_status_off" = "expires on {date}"; "lng_credits_subscription_status_none" = "expired on {date}"; "lng_credits_subscription_status_off_right" = "canceled"; "lng_credits_subscription_status_none_right" = "expired"; +"lng_credits_subscription_status_off_by_bot_right" = "canceled\nby bot"; "lng_credits_small_balance_title#one" = "{count} Star Needed"; "lng_credits_small_balance_title#other" = "{count} Stars Needed"; diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp index c7b47ec04..3dbe08b96 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp @@ -955,16 +955,29 @@ PaintRoundImageCallback CreditsRow::generatePaintUserpicCallback(bool force) { return _paintUserpicCallback; } +[[nodiscard]] QString RightActionText(const Data::SubscriptionEntry &s) { + return s.cancelledByBot + ? tr::lng_credits_subscription_status_off_by_bot_right(tr::now) + : s.cancelled + ? tr::lng_credits_subscription_status_off_right(tr::now) + : s.expired + ? tr::lng_credits_subscription_status_none_right(tr::now) + : QString(); +} + QSize CreditsRow::rightActionSize() const { if (_rightLabel) { return _rightLabel->size; - } else if (_subscription.cancelled || _subscription.expired) { - const auto text = _subscription.cancelled - ? tr::lng_credits_subscription_status_off_right(tr::now) - : tr::lng_credits_subscription_status_none_right(tr::now); - return QSize( - st::contactsStatusFont->width(text) + st::boxRowPadding.right(), - _rowHeight); + } else if (const auto t = RightActionText(_subscription); !t.isEmpty()) { + const auto lines = t.split('\n'); + auto maxWidth = 0; + for (const auto &line : lines) { + const auto width = st::contactsStatusFont->width(line); + if (width > maxWidth) { + maxWidth = width; + } + } + return QSize(maxWidth + st::boxRowPadding.right(), _rowHeight); } else if (_subscription || _entry) { return QSize( _rightText.maxWidth() + st::boxRowPadding.right() / 2, @@ -994,18 +1007,31 @@ void CreditsRow::rightActionPaint( const auto rightSkip = st::boxRowPadding.right(); if (_rightLabel) { return _rightLabel->draw(p, x, y, _rowHeight); - } else if (_subscription.cancelled || _subscription.expired) { + } else if (const auto t = RightActionText(_subscription); !t.isEmpty()) { const auto &statusFont = st::contactsStatusFont; y += _rowHeight / 2; p.setFont(statusFont); p.setPen(st::attentionButtonFg); - p.drawTextRight( - rightSkip, - y - statusFont->height / 2, - outerWidth, - _subscription.expired - ? tr::lng_credits_subscription_status_none_right(tr::now) - : tr::lng_credits_subscription_status_off_right(tr::now)); + + const auto lines = t.split('\n'); + if (lines.size() > 1) { + const auto rect = QRect(x, 0, outerWidth - x, _rowHeight); + const auto lineHeight = statusFont->height; + const auto totalHeight = lines.size() * lineHeight; + auto startY = rect.top() + + (rect.height() - totalHeight) / 2 + + statusFont->ascent; + + for (const auto &line : lines) { + const auto lineWidth = statusFont->width(line); + const auto startX = rect.left() + + (rect.width() - lineWidth) / 2; + p.drawText(startX, startY, line); + startY += lineHeight; + } + return; + } + p.drawTextRight(rightSkip, y - statusFont->height / 2, outerWidth, t); return; } y += _rowHeight / 2; @@ -1143,7 +1169,9 @@ void CreditsController::applySlice(const Data::CreditsStatusSlice &slice) { .entry = i, .subscription = s, .context = _context, - .rowHeight = computeListSt().item.height, + .rowHeight = ((!s || !s.title.isEmpty()) + ? computeListSt().item + : st::boostsListBox.item).height, .updateCallback = [=](not_null row) { delegate()->peerListUpdateRow(row); }, diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index fc1b1d8e8..cb0ab6e89 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -1270,10 +1270,16 @@ void ReceiptCreditsBox( st::creditsBoxAboutDivider))); } if (s) { + const auto user = peer ? peer->asUser() : nullptr; + const auto bot = (user && !user->isSelf()) ? user : nullptr; Ui::AddSkip(content); auto label = object_ptr( box, - s.cancelled + (s.cancelledByBot && bot) + ? tr::lng_credits_subscription_off_by_bot_about( + lt_bot, + rpl::single(bot->name())) + : s.cancelled ? tr::lng_credits_subscription_off_about() : tr::lng_credits_subscription_on_about( lt_date,