diff --git a/Telegram/SourceFiles/data/data_forum.cpp b/Telegram/SourceFiles/data/data_forum.cpp index ec8bfb59a3..0459fe5962 100644 --- a/Telegram/SourceFiles/data/data_forum.cpp +++ b/Telegram/SourceFiles/data/data_forum.cpp @@ -58,6 +58,17 @@ Forum::Forum(not_null history) if (peer()->canCreateTopics()) { owner().forumIcons().requestDefaultIfUnknown(); } + _topicsList.fullSize().value( + ) | rpl::map([](int size) { + return size > 0; + }) | rpl::distinct_until_changed( + ) | rpl::skip( + 1 + ) | rpl::on_next([=] { + if (IsBotCreatesTopics(_history->peer)) { + _history->updateChatListEntryHeight(); + } + }, _lifetime); } Forum::~Forum() { diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index ede080b89a..55bde8110b 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1700,17 +1700,23 @@ bool PeerData::useSubsectionTabs() const { return false; } -bool PeerData::displaySubsectionTabs() const { - if (!useSubsectionTabs()) { +bool PeerData::displayAsForum() const { + if (!isForum()) { return false; - } else if (const auto bot = asBot() - ; bot && !bot->botInfo->userCreatesTopics) { - const auto forum = bot->botInfo->forum(); + } else if (Data::IsBotCreatesTopics(this)) { + const auto forum = asBot()->botInfo->forum(); return forum && !forum->topicsList()->empty(); } return true; } +bool PeerData::displaySubsectionTabs() const { + if (asBot()) { + return displayAsForum(); + } + return useSubsectionTabs(); +} + bool PeerData::viewForumAsMessages() const { if (const auto channel = asChannel()) { return channel->viewForumAsMessages(); @@ -2251,4 +2257,11 @@ bool IsBotUserCreatesTopics(not_null peer) { return false; } +bool IsBotCreatesTopics(not_null peer) { + if (const auto user = peer->asUser()) { + return user->botInfo && !user->botInfo->userCreatesTopics; + } + return false; +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 58b0a20fd4..622569ab9a 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -299,6 +299,7 @@ public: [[nodiscard]] bool useSubsectionTabs() const; [[nodiscard]] bool displaySubsectionTabs() const; + [[nodiscard]] bool displayAsForum() const; [[nodiscard]] bool viewForumAsMessages() const; void processTopics(const MTPVector &topics); @@ -680,5 +681,6 @@ void SetTopPinnedMessageId( [[nodiscard]] std::optional ColorIndexFromColor(const MTPPeerColor *); [[nodiscard]] bool IsBotUserCreatesTopics(not_null); +[[nodiscard]] bool IsBotCreatesTopics(not_null); } // namespace Data diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 80fdc809be..fb9c760062 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -868,7 +868,7 @@ void InnerWidget::paintEvent(QPaintEvent *e) { const auto &key = row->key(); const auto active = mayBeActive && isRowActive(row, activeEntry); const auto history = key.history(); - const auto forum = history && history->isForum(); + const auto forum = history && history->peer->displayAsForum(); const auto monoforum = history && history->amMonoforumAdmin(); if ((forum || monoforum) && !_topicJumpCache) { _topicJumpCache = std::make_unique(); diff --git a/Telegram/SourceFiles/dialogs/dialogs_row.cpp b/Telegram/SourceFiles/dialogs/dialogs_row.cpp index acd8c8cb1c..3b01b6e83f 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_row.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_row.cpp @@ -303,7 +303,7 @@ const style::DialogRow &Row::ComputeSt( FilterId filterId) { if (const auto history = entry->asHistory()) { const auto hasTags = entry->hasChatsFilterTags(filterId); - const auto wideRow = history->isForum() + const auto wideRow = history->peer->displayAsForum() || history->amMonoforumAdmin(); return wideRow ? (hasTags ? st::taggedForumDialogRow : st::forumDialogRow) diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index ac29683c5b..d04112901a 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -79,7 +79,8 @@ const auto kPsaBadgePrefix = "cloud_lng_badge_psa_"; } else if (const auto user = history->peer->asUser()) { return !user->lastseen().isHidden(); } - return !history->isForum() && !history->amMonoforumAdmin(); + return !history->peer->displayAsForum() + && !history->amMonoforumAdmin(); } void PaintRowTopRight( @@ -1024,7 +1025,7 @@ const style::icon *ChatTypeIcon( st::dialogsChannelIcon, context.active, context.selected); - } else if (peer->isForum()) { + } else if (peer->displayAsForum()) { return &ThreeStateIcon( st::dialogsForumIcon, context.active, @@ -1063,7 +1064,8 @@ void RowPainter::Paint( if (!thread) { return nullptr; } - if ((!peer || (!peer->isForum() && !peer->amMonoforumAdmin())) + if ((!peer + || (!peer->displayAsForum() && !peer->amMonoforumAdmin())) && (!item || !badgesState.unread)) { // Draw item, if there are unread messages. const auto draft = thread->owningHistory()->cloudDraft(