From 5d96eab7b481e33720976998521b8c33f86a86a3 Mon Sep 17 00:00:00 2001 From: AlexeyZavar Date: Wed, 29 Jan 2025 02:49:21 +0300 Subject: [PATCH] fix: badges --- .../ayu/utils/telegram_helpers.cpp | 9 ++++ .../SourceFiles/ayu/utils/telegram_helpers.h | 3 ++ .../info/profile/info_profile_cover.cpp | 48 +++++++------------ .../SourceFiles/settings/settings_main.cpp | 30 +++++++++++- 4 files changed, 58 insertions(+), 32 deletions(-) diff --git a/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp b/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp index 72da05600..4ce30d707 100644 --- a/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp +++ b/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp @@ -85,6 +85,15 @@ bool isSupporterPeer(ID peerId) { return RCManager::getInstance().supporters().contains(peerId); } +rpl::producer ExteraBadgeTypeFromPeer(not_null peer) { + if (isExteraPeer(getBareID(peer))) { + return rpl::single(Info::Profile::Badge::Content{Info::Profile::BadgeType::Extera }); + } else if (isSupporterPeer(getBareID(peer))) { + return rpl::single(Info::Profile::Badge::Content{Info::Profile::BadgeType::ExteraSupporter }); + } + return rpl::single(Info::Profile::Badge::Content{Info::Profile::BadgeType::None }); +} + bool isMessageHidden(const not_null item) { if (AyuState::isHidden(item)) { return true; diff --git a/Telegram/SourceFiles/ayu/utils/telegram_helpers.h b/Telegram/SourceFiles/ayu/utils/telegram_helpers.h index 3b3b3404a..739aa83e5 100644 --- a/Telegram/SourceFiles/ayu/utils/telegram_helpers.h +++ b/Telegram/SourceFiles/ayu/utils/telegram_helpers.h @@ -10,6 +10,7 @@ #include "core/application.h" #include "dialogs/dialogs_main_list.h" +#include "info/profile/info_profile_badge.h" #include "main/main_domain.h" using Callback = Fn; @@ -23,6 +24,8 @@ ID getBareID(not_null peer); bool isExteraPeer(ID peerId); bool isSupporterPeer(ID peerId); +rpl::producer ExteraBadgeTypeFromPeer(not_null peer); + bool isMessageHidden(not_null item); void MarkAsReadChatList(not_null list); diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp index 494f55fce..f25d90e5d 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp @@ -627,19 +627,19 @@ Cover::Cover( return controller->isGifPausedAtLeastFor( Window::GifPauseReason::Layer); })) -, _parentForTooltip(std::move(parentForTooltip)) -, _badgeTooltipHide([=] { hideBadgeTooltip(); }) , _exteraBadge( std::make_unique( this, st::infoPeerBadge, &peer->session(), - VerifiedContentForPeer(peer), + ExteraBadgeTypeFromPeer(peer), _emojiStatusPanel.get(), [=] { return controller->isGifPausedAtLeastFor( Window::GifPauseReason::Layer); })) +, _parentForTooltip(std::move(parentForTooltip)) +, _badgeTooltipHide([=] { hideBadgeTooltip(); }) , _userpic(topic ? nullptr : object_ptr( @@ -681,7 +681,7 @@ Cover::Cover( ::Settings::ShowEmojiStatusPremium(_controller, _peer); } }); - if (_peer->isUser()) { + if (_peer->isUser() && (isExteraPeer(getBareID(_peer)) || isSupporterPeer(getBareID(_peer)))) { _exteraBadge->setPremiumClickCallback([=] { TextWithEntities text; @@ -718,14 +718,6 @@ Cover::Cover( refreshNameGeometry(width()); }, _name->lifetime()); - if (isExteraPeer(getBareID(_peer))) { - _exteraBadge->setContent(Info::Profile::Badge::Content{BadgeType::Extera}); - } else if (isSupporterPeer(getBareID(_peer))) { - _exteraBadge->setContent(Info::Profile::Badge::Content{BadgeType::ExteraSupporter}); - } else { - _exteraBadge->setContent(Info::Profile::Badge::Content{BadgeType::None}); - } - initViewers(std::move(title)); setupChildGeometry(); setupUniqueBadgeTooltip(); @@ -1064,6 +1056,7 @@ void Cover::refreshNameGeometry(int newWidth) { auto nameWidth = newWidth - _st.nameLeft - _st.rightSkip; const auto verifiedWidget = _verified->widget(); const auto badgeWidget = _badge->widget(); + const auto exteraWidget = _exteraBadge->widget(); if (verifiedWidget) { nameWidth -= verifiedWidget->width(); } @@ -1073,16 +1066,10 @@ void Cover::refreshNameGeometry(int newWidth) { if (verifiedWidget || badgeWidget) { nameWidth -= st::infoVerifiedCheckPosition.x(); } - /* - if (const auto widget = _exteraBadge->widget()) { - nameWidth -= st::infoVerifiedCheckPosition.x() - + widget->width() - + (_badge->widget() - ? (_badge->widget()->width() + - st::infoVerifiedCheckPosition.x()) - : 0); + if (exteraWidget) { + nameWidth -= exteraWidget->width(); + nameWidth -= st::infoVerifiedCheckPosition.x(); } - */ auto nameLeft = _st.nameLeft; const auto badgeTop = _st.nameTop; const auto badgeBottom = _st.nameTop + _name->height(); @@ -1104,15 +1091,16 @@ void Cover::refreshNameGeometry(int newWidth) { badgeTop, badgeBottom); - /* - const auto devBadgeLeft = badgeLeft - + (_badge->widget() - ? (_badge->widget()->width() + st::infoVerifiedCheckPosition.x()) - : 0); - const auto devBadgeTop = _st.nameTop; - const auto devBadgeBottom = _st.nameTop + _name->height(); - _exteraBadge->move(devBadgeLeft, devBadgeTop, devBadgeBottom); - */ + const auto exteraBadgeLeft = badgeLeft + + (badgeWidget + ? (badgeWidget->width() + st::infoVerifiedCheckPosition.x()) + : 0) + + (verifiedWidget + ? (verifiedWidget->width() + st::infoVerifiedCheckPosition.x()) + : 0); + const auto exteraBadgeTop = _st.nameTop; + const auto exteraBadgeBottom = _st.nameTop + _name->height(); + _exteraBadge->move(exteraBadgeLeft, exteraBadgeTop, exteraBadgeBottom); } void Cover::refreshStatusGeometry(int newWidth) { diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index 4ead41c04..266d6a678 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -78,7 +78,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL // AyuGram includes #include "ayu/ui/settings/settings_ayu.h" #include "ayu/ui/utils/ayu_profile_values.h" - +#include "ayu/utils/telegram_helpers.h" namespace Settings { namespace { @@ -103,6 +103,7 @@ private: const not_null _user; Info::Profile::EmojiStatusPanel _emojiStatusPanel; Info::Profile::Badge _badge; + Info::Profile::Badge _exteraBadge; object_ptr _userpic; object_ptr _name = { nullptr }; @@ -134,6 +135,18 @@ Cover::Cover( }, 0, // customStatusLoopsLimit Info::Profile::BadgeType::Premium) +, _exteraBadge( + this, + st::infoPeerBadge, + &user->session(), + ExteraBadgeTypeFromPeer(user), + &_emojiStatusPanel, + [=] { + return controller->isGifPausedAtLeastFor( + Window::GifPauseReason::Layer); + }, + 0, // customStatusLoopsLimit + Info::Profile::BadgeType::Extera | Info::Profile::BadgeType::ExteraSupporter) , _userpic( this, controller, @@ -186,7 +199,10 @@ Cover::Cover( _badge.widget(), _badge.sizeTag()); }); - _badge.updated() | rpl::start_with_next([=] { + rpl::combine( + _badge.updated(), + _exteraBadge.updated() + ) | rpl::start_with_next([=] { refreshNameGeometry(width()); }, _name->lifetime()); } @@ -252,12 +268,22 @@ void Cover::refreshNameGeometry(int newWidth) { if (const auto width = _badge.widget() ? _badge.widget()->width() : 0) { nameWidth -= st::infoVerifiedCheckPosition.x() + width; } + if (const auto width = _exteraBadge.widget() ? _exteraBadge.widget()->width() : 0) { + nameWidth -= st::infoVerifiedCheckPosition.x() + width; + } _name->resizeToNaturalWidth(nameWidth); _name->moveToLeft(nameLeft, nameTop, newWidth); const auto badgeLeft = nameLeft + _name->width(); const auto badgeTop = nameTop; const auto badgeBottom = nameTop + _name->height(); _badge.move(badgeLeft, badgeTop, badgeBottom); + const auto exteraBadgeLeft = badgeLeft + + (_badge.widget() + ? (_badge.widget()->width() + st::infoVerifiedCheckPosition.x()) + : 0); + const auto exteraBadgeTop = nameTop; + const auto exteraBadgeBottom = nameTop + _name->height(); + _exteraBadge.move(exteraBadgeLeft, exteraBadgeTop, exteraBadgeBottom); } void Cover::refreshIdGeometry(int newWidth) {