From 12b18829f0d2913ea1731b969e3eec6eafacffc4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 25 Mar 2020 16:04:06 +0400 Subject: [PATCH] Add context menu to filters side bar. --- Telegram/Resources/langs/lang.strings | 4 ++ .../boxes/filters/edit_filter_box.cpp | 33 ++++++++++- .../boxes/filters/edit_filter_box.h | 8 ++- .../window/window_filters_menu.cpp | 55 +++++++++++++++++++ .../SourceFiles/window/window_filters_menu.h | 11 ++++ 5 files changed, 107 insertions(+), 4 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index beac5cdd3..6cd47b5f9 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2282,6 +2282,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_filters_type_no_read" = "Read"; "lng_filters_icon_header" = "Choose icon"; "lng_filters_error_pinned_max" = "Sorry, you can't pin any more chats to the top."; +"lng_filters_context_edit" = "Edit Folder"; +"lng_filters_context_remove" = "Remove"; +"lng_filters_remove_sure" = "This will remove the folder, your chats will not be deleted."; +"lng_filters_remove_yes" = "Remove"; // Wnd specific diff --git a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp index 13c5a1c31..81b1e04cf 100644 --- a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp +++ b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "window/window_session_controller.h" #include "window/window_controller.h" +#include "apiwrap.h" #include "styles/style_settings.h" #include "styles/style_boxes.h" #include "styles/style_layers.h" @@ -639,4 +640,34 @@ void EditFilterBox( creating ? tr::lng_filters_create_button() : tr::lng_settings_save(), save); box->addButton(tr::lng_cancel(), [=] { box->closeBox(); }); -} \ No newline at end of file +} + +void EditExistingFilter( + not_null window, + FilterId id) { + const auto session = &window->session(); + const auto &list = session->data().chatsFilters().list(); + const auto i = ranges::find(list, id, &Data::ChatFilter::id); + if (i == end(list)) { + return; + } + const auto doneCallback = [=](const Data::ChatFilter &result) { + Expects(id == result.id()); + + const auto tl = result.tl(); + session->data().chatsFilters().apply(MTP_updateDialogFilter( + MTP_flags(MTPDupdateDialogFilter::Flag::f_filter), + MTP_int(id), + tl)); + session->api().request(MTPmessages_UpdateDialogFilter( + MTP_flags(MTPmessages_UpdateDialogFilter::Flag::f_filter), + MTP_int(id), + tl + )).send(); + }; + window->window().show(Box( + EditFilterBox, + window, + *i, + crl::guard(session, doneCallback))); +} diff --git a/Telegram/SourceFiles/boxes/filters/edit_filter_box.h b/Telegram/SourceFiles/boxes/filters/edit_filter_box.h index 8cd87f8d2..43b97adb1 100644 --- a/Telegram/SourceFiles/boxes/filters/edit_filter_box.h +++ b/Telegram/SourceFiles/boxes/filters/edit_filter_box.h @@ -7,9 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -namespace Ui { -class GenericBox; -} // namespace Ui +#include "ui/layers/generic_box.h" namespace Window { class SessionController; @@ -24,3 +22,7 @@ void EditFilterBox( not_null window, const Data::ChatFilter &filter, Fn doneCallback); + +void EditExistingFilter( + not_null window, + FilterId id); diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index f6a0fddc6..1ede652fd 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -16,8 +16,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "ui/filter_icons.h" #include "ui/wrap/vertical_layout_reorder.h" +#include "ui/widgets/popup_menu.h" +#include "boxes/confirm_box.h" +#include "boxes/filters/edit_filter_box.h" #include "settings/settings_common.h" #include "api/api_chat_filters.h" +#include "apiwrap.h" #include "styles/style_widgets.h" #include "styles/style_window.h" @@ -203,9 +207,60 @@ base::unique_qptr FiltersMenu::prepareButton( } } }); + if (id > 0) { + raw->events( + ) | rpl::filter([=](not_null e) { + return e->type() == QEvent::ContextMenu; + }) | rpl::start_with_next([=] { + showMenu(QCursor::pos(), id); + }, raw->lifetime()); + } return button; } +void FiltersMenu::showMenu(QPoint position, FilterId id) { + if (_popupMenu) { + _popupMenu = nullptr; + return; + } + const auto i = _filters.find(id); + if (i == end(_filters)) { + return; + } + _popupMenu = base::make_unique_q(i->second.get()); + _popupMenu->addAction( + tr::lng_filters_context_edit(tr::now), + crl::guard(&_outer, [=] { showEditBox(id); })); + _popupMenu->addAction( + tr::lng_filters_context_remove(tr::now), + crl::guard(&_outer, [=] { showRemoveBox(id); })); + _popupMenu->popup(position); +} + +void FiltersMenu::showEditBox(FilterId id) { + EditExistingFilter(_session, id); +} + +void FiltersMenu::showRemoveBox(FilterId id) { + const auto box = std::make_shared>(); + *box = _session->window().show(Box( + tr::lng_filters_remove_sure(tr::now), + tr::lng_filters_remove_yes(tr::now), + [=] { (*box)->closeBox(); remove(id); })); +} + +void FiltersMenu::remove(FilterId id) { + _session->session().data().chatsFilters().apply(MTP_updateDialogFilter( + MTP_flags(MTPDupdateDialogFilter::Flag(0)), + MTP_int(id), + MTPDialogFilter())); + _session->session().api().request(MTPmessages_UpdateDialogFilter( + MTP_flags(MTPmessages_UpdateDialogFilter::Flag(0)), + MTP_int(id), + MTPDialogFilter() + )).send(); +} + void FiltersMenu::applyReorder( not_null widget, int oldPosition, diff --git a/Telegram/SourceFiles/window/window_filters_menu.h b/Telegram/SourceFiles/window/window_filters_menu.h index e5dbef669..34aea5a6b 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.h +++ b/Telegram/SourceFiles/window/window_filters_menu.h @@ -14,8 +14,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Ui { class VerticalLayoutReorder; enum class FilterIcon : uchar; +class PopupMenu; } // namespace Ui +namespace Data { +class ChatFilter; +} // namespace Data + namespace Window { class SessionController; @@ -40,6 +45,10 @@ private: FilterId id, const QString &title, Ui::FilterIcon icon); + void showMenu(QPoint position, FilterId id); + void showEditBox(FilterId id); + void showRemoveBox(FilterId id); + void remove(FilterId id); const not_null _session; const not_null _parent; @@ -57,6 +66,8 @@ private: bool _ignoreRefresh = false; bool _waitingSuggested = false; + base::unique_qptr _popupMenu; + }; } // namespace Window