From d7c964afc5fb555e18da06a5ad0740d50441c0fa Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 27 May 2025 18:05:36 +0400 Subject: [PATCH] Show "Messages" badge for monoforum. --- Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/api/api_chat_invite.h | 2 +- Telegram/SourceFiles/boxes/peer_list_box.cpp | 3 ++ .../dialogs/dialogs_inner_widget.cpp | 5 ++ .../SourceFiles/dialogs/ui/dialogs_layout.cpp | 7 ++- Telegram/SourceFiles/history/history.cpp | 3 ++ .../view/history_view_top_bar_widget.cpp | 1 + .../info/profile/info_profile_badge.cpp | 19 ++++--- .../info/profile/info_profile_badge.h | 3 +- .../info/profile/info_profile_values.cpp | 5 ++ .../info/profile/info_profile_values.h | 2 +- Telegram/SourceFiles/ui/unread_badge.cpp | 52 ++++++++++++------- Telegram/SourceFiles/ui/unread_badge.h | 15 ++++-- 13 files changed, 85 insertions(+), 33 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 0ad0b60ee9..39db6ae517 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -169,6 +169,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_status" = "group"; "lng_scam_badge" = "SCAM"; "lng_fake_badge" = "FAKE"; +"lng_direct_badge" = "MESSAGES"; "lng_remember" = "Remember this choice"; diff --git a/Telegram/SourceFiles/api/api_chat_invite.h b/Telegram/SourceFiles/api/api_chat_invite.h index 94eeab5e92..123ccb1f8d 100644 --- a/Telegram/SourceFiles/api/api_chat_invite.h +++ b/Telegram/SourceFiles/api/api_chat_invite.h @@ -14,7 +14,7 @@ class ChannelData; namespace Info::Profile { class Badge; -enum class BadgeType; +enum class BadgeType : uchar; } // namespace Info::Profile namespace Main { diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index 10feb5e527..5ff2323d27 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -810,6 +810,9 @@ int PeerListRow::paintNameIconGetWidth( ? st::dialogsPremiumIcon.over : st::dialogsPremiumIcon.icon), .scam = &(selected ? st::dialogsScamFgOver : st::dialogsScamFg), + .direct = &(selected + ? st::windowSubTextFgOver + : st::windowSubTextFg), .premiumFg = &(selected ? st::dialogsVerifiedIconBgOver : st::dialogsVerifiedIconBg), diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 9892c01598..8775b85569 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -1606,6 +1606,11 @@ void InnerWidget::paintPeerSearchResult( : context.selected ? &st::dialogsScamFgOver : &st::dialogsScamFg), + .direct = (context.active + ? &st::dialogsDraftFgActive + : context.selected + ? &st::windowSubTextFgOver + : &st::windowSubTextFg), .premiumFg = (context.active ? &st::dialogsVerifiedIconBgActive : context.selected diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index f2d58e995e..924b7c0f4d 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -750,6 +750,11 @@ void PaintRow( : context.selected ? &st::dialogsScamFgOver : &st::dialogsScamFg), + .direct = (context.active + ? &st::dialogsDraftFgActive + : context.selected + ? &st::windowSubTextFgOver + : &st::windowSubTextFg), .premiumFg = (context.active ? &st::dialogsVerifiedIconBgActive : context.selected @@ -923,7 +928,7 @@ const style::icon *ChatTypeIcon( st::dialogsChannelIcon, context.active, context.selected); - } else if (peer->isForum() || peer->amMonoforumAdmin()) { + } else if (peer->isForum()) { return &ThreeStateIcon( st::dialogsForumIcon, context.active, diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 3c40fbe973..3f4540c60c 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -2363,6 +2363,9 @@ bool History::chatListMessageKnown() const { } const QString &History::chatListName() const { + if (const auto broadcast = peer->monoforumBroadcast()) { + return broadcast->name(); + } return peer->name(); } 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 d965afcf18..532f384480 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp @@ -604,6 +604,7 @@ void TopBarWidget::paintTopBar(Painter &p) { .verified = &st::dialogsVerifiedIcon, .premium = &st::dialogsPremiumIcon.icon, .scam = &st::attentionButtonFg, + .direct = &st::windowSubTextFg, .premiumFg = &st::dialogsVerifiedIconBg, .customEmojiRepaint = [=] { update(); }, .now = now, diff --git a/Telegram/SourceFiles/info/profile/info_profile_badge.cpp b/Telegram/SourceFiles/info/profile/info_profile_badge.cpp index b87931baea..8cdfa8c12f 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_badge.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_badge.cpp @@ -131,9 +131,14 @@ void Badge::setContent(Content content) { }, _view->lifetime()); } break; case BadgeType::Scam: - case BadgeType::Fake: { - const auto fake = (_content.badge == BadgeType::Fake); - const auto size = Ui::ScamBadgeSize(fake); + case BadgeType::Fake: + case BadgeType::Direct: { + const auto type = (_content.badge == BadgeType::Direct) + ? Ui::TextBadgeType::Direct + : (_content.badge == BadgeType::Fake) + ? Ui::TextBadgeType::Fake + : Ui::TextBadgeType::Scam; + const auto size = Ui::TextBadgeSize(type); const auto skip = st::infoVerifiedCheckPosition.x(); _view->resize( size.width() + 2 * skip, @@ -141,12 +146,14 @@ void Badge::setContent(Content content) { _view->paintRequest( ) | rpl::start_with_next([=, badge = _view.data()]{ Painter p(badge); - Ui::DrawScamBadge( - fake, + Ui::DrawTextBadge( + type, p, badge->rect().marginsRemoved({ skip, skip, skip, skip }), badge->width(), - st::attentionButtonFg); + (type == Ui::TextBadgeType::Direct + ? st::windowSubTextFg + : st::attentionButtonFg)); }, _view->lifetime()); } break; } diff --git a/Telegram/SourceFiles/info/profile/info_profile_badge.h b/Telegram/SourceFiles/info/profile/info_profile_badge.h index 9f8d782684..387eeadbca 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_badge.h +++ b/Telegram/SourceFiles/info/profile/info_profile_badge.h @@ -35,13 +35,14 @@ namespace Info::Profile { class EmojiStatusPanel; -enum class BadgeType { +enum class BadgeType : uchar { None = 0x00, Verified = 0x01, BotVerified = 0x02, Premium = 0x04, Scam = 0x08, Fake = 0x10, + Direct = 0x20, }; inline constexpr bool is_flag_type(BadgeType) { return true; } diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index 725ad58ad7..16e8b231f7 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -93,6 +93,9 @@ void StripExternalLinks(TextWithEntities &text) { } // namespace rpl::producer NameValue(not_null peer) { + if (const auto broadcast = peer->monoforumBroadcast()) { + return NameValue(broadcast); + } return peer->session().changes().peerFlagsValue( peer, UpdateFlag::Name @@ -659,6 +662,8 @@ rpl::producer BadgeValueFromFlags(Peer peer) { ? BadgeType::Scam : (value & Flag::Fake) ? BadgeType::Fake + : peer->isMonoforum() + ? BadgeType::Direct : (value & Flag::Verified) ? BadgeType::Verified : premium diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.h b/Telegram/SourceFiles/info/profile/info_profile_values.h index dab3cf5065..52f0148bd4 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.h +++ b/Telegram/SourceFiles/info/profile/info_profile_values.h @@ -130,7 +130,7 @@ struct LinkWithUrl { [[nodiscard]] rpl::producer CanViewParticipantsValue( not_null megagroup); -enum class BadgeType; +enum class BadgeType : uchar; [[nodiscard]] rpl::producer BadgeValue(not_null peer); [[nodiscard]] rpl::producer EmojiStatusIdValue( not_null peer); diff --git a/Telegram/SourceFiles/ui/unread_badge.cpp b/Telegram/SourceFiles/ui/unread_badge.cpp index d53f617da9..8730b46c58 100644 --- a/Telegram/SourceFiles/ui/unread_badge.cpp +++ b/Telegram/SourceFiles/ui/unread_badge.cpp @@ -71,10 +71,17 @@ void UnreadBadge::paintEvent(QPaintEvent *e) { unreadSt); } -QSize ScamBadgeSize(bool fake) { - const auto phrase = fake - ? tr::lng_fake_badge(tr::now) - : tr::lng_scam_badge(tr::now); +QString TextBadgeText(TextBadgeType type) { + switch (type) { + case TextBadgeType::Fake: return tr::lng_fake_badge(tr::now); + case TextBadgeType::Scam: return tr::lng_scam_badge(tr::now); + case TextBadgeType::Direct: return tr::lng_direct_badge(tr::now); + } + Unexpected("Type in TextBadgeText."); +} + +QSize TextBadgeSize(TextBadgeType type) { + const auto phrase = TextBadgeText(type); const auto phraseWidth = st::dialogsScamFont->width(phrase); const auto width = st::dialogsScamPadding.left() + phraseWidth @@ -85,7 +92,7 @@ QSize ScamBadgeSize(bool fake) { return { width, height }; } -void DrawScamFakeBadge( +void DrawTextBadge( Painter &p, QRect rect, int outerWidth, @@ -107,16 +114,14 @@ void DrawScamFakeBadge( phraseWidth); } -void DrawScamBadge( - bool fake, +void DrawTextBadge( + TextBadgeType type, Painter &p, QRect rect, int outerWidth, const style::color &color) { - const auto phrase = fake - ? tr::lng_fake_badge(tr::now) - : tr::lng_scam_badge(tr::now); - DrawScamFakeBadge( + const auto phrase = TextBadgeText(type); + DrawTextBadge( p, rect, outerWidth, @@ -133,8 +138,9 @@ int PeerBadge::drawGetWidth(Painter &p, Descriptor &&descriptor) { Expects(descriptor.customEmojiRepaint != nullptr); const auto peer = descriptor.peer; - if (descriptor.scam && (peer->isScam() || peer->isFake())) { - return drawScamOrFake(p, descriptor); + if ((descriptor.scam && (peer->isScam() || peer->isFake())) + || descriptor.direct && peer->isMonoforum()) { + return drawTextBadge(p, descriptor); } const auto verifyCheck = descriptor.verified && peer->isVerified(); const auto premiumMark = descriptor.premium @@ -177,10 +183,16 @@ int PeerBadge::drawGetWidth(Painter &p, Descriptor &&descriptor) { return 0; } -int PeerBadge::drawScamOrFake(Painter &p, const Descriptor &descriptor) { - const auto phrase = descriptor.peer->isScam() - ? tr::lng_scam_badge(tr::now) - : tr::lng_fake_badge(tr::now); +int PeerBadge::drawTextBadge(Painter &p, const Descriptor &descriptor) { + const auto type = [&] { + if (descriptor.peer->isScam()) { + return TextBadgeType::Scam; + } else if (descriptor.peer->isFake()) { + return TextBadgeType::Fake; + } + return TextBadgeType::Direct; + }(); + const auto phrase = TextBadgeText(type); const auto phraseWidth = st::dialogsScamFont->width(phrase); const auto width = st::dialogsScamPadding.left() + phraseWidth @@ -197,11 +209,13 @@ int PeerBadge::drawScamOrFake(Painter &p, const Descriptor &descriptor) { rectForName.y() + (rectForName.height() - height) / 2, width, height); - DrawScamFakeBadge( + DrawTextBadge( p, rect, descriptor.outerWidth, - *descriptor.scam, + *((type == TextBadgeType::Direct) + ? descriptor.direct + : descriptor.scam), phrase, phraseWidth); return st::dialogsScamSkip + width; diff --git a/Telegram/SourceFiles/ui/unread_badge.h b/Telegram/SourceFiles/ui/unread_badge.h index 5fd7990c4c..974df00ea8 100644 --- a/Telegram/SourceFiles/ui/unread_badge.h +++ b/Telegram/SourceFiles/ui/unread_badge.h @@ -58,6 +58,7 @@ public: const style::icon *verified = nullptr; const style::icon *premium = nullptr; const style::color *scam = nullptr; + const style::color *direct = nullptr; const style::color *premiumFg = nullptr; Fn customEmojiRepaint; crl::time now = 0; @@ -84,7 +85,7 @@ private: struct EmojiStatus; struct BotVerifiedData; - int drawScamOrFake(Painter &p, const Descriptor &descriptor); + int drawTextBadge(Painter &p, const Descriptor &descriptor); int drawVerifyCheck(Painter &p, const Descriptor &descriptor); int drawPremiumEmojiStatus(Painter &p, const Descriptor &descriptor); int drawPremiumStar(Painter &p, const Descriptor &descriptor); @@ -94,9 +95,15 @@ private: }; -QSize ScamBadgeSize(bool fake); -void DrawScamBadge( - bool fake, +enum class TextBadgeType : uchar { + Scam, + Fake, + Direct, +}; + +QSize TextBadgeSize(TextBadgeType type); +void DrawTextBadge( + TextBadgeType, Painter &p, QRect rect, int outerWidth,