From 97c0e3d4a99ce3f861675a5fcd3f6ce5351cd571 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 15 May 2025 09:46:57 +0300 Subject: [PATCH] Added support of custom emoji to top bar suggestion. --- .../dialogs/dialogs_top_bar_suggestion.cpp | 23 +++++++++++++++-- .../ui/dialogs_top_bar_suggestion_content.cpp | 25 ++++++++----------- .../ui/dialogs_top_bar_suggestion_content.h | 8 +++++- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp index 50e41bdee0..b83401fab0 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/star_gift_box.h" // ShowStarGiftBox. #include "core/application.h" #include "core/click_handler_types.h" +#include "core/ui_integration.h" #include "data/data_birthday.h" #include "data/data_changes.h" #include "data/data_session.h" @@ -28,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_credits_graphics.h" #include "settings/settings_premium.h" #include "ui/controls/userpic_button.h" +#include "ui/effects/credits_graphics.h" #include "ui/layers/generic_box.h" #include "ui/text/format_values.h" #include "ui/text/text_utilities.h" @@ -136,7 +138,11 @@ rpl::producer*> TopBarSuggestionValue( promo->dismiss(custom->suggestion); repeat(repeat); }); - content->setContent(custom->title, custom->description); + + content->setContent( + custom->title, + custom->description, + Core::TextContext({ .session = session })); state->desiredWrapToggle.force_assign( Toggle{ true, anim::type::normal }); return; @@ -194,6 +200,19 @@ rpl::producer*> TopBarSuggestionValue( promo->dismiss(kSugLowCreditsSubs.utf8()); repeat(repeat); }); + + const auto fontH = content->contentTitleSt().font->height; + auto customEmojiFactory = [=]( + QStringView data, + const Ui::Text::MarkedContext &context + ) -> std::unique_ptr { + return Ui::MakeCreditsIconEmoji(fontH, 1); + }; + using namespace Ui::Text; + auto context = MarkedContext{ + .customEmojiFactory = std::move(customEmojiFactory), + }; + content->setContent( tr::lng_dialogs_suggestions_credits_sub_low_title( tr::now, @@ -207,7 +226,7 @@ rpl::producer*> TopBarSuggestionValue( tr::lng_dialogs_suggestions_credits_sub_low_about( tr::now, TextWithEntities::Simple), - true); + std::move(context)); state->desiredWrapToggle.force_assign( Toggle{ true, anim::type::normal }); }; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp index c39130c855..40d70b2bc2 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp @@ -6,7 +6,7 @@ For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "dialogs/ui/dialogs_top_bar_suggestion_content.h" -#include "ui/effects/credits_graphics.h" +#include "ui/text/format_values.h" #include "ui/text/text_custom_emoji.h" #include "ui/ui_rpl_filter.h" #include "styles/style_chat.h" @@ -141,28 +141,19 @@ void TopBarSuggestionContent::draw(QPainter &p) { void TopBarSuggestionContent::setContent( TextWithEntities title, TextWithEntities description, - bool makeContext) { - if (makeContext) { - auto customEmojiFactory = [=, h = _contentTitleSt.font->height]( - QStringView data, - const Ui::Text::MarkedContext &context - ) -> std::unique_ptr { - return Ui::MakeCreditsIconEmoji(h, 1); - }; - const auto context = Ui::Text::MarkedContext{ - .repaint = [=] { update(); }, - .customEmojiFactory = std::move(customEmojiFactory), - }; + std::optional context) { + if (context) { + context->repaint = [=] { update(); }; _contentTitle.setMarkedText( _contentTitleSt, std::move(title), kMarkupTextOptions, - context); + *context); _contentText.setMarkedText( _contentTextSt, std::move(description), kMarkupTextOptions, - context); + base::take(*context)); } else { _contentTitle.setMarkedText(_contentTitleSt, std::move(title)); _contentText.setMarkedText(_contentTextSt, std::move(description)); @@ -203,4 +194,8 @@ void TopBarSuggestionContent::setLeftPadding(int value) { update(); } +const style::TextStyle & TopBarSuggestionContent::contentTitleSt() const { + return _contentTitleSt; +} + } // namespace Dialogs diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h index 39aa4f997b..8297e37074 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h @@ -14,6 +14,10 @@ class DynamicImage; class IconButton; } // namespace Ui +namespace Ui::Text { +struct MarkedContext; +} // namespace Ui::Text + namespace Dialogs { class TopBarSuggestionContent : public Ui::RippleButton { @@ -29,7 +33,7 @@ public: void setContent( TextWithEntities title, TextWithEntities description, - bool makeContext = false); + std::optional context = std::nullopt); [[nodiscard]] rpl::producer desiredHeightValue() const override; @@ -37,6 +41,8 @@ public: void setRightIcon(RightIcon); void setLeftPadding(int); + [[nodiscard]] const style::TextStyle &contentTitleSt() const; + protected: void paintEvent(QPaintEvent *) override;