Added submenu support to Window::PeerMenuCallback.

This commit is contained in:
23rd 2022-03-28 21:10:48 +03:00 committed by John Preston
parent 77659c64e0
commit 4bcd9de2b0
3 changed files with 29 additions and 3 deletions

View File

@ -1773,6 +1773,18 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) {
} 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);
});
Window::FillDialogsEntryMenu(

View File

@ -283,7 +283,7 @@ bool TopBarWidget::createMenu(not_null<Ui::IconButton*> button) {
if (!_activeChat.key || _menu) {
return false;
}
_menu.create(this, st::popupMenuWithIcons);
_menu.create(this, st::popupMenuExpandedSeparator);
_menu->setDestroyedCallback([
weak = Ui::MakeWeak(this),
weakButton = Ui::MakeWeak(button),
@ -307,6 +307,18 @@ void TopBarWidget::showPeerMenu() {
}
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);
});
Window::FillDialogsEntryMenu(_controller, _activeChat, addAction);

View File

@ -41,9 +41,11 @@ extern const char kOptionViewProfileInChatsListContextMenu[];
struct PeerMenuCallback {
public:
struct Args {
const QString &text;
QString text;
Fn<void()> handler;
const style::icon *icon;
Fn<void(not_null<Ui::PopupMenu*>)> fillSubmenu;
bool isSeparator = false;
};
using Callback = Fn<QAction*(Args&&)>;
@ -58,7 +60,7 @@ public:
const QString &text,
Fn<void()> handler,
const style::icon *icon) const {
return callback({ text, std::move(handler), icon });
return callback({ text, std::move(handler), icon, nullptr });
}
private:
Callback callback;