diff --git a/Telegram/Resources/icons/menu/add_to_folder.png b/Telegram/Resources/icons/menu/add_to_folder.png new file mode 100644 index 0000000000..bf27766b51 Binary files /dev/null and b/Telegram/Resources/icons/menu/add_to_folder.png differ diff --git a/Telegram/Resources/icons/menu/add_to_folder@2x.png b/Telegram/Resources/icons/menu/add_to_folder@2x.png new file mode 100644 index 0000000000..57e8540b3d Binary files /dev/null and b/Telegram/Resources/icons/menu/add_to_folder@2x.png differ diff --git a/Telegram/Resources/icons/menu/add_to_folder@3x.png b/Telegram/Resources/icons/menu/add_to_folder@3x.png new file mode 100644 index 0000000000..169156cacf Binary files /dev/null and b/Telegram/Resources/icons/menu/add_to_folder@3x.png differ diff --git a/Telegram/SourceFiles/boxes/choose_filter_box.cpp b/Telegram/SourceFiles/boxes/choose_filter_box.cpp index 5f951143e7..1a0ac1a50f 100644 --- a/Telegram/SourceFiles/boxes/choose_filter_box.cpp +++ b/Telegram/SourceFiles/boxes/choose_filter_box.cpp @@ -19,9 +19,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/text/text_utilities.h" // Ui::Text::Bold #include "ui/toast/toast.h" #include "ui/widgets/buttons.h" +#include "ui/widgets/popup_menu.h" #include "window/window_session_controller.h" #include "styles/style_settings.h" #include "styles/style_payments.h" // paymentsSectionButton +#include "styles/style_media_player.h" // mediaPlayerMenuCheck namespace { @@ -203,3 +205,31 @@ void ChooseFilterBox( box->addButton(tr::lng_close(), [=] { box->closeBox(); }); } + +void FillChooseFilterMenu( + not_null menu, + not_null history) { + const auto validator = ChooseFilterValidator(history); + for (const auto &filter : history->owner().chatsFilters().list()) { + const auto id = filter.id(); + const auto contains = filter.contains(history); + const auto action = menu->addAction(filter.title(), [=] { + if (filter.contains(history)) { + if (validator.canRemove(id)) { + validator.remove(id); + } + } else { + if (validator.canAdd()) { + validator.add(id); + } + } + }, contains ? &st::mediaPlayerMenuCheck : nullptr); + action->setEnabled(contains + ? validator.canRemove(id) + : validator.canAdd()); + } + history->owner().chatsFilters().changed( + ) | rpl::start_with_next([=] { + menu->hideMenu(); + }, menu->lifetime()); +} diff --git a/Telegram/SourceFiles/boxes/choose_filter_box.h b/Telegram/SourceFiles/boxes/choose_filter_box.h index 33404bc032..2ebc1bbab1 100644 --- a/Telegram/SourceFiles/boxes/choose_filter_box.h +++ b/Telegram/SourceFiles/boxes/choose_filter_box.h @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Ui { class GenericBox; +class PopupMenu; } // namespace Ui class History; @@ -31,3 +32,7 @@ private: void ChooseFilterBox( not_null box, not_null history); + +void FillChooseFilterMenu( + not_null menu, + not_null history); diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index a1b3648ede..310e698f28 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -111,6 +111,7 @@ menuIconSoundSelect: icon {{ "menu/sound_select", menuIconColor }}; menuIconSoundAdd: icon {{ "menu/sound_add", menuIconColor }}; menuIconFile: icon {{ "menu/file", menuIconColor }}; menuIconPhoto: icon {{ "menu/image", menuIconColor }}; +menuIconAddToFolder: icon {{ "menu/add_to_folder", menuIconColor }}; menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }}; menuIconTTLAnyTextPosition: point(11px, 22px); diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index f253d27d39..3381c0328a 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -420,27 +420,17 @@ void Filler::addInfo() { void Filler::addToggleFolder() { const auto history = _request.key.history(); - if (!history) { + if (!history || history->owner().chatsFilters().list().empty()) { return; } - if (!_request.filterId) { - if (!ChooseFilterValidator(history).canAdd()) { - return; - } - const auto window = _controller; - _addAction(tr::lng_filters_menu_add(tr::now), [=] { - window->show(Box(ChooseFilterBox, history)); - }, nullptr); - } else { - const auto id = _request.filterId; - const auto validator = ChooseFilterValidator(history); - if (!validator.canRemove(id)) { - return; - } - _addAction(tr::lng_filters_menu_remove(tr::now), [=] { - validator.remove(id); - }, nullptr); - } + _addAction(PeerMenuCallback::Args{ + .text = tr::lng_filters_menu_add(tr::now), + .handler = nullptr, + .icon = &st::menuIconAddToFolder, + .fillSubmenu = [=](not_null menu) { + FillChooseFilterMenu(menu, history); + }, + }); } void Filler::addToggleUnreadMark() {