From e854f0b60cbf12b08b3a3b4a52bf0cf7285c91c1 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 8 Dec 2023 12:16:24 +0400 Subject: [PATCH] Show additional prize in giveaway message. --- Telegram/Resources/langs/lang.strings | 3 + .../view/media/history_view_giveaway.cpp | 68 ++++++++++++++++++- .../view/media/history_view_giveaway.h | 5 ++ Telegram/SourceFiles/ui/chat/chat.style | 2 + 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index c0aba5bd5..a20f3f652 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2198,6 +2198,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_prizes_title#one" = "Giveaway Prize"; "lng_prizes_title#other" = "Giveaway Prizes"; +"lng_prizes_additional#one" = "**{count}** {prize}"; +"lng_prizes_additional#other" = "**{count}** {prize}"; +"lng_prizes_additional_with" = "with"; "lng_prizes_about#one" = "**{count}** Telegram Premium Subscription {duration}."; "lng_prizes_about#other" = "**{count}** Telegram Premium Subscriptions {duration}."; "lng_prizes_participants" = "Participants"; diff --git a/Telegram/SourceFiles/history/view/media/history_view_giveaway.cpp b/Telegram/SourceFiles/history/view/media/history_view_giveaway.cpp index 81dbf0684..66f26b668 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_giveaway.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_giveaway.cpp @@ -35,6 +35,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace HistoryView { namespace { +constexpr auto kAdditionalPrizesWithLineOpacity = 0.6; + [[nodiscard]] QSize CountOptimalTextSize( const Ui::Text::String &text, int minWidth, @@ -80,6 +82,24 @@ void Giveaway::fillFromData(not_null giveaway) { tr::lng_prizes_title(tr::now, lt_count, _quantity), kDefaultTextOptions); + if (giveaway->additionalPrize.isEmpty()) { + _additional.clear(); + _with.clear(); + } else { + _additional.setMarkedText( + st::defaultTextStyle, + tr::lng_prizes_additional( + tr::now, + lt_count, + _quantity, + lt_prize, + TextWithEntities{ giveaway->additionalPrize }, + Ui::Text::RichLangValue)); + _with.setText( + st::defaultTextStyle, + tr::lng_prizes_additional_with(tr::now)); + } + _prizes.setMarkedText( st::defaultTextStyle, tr::lng_prizes_about( @@ -88,8 +108,7 @@ void Giveaway::fillFromData(not_null giveaway) { _quantity, lt_duration, Ui::Text::Bold(GiftDuration(_months)), - Ui::Text::RichLangValue), - kDefaultTextOptions); + Ui::Text::RichLangValue)); _participantsTitle.setText( st::semiboldTextStyle, tr::lng_prizes_participants(tr::now), @@ -163,9 +182,25 @@ QSize Giveaway::countOptimalSize() { _prizesTitleTop = _stickerTop + st::msgServiceGiftBoxStickerSize.height() + st::chatGiveawayPrizesTop; - _prizesTop = _prizesTitleTop + _additionalTop = _prizesTitleTop + _prizesTitle.countHeight(available) + st::chatGiveawayPrizesSkip; + if (!_additional.isEmpty()) { + const auto additionalSize = CountOptimalTextSize( + _additional, + st::msgMinWidth, + available); + _additionalWidth = additionalSize.width(); + _withTop = _additionalTop + + additionalSize.height() + + st::chatGiveawayPrizesWithPadding.top(); + _prizesTop = _withTop + + st::normalFont->height + + st::chatGiveawayPrizesWithPadding.bottom(); + } else { + _additionalWidth = 0; + _prizesTop = _withTop = _additionalTop; + } const auto prizesSize = CountOptimalTextSize( _prizes, st::msgMinWidth, @@ -285,6 +320,33 @@ void Giveaway::draw(Painter &p, const PaintContext &context) const { }); }; paintText(_prizesTitle, _prizesTitleTop, paintw); + if (!_additional.isEmpty()) { + paintText(_additional, _additionalTop, _additionalWidth); + p.setPen(stm->msgDateFg); + _with.draw(p, { + .position = { padding.left(), _withTop }, + .outerWidth = outer, + .availableWidth = paintw, + .align = style::al_top, + .palette = &stm->textPalette, + .now = context.now, + .elisionLines = 1, + }); + const auto skip = st::chatGiveawayPrizesWithPadding; + const auto inner = outer - 2 * (skip.left() + skip.right()); + const auto sub = _with.maxWidth(); + if (inner > sub + 1) { + const auto fill = (inner - sub) / 2; + const auto stroke = st::lineWidth; + const auto top = _withTop + + st::chatGiveawayPrizesWithTop; + p.setOpacity(kAdditionalPrizesWithLineOpacity); + p.fillRect(skip.left(), top, fill, stroke, stm->msgDateFg); + const auto start = outer - skip.left() - fill; + p.fillRect(start, top, fill, stroke, stm->msgDateFg); + p.setOpacity(1.); + } + } paintText(_prizes, _prizesTop, _prizesWidth); paintText(_participantsTitle, _participantsTitleTop, paintw); paintText(_participants, _participantsTop, _participantsWidth); diff --git a/Telegram/SourceFiles/history/view/media/history_view_giveaway.h b/Telegram/SourceFiles/history/view/media/history_view_giveaway.h index 250e214c2..9f8aeed27 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_giveaway.h +++ b/Telegram/SourceFiles/history/view/media/history_view_giveaway.h @@ -89,6 +89,8 @@ private: mutable std::optional _sticker; Ui::Text::String _prizesTitle; + Ui::Text::String _additional; + Ui::Text::String _with; Ui::Text::String _prizes; Ui::Text::String _participantsTitle; Ui::Text::String _participants; @@ -107,6 +109,9 @@ private: int _quantity = 0; int _stickerTop = 0; int _prizesTitleTop = 0; + int _additionalTop = 0; + int _additionalWidth = 0; + int _withTop = 0; int _prizesTop = 0; int _prizesWidth = 0; int _participantsTitleTop = 0; diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 122daf9e3..be34843b4 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -980,6 +980,8 @@ chatGiveawayBadgePadding: margins(7px, 1px, 5px, 3px); chatGiveawayBadgeStroke: 2px; chatGiveawayPrizesTop: 16px; chatGiveawayPrizesSkip: 4px; +chatGiveawayPrizesWithPadding: margins(22px, 2px, 8px, 2px); +chatGiveawayPrizesWithTop: 9px; chatGiveawayParticipantsTop: 16px; chatGiveawayParticipantsSkip: 4px; chatGiveawayChannelTop: 6px;