Add context menu to filters side bar.

This commit is contained in:
John Preston 2020-03-25 16:04:06 +04:00
parent ae7529004d
commit 12b18829f0
5 changed files with 107 additions and 4 deletions

View file

@ -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

View file

@ -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"
@ -640,3 +641,33 @@ void EditFilterBox(
save);
box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
}
void EditExistingFilter(
not_null<Window::SessionController*> 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)));
}

View file

@ -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::SessionController*> window,
const Data::ChatFilter &filter,
Fn<void(const Data::ChatFilter &)> doneCallback);
void EditExistingFilter(
not_null<Window::SessionController*> window,
FilterId id);

View file

@ -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<Ui::SideBarButton> FiltersMenu::prepareButton(
}
}
});
if (id > 0) {
raw->events(
) | rpl::filter([=](not_null<QEvent*> 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<Ui::PopupMenu>(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<QPointer<Ui::BoxContent>>();
*box = _session->window().show(Box<ConfirmBox>(
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<Ui::RpWidget*> widget,
int oldPosition,

View file

@ -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<SessionController*> _session;
const not_null<Ui::RpWidget*> _parent;
@ -57,6 +66,8 @@ private:
bool _ignoreRefresh = false;
bool _waitingSuggested = false;
base::unique_qptr<Ui::PopupMenu> _popupMenu;
};
} // namespace Window