From e32031963b643ba17c6aebf06cad0bb857f085a7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 2 Sep 2022 18:51:57 +0400 Subject: [PATCH] Colorize status in premium promo and pack preview. --- .../SourceFiles/boxes/sticker_set_box.cpp | 3 +++ .../data/stickers/data_custom_emoji.cpp | 4 +++ .../data/stickers/data_custom_emoji.h | 2 ++ .../SourceFiles/settings/settings_premium.cpp | 27 +++++++++++++++++-- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index 53454fcd2..320bad243 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -305,6 +305,7 @@ private: std::vector _elements; std::unique_ptr _lottiePlayer; + mutable Ui::Text::CustomEmojiColored _colored; base::flat_map< not_null, std::unique_ptr> _customEmoji; @@ -1268,8 +1269,10 @@ void StickerSetBox::Inner::paintSticker( (_singleSize.height() - size.height()) / 2); auto lottieFrame = QImage(); if (element.emoji) { + _colored.color = st::profileVerifiedCheckBg->c; element.emoji->paint(p, { .preview = st::windowBgOver->c, + .colored = &_colored, .now = now, .position = ppos, .paused = paused, diff --git a/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp b/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp index 19e10d394..d03df2e45 100644 --- a/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp +++ b/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp @@ -782,6 +782,10 @@ Session &CustomEmojiManager::owner() const { return *_owner; } +uint64 CustomEmojiManager::coloredSetId() const { + return _coloredSetId; +} + int FrameSizeFromTag(SizeTag tag) { const auto emoji = EmojiSizeFromTag(tag); const auto factor = style::DevicePixelRatio(); diff --git a/Telegram/SourceFiles/data/stickers/data_custom_emoji.h b/Telegram/SourceFiles/data/stickers/data_custom_emoji.h index cd9194acc..df0a471c6 100644 --- a/Telegram/SourceFiles/data/stickers/data_custom_emoji.h +++ b/Telegram/SourceFiles/data/stickers/data_custom_emoji.h @@ -77,6 +77,8 @@ public: [[nodiscard]] Main::Session &session() const; [[nodiscard]] Session &owner() const; + [[nodiscard]] uint64 coloredSetId() const; + private: static constexpr auto kSizeCount = int(SizeTag::kCount); diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 1b5e8c14a..aeaa7e480 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -437,12 +437,16 @@ public: void paint(QPainter &p); private: - QPixmap paintedPixmap(const QSize &size) const; + [[nodiscard]] QPixmap paintedPixmap(const QSize &size) const; + + void resolveIsColored(); QRectF _rect; std::shared_ptr _media; std::unique_ptr _player; bool _paused = false; + bool _isColored = false; + bool _isColoredResolved = false; rpl::lifetime _lifetime; }; @@ -508,12 +512,31 @@ QPixmap EmojiStatusTopBar::paintedPixmap(const QSize &size) const { return QPixmap(); } +void EmojiStatusTopBar::resolveIsColored() { + if (_isColoredResolved) { + return; + } + const auto document = _media->owner(); + const auto manager = &document->owner().customEmojiManager(); + const auto coloredSetId = manager->coloredSetId(); + if (!coloredSetId) { + return; + } + _isColoredResolved = true; + const auto sticker = document->sticker(); + const auto setId = sticker ? sticker->set.id : 0; + _isColored = sticker && (sticker->set.id == coloredSetId); +} + void EmojiStatusTopBar::paint(QPainter &p) { if (_player) { if (_player->ready()) { + resolveIsColored(); const auto frame = _player->frame( _rect.size().toSize(), - Qt::transparent, + (_isColored + ? st::profileVerifiedCheckBg->c + : QColor(0, 0, 0, 0)), false, crl::now(), _paused);