diff --git a/Telegram/SourceFiles/data/data_chat_filters.cpp b/Telegram/SourceFiles/data/data_chat_filters.cpp index 4a0d0c2331..a2c5f48d89 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.cpp +++ b/Telegram/SourceFiles/data/data_chat_filters.cpp @@ -461,6 +461,10 @@ rpl::producer ChatFilters::tagsEnabledValue() const { return _tagsEnabled.value(); } +rpl::producer ChatFilters::tagsEnabledChanges() const { + return _tagsEnabled.changes(); +} + void ChatFilters::requestToggleTags(bool value, Fn fail) { if (_toggleTagsRequestId) { return; diff --git a/Telegram/SourceFiles/data/data_chat_filters.h b/Telegram/SourceFiles/data/data_chat_filters.h index ef4c8deff7..cfba1f9a45 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.h +++ b/Telegram/SourceFiles/data/data_chat_filters.h @@ -213,6 +213,7 @@ public: [[nodiscard]] bool tagsEnabled() const; [[nodiscard]] rpl::producer tagsEnabledValue() const; + [[nodiscard]] rpl::producer tagsEnabledChanges() const; void requestToggleTags(bool value, Fn fail); private: diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 80d81c74bb..44a805e764 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1162,6 +1162,17 @@ not_null PeerData::migrateToOrMe() const { return this; } +not_null PeerData::userpicPaintingPeer() { + if (const auto broadcast = monoforumBroadcast()) { + return broadcast; + } + return this; +} + +not_null PeerData::userpicPaintingPeer() const { + return const_cast(this)->userpicPaintingPeer(); +} + ChannelData *PeerData::monoforumBroadcast() const { const auto monoforum = asMonoforum(); return monoforum ? monoforum->monoforumLink() : nullptr; diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index e185fc58ea..397965e476 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -305,6 +305,8 @@ public: [[nodiscard]] ChannelData *migrateTo() const; [[nodiscard]] not_null migrateToOrMe(); [[nodiscard]] not_null migrateToOrMe() const; + [[nodiscard]] not_null userpicPaintingPeer(); + [[nodiscard]] not_null userpicPaintingPeer() const; // isMonoforum() ? monoforumLink() : nullptr [[nodiscard]] ChannelData *monoforumBroadcast() const; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index deab114692..2905899da1 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -366,7 +366,9 @@ InnerWidget::InnerWidget( rpl::merge( session().settings().archiveCollapsedChanges() | rpl::map_to(false), - session().data().chatsFilters().changed() | rpl::map_to(true) + session().data().chatsFilters().changed() | rpl::map_to(true), + session().data().chatsFilters().tagsEnabledChanges( + ) | rpl::map_to(true) ) | rpl::start_with_next([=](bool refreshHeight) { if (refreshHeight) { _chatsFilterTags.clear(); @@ -379,11 +381,8 @@ InnerWidget::InnerWidget( }, lifetime()); session().data().chatsFilters().tagsEnabledValue( - ) | rpl::distinct_until_changed() | rpl::start_with_next([=](bool tags) { + ) | rpl::start_with_next([=](bool tags) { _handleChatListEntryTagRefreshesLifetime.destroy(); - if (_shownList->updateHeights(_narrowRatio)) { - refresh(); - } if (!tags) { return; } @@ -1499,8 +1498,16 @@ bool InnerWidget::isRowActive( not_null row, const RowDescriptor &entry) const { const auto key = row->key(); - return (entry.key == key) - || (entry.key.sublist() && key.peer() && key.peer()->isSelf()); + if (entry.key == key) { + return true; + } else if (const auto sublist = entry.key.sublist()) { + if (!sublist->parentChat()) { + // In case we're viewing a Saved Messages sublist, + // we want to highlight the Saved Messages row as active. + return key.history() && key.peer()->isSelf(); + } + } + return false; } bool InnerWidget::isSearchResultActive( diff --git a/Telegram/SourceFiles/dialogs/dialogs_row.cpp b/Telegram/SourceFiles/dialogs/dialogs_row.cpp index bac34785a1..1082a20999 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_row.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_row.cpp @@ -320,7 +320,9 @@ Row::~Row() { void Row::recountHeight(float64 narrowRatio, FilterId filterId) { if (const auto history = _id.history()) { const auto hasTags = _id.entry()->hasChatsFilterTags(filterId); - _height = (history->isForum() || history->amMonoforumAdmin()) + const auto wideRow = history->isForum() + || history->amMonoforumAdmin(); + _height = wideRow ? anim::interpolate( hasTags ? st::taggedForumDialogRow.height diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index b311225bf2..ac7bff41db 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -942,8 +942,7 @@ void Widget::chosenRow(const ChosenRow &row) { return; } else if (history && history->peer->amMonoforumAdmin() - && !row.message.fullId - && !controller()->adaptive().isOneColumn()) { + && !row.message.fullId) { const auto monoforum = history->peer->monoforum(); if (controller()->shownMonoforum().current() == monoforum) { controller()->closeMonoforum(); @@ -954,10 +953,12 @@ void Widget::chosenRow(const ChosenRow &row) { controller()->showMonoforum( monoforum, Window::SectionShow().withChildColumn()); - controller()->showThread( - history, - ShowAtUnreadMsgId, - Window::SectionShow::Way::ClearStack); + if (!controller()->adaptive().isOneColumn()) { + controller()->showThread( + history, + ShowAtUnreadMsgId, + Window::SectionShow::Way::ClearStack); + } } return; } else if (history) { 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 b93e55033e..7cbf86fcb3 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp @@ -929,10 +929,16 @@ void TopBarWidget::refreshInfoButton() { && !rootChatsListBar())) { _info.destroy(); } else if (const auto peer = _activeChat.key.peer()) { + const auto sublist = _activeChat.key.sublist(); + const auto infoPeer = sublist ? sublist->sublistPeer().get() : peer; auto info = object_ptr( this, - peer, - st::topBarInfoButton); + _controller, + infoPeer->userpicPaintingPeer(), + Ui::UserpicButton::Role::Custom, + Ui::UserpicButton::Source::PeerPhoto, + st::topBarInfoButton, + infoPeer->monoforumBroadcast() != nullptr); info->showSavedMessagesOnSelf(true); _info.destroy(); _info = std::move(info); diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp index e8a1226cfe..2393e6c370 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp @@ -628,9 +628,7 @@ Cover::Cover( : object_ptr( this, controller, - (_peer->monoforumBroadcast() - ? _peer->monoforumBroadcast() - : _peer), + _peer->userpicPaintingPeer(), Ui::UserpicButton::Role::OpenPhoto, Ui::UserpicButton::Source::PeerPhoto, _st.photo, diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 73e6e0110f..a505ce3e8c 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1906,6 +1906,7 @@ void SessionController::showForum( } }, _shownForumLifetime); content()->showForum(forum, params); + closeMonoforum(); } void SessionController::closeForum() { @@ -1980,6 +1981,7 @@ void SessionController::showMonoforum( closeMonoforum(); }, _shownMonoforumLifetime); content()->showMonoforum(monoforum, params); + closeForum(); } void SessionController::closeMonoforum() {