From e56bbf557d407a4d4643d53f8b3b4689a5eecfe2 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 11 Nov 2024 10:06:34 +0300 Subject: [PATCH] Added ability to open filters list in context menu from share boxes. --- .../ui/widgets/chat_filters_tabs_strip.cpp | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp index 07e6ea40d..56be5ee5d 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp @@ -29,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_peer_menu.h" #include "window/window_session_controller.h" #include "styles/style_dialogs.h" // dialogsSearchTabs +#include "styles/style_media_player.h" // mediaPlayerMenuCheck #include "styles/style_menu_icons.h" #include @@ -125,6 +126,47 @@ void ShowMenu( state->menu->popup(QCursor::pos()); } +void ShowFiltersListMenu( + not_null parent, + not_null session, + not_null state, + int active, + Fn changeActive) { + const auto &list = session->data().chatsFilters().list(); + + state->menu = base::make_unique_q( + parent, + st::popupMenuWithIcons); + + const auto reorderAll = session->user()->isPremium(); + const auto maxLimit = (reorderAll ? 1 : 0) + + Data::PremiumLimits(session).dialogFiltersCurrent(); + const auto premiumFrom = (reorderAll ? 0 : 1) + maxLimit; + + for (auto i = 0; i < list.size(); ++i) { + const auto &filter = list[i]; + auto text = filter.title().isEmpty() + ? tr::lng_filters_all(tr::now) + : filter.title(); + + const auto action = state->menu->addAction(std::move(text), [=] { + if (i != active) { + changeActive(i); + } + }, (i == active) ? &st::mediaPlayerMenuCheck : nullptr); + action->setEnabled(i < premiumFrom); + } + session->data().chatsFilters().changed() | rpl::start_with_next([=] { + state->menu->hideMenu(); + }, state->menu->lifetime()); + + if (state->menu->empty()) { + state->menu = nullptr; + return; + } + state->menu->popup(QCursor::pos()); +} + } // namespace not_null AddChatFiltersTabsStrip( @@ -342,7 +384,16 @@ not_null AddChatFiltersTabsStrip( applyFilter(filter); }, wrap->lifetime()); slider->contextMenuRequested() | rpl::start_with_next([=](int index) { - ShowMenu(wrap, controller, state, index); + if (trackActiveFilterAndUnreadAndReorder) { + ShowMenu(wrap, controller, state, index); + } else { + ShowFiltersListMenu( + wrap, + session, + state, + slider->activeSection(), + [=](int i) { slider->setActiveSection(i); }); + } }, slider->lifetime()); wrap->toggle((list.size() > 1), anim::type::instant);