diff --git a/Telegram/Resources/art/verified_bg.webp b/Telegram/Resources/art/verified_bg.webp new file mode 100644 index 000000000..f08059f45 Binary files /dev/null and b/Telegram/Resources/art/verified_bg.webp differ diff --git a/Telegram/Resources/art/verified_fg.webp b/Telegram/Resources/art/verified_fg.webp new file mode 100644 index 000000000..353512349 Binary files /dev/null and b/Telegram/Resources/art/verified_fg.webp differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check.png index dc9c4b0da..27b8ca7e9 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png index 677770111..e360526c7 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png index ceffe4197..461255463 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star.png index 24adac8ca..e5a02de92 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png index 98d33bd22..813641ebb 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png index 55734f48e..699f94d8b 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png differ diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc index a5459ef75..232d074a4 100644 --- a/Telegram/Resources/qrc/telegram/telegram.qrc +++ b/Telegram/Resources/qrc/telegram/telegram.qrc @@ -34,6 +34,8 @@ ../../art/topic_icons/general.svg ../../icons/info/edit/links_subscription.svg ../../icons/plane_white.svg + ../../art/verified_bg.webp + ../../art/verified_fg.webp ../../icons/calls/hands.lottie diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index c72c392a0..72d257d99 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -799,9 +799,6 @@ int PeerListRow::paintNameIconGetWidth( outerWidth, { .peer = peer(), - .verified = &(selected - ? st::dialogsVerifiedIconOver - : st::dialogsVerifiedIcon), .premium = &(selected ? st::dialogsPremiumIcon.over : st::dialogsPremiumIcon.icon), diff --git a/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp b/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp index 9c830dc57..1a189fa7f 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_lottie.cpp @@ -31,6 +31,12 @@ namespace { constexpr auto kDontCacheLottieAfterArea = 512 * 512; +[[nodiscard]] uint64 LocalStickerId(QStringView name) { + auto full = u"local_sticker:"_q; + full.append(name); + return XXH64(full.data(), full.size() * sizeof(QChar), 0); +} + } // namespace uint8 LottieCacheKeyShift(uint8 replacementsTag, StickerLottieSize sizeTag) { @@ -315,16 +321,9 @@ QSize ComputeStickerSize(not_null document, QSize box) { return HistoryView::NonEmptySize(request.size(dimensions, 8) / ratio); } -[[nodiscard]] uint64 LocalTgsStickerId(QStringView name) { - auto full = u"local_tgs_sticker:"_q; - full.append(name); - return XXH64(full.data(), full.size() * sizeof(QChar), 0); -} - -not_null GenerateLocalTgsSticker( +not_null GenerateLocalSticker( not_null session, - const QString &name) { - const auto path = u":/animations/"_q + name + u".tgs"_q; + const QString &path) { auto task = FileLoadTask( session, path, @@ -335,7 +334,7 @@ not_null GenerateLocalTgsSticker( {}, false, nullptr, - LocalTgsStickerId(name)); + LocalStickerId(path)); task.process({ .generateGoodThumbnail = false }); const auto result = task.peekResult(); Assert(result != nullptr); @@ -348,8 +347,18 @@ not_null GenerateLocalTgsSticker( document->setLocation(Core::FileLocation(path)); Ensures(document->sticker()); - Ensures(document->sticker()->isLottie()); return document; } +not_null GenerateLocalTgsSticker( + not_null session, + const QString &name) { + const auto result = GenerateLocalSticker( + session, + u":/animations/"_q + name + u".tgs"_q); + + Ensures(result->sticker()->isLottie()); + return result; +} + } // namespace ChatHelpers diff --git a/Telegram/SourceFiles/chat_helpers/stickers_lottie.h b/Telegram/SourceFiles/chat_helpers/stickers_lottie.h index e659329dd..d213f82bc 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_lottie.h +++ b/Telegram/SourceFiles/chat_helpers/stickers_lottie.h @@ -130,6 +130,10 @@ bool PaintStickerThumbnailPath( not_null document, QSize box); +[[nodiscard]] not_null GenerateLocalSticker( + not_null session, + const QString &path); + [[nodiscard]] not_null GenerateLocalTgsSticker( not_null session, const QString &name); diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index dc952ddc6..e8173de68 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_bot.h" #include "api/api_text_entities.h" #include "api/api_user_names.h" +#include "chat_helpers/stickers_lottie.h" #include "core/application.h" #include "core/core_settings.h" #include "core/mime_type.h" // Core::IsMimeSticker @@ -353,11 +354,16 @@ Session::Session(not_null session) Ui::VerifyDetails Session::verifiedByTelegram() { if (_verifiedByTelegramIconBgId.isEmpty()) { - auto &manager = customEmojiManager(); - _verifiedByTelegramIconBgId = manager.registerInternalEmoji( - st::dialogsVerifiedBg); - _verifiedByTelegramIconFgId = manager.registerInternalEmoji( - st::dialogsVerifiedFg); + const auto bg = ChatHelpers::GenerateLocalSticker( + _session, + u":/gui/art/verified_bg.webp"_q); + bg->overrideEmojiUsesTextColor(true); + const auto fg = ChatHelpers::GenerateLocalSticker( + _session, + u":/gui/art/verified_fg.webp"_q); + fg->overrideEmojiUsesTextColor(true); + _verifiedByTelegramIconBgId = Data::SerializeCustomEmojiId(bg); + _verifiedByTelegramIconFgId = Data::SerializeCustomEmojiId(fg); } return { .iconBgId = _verifiedByTelegramIconBgId, diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index a5d322962..7e27ab419 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -409,6 +409,7 @@ dialogsLockIcon: ThreeStateIcon { dialogsVerifiedBg: icon{{ "dialogs/dialogs_verified_star", dialogsVerifiedIconBg }}; dialogsVerifiedFg: icon{{ "dialogs/dialogs_verified_check", dialogsVerifiedIconFg }}; +dialogsVerifiedPadding: margins(0px, 3px, 0px, 0px); dialogsVerifiedColors: VerifiedBadge { height: 20px; bg: dialogsVerifiedIconBg; @@ -423,18 +424,6 @@ dialogsVerifiedColorsActive: VerifiedBadge(dialogsVerifiedColors) { fg: dialogsVerifiedIconFgActive; } -dialogsVerifiedIcon: icon { - { "dialogs/dialogs_verified_star", dialogsVerifiedIconBg }, - { "dialogs/dialogs_verified_check", dialogsVerifiedIconFg }, -}; -dialogsVerifiedIconOver: icon { - { "dialogs/dialogs_verified_star", dialogsVerifiedIconBgOver }, - { "dialogs/dialogs_verified_check", dialogsVerifiedIconFgOver }, -}; -dialogsVerifiedIconActive: icon { - { "dialogs/dialogs_verified_star", dialogsVerifiedIconBgActive }, - { "dialogs/dialogs_verified_check", dialogsVerifiedIconFgActive }, -}; dialogsPremiumIcon: ThreeStateIcon { icon: icon {{ "dialogs/dialogs_premium", dialogsVerifiedIconBg }}; over: icon {{ "dialogs/dialogs_premium", dialogsVerifiedIconBgOver }}; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 51dc9f11e..44ef4f6a6 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -1398,11 +1398,6 @@ void InnerWidget::paintPeerSearchResult( context.width, { .peer = peer, - .verified = (context.active - ? &st::dialogsVerifiedIconActive - : context.selected - ? &st::dialogsVerifiedIconOver - : &st::dialogsVerifiedIcon), .premium = &ThreeStateIcon( st::dialogsPremiumIcon, context.active, diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index 350ea38ba..e4243c7ae 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -732,11 +732,6 @@ void PaintRow( context.width, { .peer = from, - .verified = (context.active - ? &st::dialogsVerifiedIconActive - : context.selected - ? &st::dialogsVerifiedIconOver - : &st::dialogsVerifiedIcon), .premium = &ThreeStateIcon( st::dialogsPremiumIcon, context.active, diff --git a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp index 0e2da0d49..4d89cd300 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp @@ -589,7 +589,6 @@ void TopBarWidget::paintTopBar(Painter &p) { width(), { .peer = namePeer, - .verified = &st::dialogsVerifiedIcon, .premium = &st::dialogsPremiumIcon.icon, .scam = &st::attentionButtonFg, .premiumFg = &st::dialogsVerifiedIconBg, diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index f121010da..1ae86e9d3 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -22,7 +22,6 @@ InfoToggle { } InfoPeerBadge { - verified: icon; premium: icon; premiumFg: color; premiumInnerFg: color; @@ -437,7 +436,6 @@ infoVerifiedCheck: icon { infoPremiumStar: icon {{ "profile_premium", profileVerifiedCheckBg }}; infoPeerBadge: InfoPeerBadge { - verified: infoVerifiedCheck; premium: infoPremiumStar; premiumFg: profileVerifiedCheckBg; premiumInnerFg: profileVerifiedCheckFg; diff --git a/Telegram/SourceFiles/info/profile/info_profile_badge.cpp b/Telegram/SourceFiles/info/profile/info_profile_badge.cpp index a2d15131e..ee2c1a035 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_badge.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_badge.cpp @@ -35,7 +35,12 @@ namespace { } else if (emojiStatusId && badge == BadgeType::None) { badge = BadgeType::Premium; } - return Badge::Content{ badge, emojiStatusId }; + return Badge::Content{ + badge, + (emojiStatusId + ? Data::SerializeCustomEmojiId(emojiStatusId) + : QString()), + }; }); } @@ -115,14 +120,14 @@ void Badge::setContent(Content content) { case BadgeType::Premium: { const auto id = _content.emojiStatusId; const auto innerId = _content.emojiStatusInnerId; - if (id || innerId) { - _emojiStatus = id + if (!id.isEmpty() || !innerId.isEmpty()) { + _emojiStatus = !id.isEmpty() ? _session->data().customEmojiManager().create( id, [raw = _view.data()] { raw->update(); }, sizeTag()) : nullptr; - _statusInner = innerId + _statusInner = !innerId.isEmpty() ? _session->data().customEmojiManager().create( innerId, [raw = _view.data()] { raw->update(); }, @@ -162,9 +167,7 @@ void Badge::setContent(Content content) { } }, _view->lifetime()); } else { - const auto icon = (_content.badge == BadgeType::Verified) - ? &_st.verified - : &_st.premium; + const auto icon = &_st.premium; _view->resize(icon->size()); _view->paintRequest( ) | rpl::start_with_next([=, check = _view.data()]{ @@ -224,9 +227,9 @@ void Badge::move(int left, int top, int bottom) { return; } const auto star = !_emojiStatus - && (_content.badge == BadgeType::Premium - || _content.badge == BadgeType::Verified); - const auto fake = !_emojiStatus && !star; + && (_content.badge == BadgeType::Premium); + const auto fake = (!_emojiStatus && !star) + || (_content.badge == BadgeType::Verified); const auto skip = fake ? 0 : _st.position.x(); const auto badgeLeft = left + skip; const auto badgeTop = top diff --git a/Telegram/SourceFiles/info/profile/info_profile_badge.h b/Telegram/SourceFiles/info/profile/info_profile_badge.h index efff823cb..ea24f2fb6 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_badge.h +++ b/Telegram/SourceFiles/info/profile/info_profile_badge.h @@ -58,8 +58,8 @@ public: struct Content { BadgeType badge = BadgeType::None; - DocumentId emojiStatusId = 0; - DocumentId emojiStatusInnerId = 0; + QString emojiStatusId; + QString emojiStatusInnerId; friend inline constexpr bool operator==(Content, Content) = default; }; diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp index 02ad4f532..0b69500b4 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp @@ -302,10 +302,8 @@ Cover::Cover( const auto details = peer->verifyDetails(); return Badge::Content{ .badge = details ? BadgeType::Verified : BadgeType::None, - .emojiStatusId = details ? details->iconBgId.toULongLong() : 0, - .emojiStatusInnerId = (details - ? details->iconFgId.toULongLong() - : 0), + .emojiStatusId = details ? details->iconBgId : QString(), + .emojiStatusInnerId = details ? details->iconFgId : QString(), }; }); } diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 4453a307e..4e472b96a 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -197,10 +197,6 @@ settingsInfoPhotoSkip: 7px; settingsInfoNameSkip: -1px; settingsInfoUploadLeft: 6px; settingsInfoPeerBadge: InfoPeerBadge { - verified: icon { - { "dialogs/dialogs_verified_star", dialogsVerifiedIconBg }, - { "dialogs/dialogs_verified_check", dialogsVerifiedIconFg }, - }; premium: icon {{ "dialogs/dialogs_premium", dialogsVerifiedIconBg }}; premiumFg: dialogsVerifiedIconBg; premiumInnerFg: dialogsVerifiedIconFg;