From 0c5135f6717f7566daa6c62fc8421f83dacf6e20 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 13 Jan 2021 18:17:27 +0300 Subject: [PATCH] Added ability to fill menu with custom widgets. --- ui/widgets/dropdown_menu.cpp | 5 +++++ ui/widgets/dropdown_menu.h | 1 + ui/widgets/menu/menu.cpp | 2 ++ ui/widgets/menu/menu.h | 4 ++-- ui/widgets/popup_menu.cpp | 5 +++++ ui/widgets/popup_menu.h | 1 + 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ui/widgets/dropdown_menu.cpp b/ui/widgets/dropdown_menu.cpp index d1dd929..105a510 100644 --- a/ui/widgets/dropdown_menu.cpp +++ b/ui/widgets/dropdown_menu.cpp @@ -53,6 +53,11 @@ void DropdownMenu::init() { hide(); } +not_null DropdownMenu::addAction( + base::unique_qptr widget) { + return _menu->addAction(std::move(widget)); +} + not_null DropdownMenu::addAction(const QString &text, Fn callback, const style::icon *icon, const style::icon *iconOver) { return _menu->addAction(text, std::move(callback), icon, iconOver); } diff --git a/ui/widgets/dropdown_menu.h b/ui/widgets/dropdown_menu.h index 8b34f9c..0f5a1a9 100644 --- a/ui/widgets/dropdown_menu.h +++ b/ui/widgets/dropdown_menu.h @@ -18,6 +18,7 @@ class DropdownMenu : public InnerDropdown { public: DropdownMenu(QWidget *parent, const style::DropdownMenu &st = st::defaultDropdownMenu); + not_null addAction(base::unique_qptr widget); not_null addAction(const QString &text, Fn callback, const style::icon *icon = nullptr, const style::icon *iconOver = nullptr); not_null addSeparator(); void clearActions(); diff --git a/ui/widgets/menu/menu.cpp b/ui/widgets/menu/menu.cpp index 5922274..bebd046 100644 --- a/ui/widgets/menu/menu.cpp +++ b/ui/widgets/menu/menu.cpp @@ -97,6 +97,8 @@ not_null Menu::addAction(base::unique_qptr widget) { const auto action = widget->action(); _actions.emplace_back(action); + widget->setParent(this); + const auto top = _actionWidgets.empty() ? 0 : _actionWidgets.back()->y() + _actionWidgets.back()->height(); diff --git a/ui/widgets/menu/menu.h b/ui/widgets/menu/menu.h index 77161da..27adde3 100644 --- a/ui/widgets/menu/menu.h +++ b/ui/widgets/menu/menu.h @@ -16,7 +16,7 @@ namespace Ui::Menu { class ItemBase; -class ToggleView; +//class ToggleView; class RippleAnimation; class Menu : public RpWidget { @@ -25,6 +25,7 @@ public: Menu(QWidget *parent, QMenu *menu, const style::Menu &st = st::defaultMenu); ~Menu(); + not_null addAction(base::unique_qptr widget); not_null addAction( const QString &text, Fn callback, @@ -90,7 +91,6 @@ private: not_null action, const style::icon *icon = nullptr, const style::icon *iconOver = nullptr); - not_null addAction(base::unique_qptr widget); void setSelected(int selected); void clearMouseSelection(); diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index cb8a6ba..c16c079 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -91,6 +91,11 @@ void PopupMenu::handleMenuResize() { _inner = rect().marginsRemoved(_padding); } +not_null PopupMenu::addAction( + base::unique_qptr widget) { + return _menu->addAction(std::move(widget)); +} + not_null PopupMenu::addAction(const QString &text, Fn callback, const style::icon *icon, const style::icon *iconOver) { return _menu->addAction(text, std::move(callback), icon, iconOver); } diff --git a/ui/widgets/popup_menu.h b/ui/widgets/popup_menu.h index 8f3c193..9e05866 100644 --- a/ui/widgets/popup_menu.h +++ b/ui/widgets/popup_menu.h @@ -21,6 +21,7 @@ public: PopupMenu(QWidget *parent, const style::PopupMenu &st = st::defaultPopupMenu); PopupMenu(QWidget *parent, QMenu *menu, const style::PopupMenu &st = st::defaultPopupMenu); + not_null addAction(base::unique_qptr widget); not_null addAction(const QString &text, Fn callback, const style::icon *icon = nullptr, const style::icon *iconOver = nullptr); not_null addAction(const QString &text, std::unique_ptr submenu); not_null addSeparator();