diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index 1ede652fd..216583320 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "data/data_session.h" #include "data/data_chat_filters.h" +#include "data/data_folder.h" #include "lang/lang_keys.h" #include "ui/filter_icons.h" #include "ui/wrap/vertical_layout_reorder.h" @@ -26,6 +27,37 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_window.h" namespace Window { +namespace { + +[[nodiscard]] rpl::producer<Dialogs::UnreadState> MainListUnreadState( + not_null<Dialogs::MainList*> list) { + return rpl::single(rpl::empty_value()) | rpl::then( + list->unreadStateChanges( + ) | rpl::map([] { return rpl::empty_value(); }) + ) | rpl::map([=] { + return list->unreadState(); + }); +} + +[[nodiscard]] rpl::producer<Dialogs::UnreadState> UnreadStateValue( + not_null<Main::Session*> session, + FilterId filterId) { + if (filterId > 0) { + const auto filters = &session->data().chatsFilters(); + return MainListUnreadState(filters->chatsList(filterId)); + } + return MainListUnreadState( + session->data().chatsList() + ) | rpl::map([=](const Dialogs::UnreadState &state) { + const auto folderId = Data::Folder::kId; + if (const auto folder = session->data().folderLoaded(folderId)) { + return state - folder->chatsList()->unreadState(); + } + return state; + }); +} + +} // namespace FiltersMenu::FiltersMenu( not_null<Ui::RpWidget*> parent, @@ -169,14 +201,11 @@ base::unique_qptr<Ui::SideBarButton> FiltersMenu::prepareButton( const auto raw = button.get(); const auto &icons = Ui::LookupFilterIcon(icon); raw->setIconOverride(icons.normal, icons.active); - if (id > 0) { - const auto filters = &_session->session().data().chatsFilters(); - const auto list = filters->chatsList(id); - rpl::single(rpl::empty_value()) | rpl::then( - list->unreadStateChanges( - ) | rpl::map([] { return rpl::empty_value(); }) - ) | rpl::start_with_next([=] { - const auto &state = list->unreadState(); + if (id >= 0) { + UnreadStateValue( + &_session->session(), + id + ) | rpl::start_with_next([=](const Dialogs::UnreadState &state) { const auto count = (state.chats + state.marks); const auto muted = (state.chatsMuted + state.marksMuted); const auto string = !count