Moved out peer menu callback and its creation to separated files.

This commit is contained in:
23rd 2022-03-31 13:37:17 +03:00 committed by John Preston
parent 36e334ecf2
commit 67d8a7e106
10 changed files with 140 additions and 82 deletions

View File

@ -37,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "mainwindow.h"
#include "mainwidget.h"
#include "menu/add_action_callback_factory.h"
#include "storage/storage_account.h"
#include "apiwrap.h"
#include "main/main_session.h"
@ -1771,22 +1772,7 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) {
fillArchiveSearchMenu(_menu.get());
}
} else {
const auto addAction = Window::PeerMenuCallback([&](
Window::PeerMenuCallback::Args &&a) {
if (a.fillSubmenu) {
const auto action = _menu->addAction(
a.text,
std::move(a.handler),
a.icon);
// Dummy menu.
action->setMenu(Ui::CreateChild<QMenu>(_menu->menu().get()));
a.fillSubmenu(_menu->ensureSubmenu(action));
return action;
} else if (a.isSeparator) {
return _menu->addSeparator();
}
return _menu->addAction(a.text, std::move(a.handler), a.icon);
});
const auto addAction = Menu::CreateAddActionCallback(_menu);
Window::FillDialogsEntryMenu(
_controller,
Dialogs::EntryState{

View File

@ -19,6 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "mainwidget.h"
#include "mainwindow.h"
#include "main/main_session.h"
#include "menu/add_action_callback_factory.h"
#include "mtproto/mtproto_config.h"
#include "lang/lang_keys.h"
#include "core/shortcuts.h"
@ -283,14 +284,14 @@ bool TopBarWidget::createMenu(not_null<Ui::IconButton*> button) {
if (!_activeChat.key || _menu) {
return false;
}
_menu.create(this, st::popupMenuExpandedSeparator);
_menu = base::make_unique_q<Ui::PopupMenu>(
this,
st::popupMenuExpandedSeparator);
_menu->setDestroyedCallback([
weak = Ui::MakeWeak(this),
weakButton = Ui::MakeWeak(button),
menu = _menu.data()] {
menu->deleteLater();
menu = _menu.get()] {
if (weak && weak->_menu == menu) {
weak->_menu = nullptr;
if (weakButton) {
weakButton->setForceRippled(false);
}
@ -305,25 +306,10 @@ void TopBarWidget::showPeerMenu() {
if (!created) {
return;
}
const auto addAction = Window::PeerMenuCallback([&](
Window::PeerMenuCallback::Args a) {
if (a.fillSubmenu) {
const auto action = _menu->addAction(
a.text,
std::move(a.handler),
a.icon);
// Dummy menu.
action->setMenu(Ui::CreateChild<QMenu>(_menu->menu().get()));
a.fillSubmenu(_menu->ensureSubmenu(action));
return action;
} else if (a.isSeparator) {
return _menu->addSeparator();
}
return _menu->addAction(a.text, std::move(a.handler), a.icon);
});
const auto addAction = Menu::CreateAddActionCallback(_menu);
Window::FillDialogsEntryMenu(_controller, _activeChat, addAction);
if (_menu->empty()) {
_menu.destroy();
_menu = nullptr;
} else {
_menu->setForcedOrigin(Ui::PanelAnimation::Origin::TopRight);
_menu->popup(mapToGlobal(QPoint(

View File

@ -179,7 +179,7 @@ private:
object_ptr<Ui::IconButton> _search;
object_ptr<Ui::IconButton> _infoToggle;
object_ptr<Ui::IconButton> _menuToggle;
object_ptr<Ui::PopupMenu> _menu = { nullptr };
base::unique_qptr<Ui::PopupMenu> _menu;
object_ptr<TWidget> _membersShowArea = { nullptr };
rpl::event_stream<bool> _membersShowAreaActive;

View File

@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/peer_list_box.h"
#include "ui/boxes/confirm_box.h"
#include "main/main_session.h"
#include "menu/add_action_callback_factory.h"
#include "mtproto/mtproto_config.h"
#include "data/data_download_manager.h"
#include "data/data_session.h"
@ -505,23 +506,7 @@ void WrapWidget::showTopBarMenu() {
});
_topBarMenuToggle->setForceRippled(true);
const auto addAction = Window::PeerMenuCallback([=](
Window::PeerMenuCallback::Args a) {
if (a.isSeparator) {
return _topBarMenu->addSeparator();
} else if (a.fillSubmenu) {
const auto action = _topBarMenu->addAction(
a.text,
std::move(a.handler),
a.icon);
// Dummy menu.
action->setMenu(
Ui::CreateChild<QMenu>(_topBarMenu->menu().get()));
a.fillSubmenu(_topBarMenu->ensureSubmenu(action));
return action;
}
return _topBarMenu->addAction(a.text, std::move(a.handler), a.icon);
});
const auto addAction = Menu::CreateAddActionCallback(_topBarMenu);
if (key().isDownloads()) {
addAction(
tr::lng_context_delete_all_files(tr::now),

View File

@ -0,0 +1,27 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "menu/add_action_callback.h"
namespace Menu {
MenuCallback::MenuCallback(MenuCallback::Callback callback)
: _callback(std::move(callback)) {
}
QAction *MenuCallback::operator()(Args &&args) const {
return _callback(std::move(args));
}
QAction *MenuCallback::operator()(
const QString &text,
Fn<void()> handler,
const style::icon *icon) const {
return _callback({ text, std::move(handler), icon, nullptr });
}
} // namespace Menu

View File

@ -0,0 +1,38 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
namespace Ui {
class PopupMenu;
} // namespace Ui
namespace Menu {
struct MenuCallback final {
public:
struct Args {
QString text;
Fn<void()> handler;
const style::icon *icon;
Fn<void(not_null<Ui::PopupMenu*>)> fillSubmenu;
bool isSeparator = false;
};
using Callback = Fn<QAction*(Args&&)>;
explicit MenuCallback(Callback callback);
QAction *operator()(Args &&args) const;
QAction *operator()(
const QString &text,
Fn<void()> handler,
const style::icon *icon) const;
private:
Callback _callback;
};
} // namespace Menu

View File

@ -0,0 +1,34 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "menu/add_action_callback_factory.h"
#include "menu/add_action_callback.h"
#include "ui/widgets/popup_menu.h"
namespace Menu {
MenuCallback CreateAddActionCallback(
const base::unique_qptr<Ui::PopupMenu> &menu) {
return MenuCallback([&](MenuCallback::Args a) {
if (a.fillSubmenu) {
const auto action = menu->addAction(
a.text,
std::move(a.handler),
a.icon);
// Dummy menu.
action->setMenu(Ui::CreateChild<QMenu>(menu->menu().get()));
a.fillSubmenu(menu->ensureSubmenu(action));
return action;
} else if (a.isSeparator) {
return menu->addSeparator();
}
return menu->addAction(a.text, std::move(a.handler), a.icon);
});
}
} // namespace Menu

View File

@ -0,0 +1,23 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "base/unique_qptr.h"
namespace Ui {
class PopupMenu;
} // namespace Ui
namespace Menu {
struct MenuCallback;
[[nodiscard]] MenuCallback CreateAddActionCallback(
const base::unique_qptr<Ui::PopupMenu> &menu);
} // namespace Menu

View File

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "api/api_common.h"
#include "menu/menu_send.h"
#include "data/data_poll.h"
#include "menu/add_action_callback.h"
class History;
@ -38,33 +39,7 @@ class SessionNavigation;
extern const char kOptionViewProfileInChatsListContextMenu[];
struct PeerMenuCallback {
public:
struct Args {
QString text;
Fn<void()> handler;
const style::icon *icon;
Fn<void(not_null<Ui::PopupMenu*>)> fillSubmenu;
bool isSeparator = false;
};
using Callback = Fn<QAction*(Args&&)>;
explicit PeerMenuCallback(Callback callback)
: callback(std::move(callback)) {
}
QAction *operator()(Args &&args) const {
return callback(std::move(args));
}
QAction *operator()(
const QString &text,
Fn<void()> handler,
const style::icon *icon) const {
return callback({ text, std::move(handler), icon, nullptr });
}
private:
Callback callback;
};
using PeerMenuCallback = Menu::MenuCallback;
void FillDialogsEntryMenu(
not_null<SessionController*> controller,

View File

@ -102,6 +102,10 @@ PRIVATE
media/player/media_player_dropdown.cpp
media/player/media_player_dropdown.h
menu/add_action_callback.cpp
menu/add_action_callback.h
menu/add_action_callback_factory.cpp
menu/add_action_callback_factory.h
menu/menu_check_item.cpp
menu/menu_check_item.h
menu/menu_ttl.cpp