diff --git a/Userland/Libraries/LibGUI/CommandPalette.cpp b/Userland/Libraries/LibGUI/CommandPalette.cpp index 3dd9107f92..2a5bea2caf 100644 --- a/Userland/Libraries/LibGUI/CommandPalette.cpp +++ b/Userland/Libraries/LibGUI/CommandPalette.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -233,11 +234,28 @@ void CommandPalette::collect_actions(GUI::Window& parent_window) }); }; + Function collect_actions_from_menu = [&](Menu& menu) { + for (auto menu_item : menu.items()) { + if (menu_item.submenu()) + collect_actions_from_menu(*menu_item.submenu()); + + auto const* action = menu_item.action(); + if (action && action->is_enabled()) + actions.set(*action); + } + }; + for (auto* widget = parent_window.focused_widget(); widget; widget = widget->parent_widget()) collect_action_children(*widget); collect_action_children(parent_window); + parent_window.menubar().for_each_menu([&](Menu& menu) { + collect_actions_from_menu(menu); + + return IterationDecision::Continue; + }); + if (!parent_window.is_modal()) { for (auto const& it : GUI::Application::the()->global_shortcut_actions({})) { if (it.value->is_enabled()) diff --git a/Userland/Libraries/LibGUI/Menu.h b/Userland/Libraries/LibGUI/Menu.h index 690e814c50..2f144b6e60 100644 --- a/Userland/Libraries/LibGUI/Menu.h +++ b/Userland/Libraries/LibGUI/Menu.h @@ -51,6 +51,8 @@ public: bool is_visible() const { return m_visible; } + NonnullOwnPtrVector const& items() const { return m_items; } + private: friend class Menubar; diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index e75a14cbb7..d340135650 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -219,6 +219,9 @@ public: void flush_pending_paints_immediately(); + Menubar& menubar() { return *m_menubar; } + Menubar const& menubar() const { return *m_menubar; } + protected: Window(Core::Object* parent = nullptr); virtual void wm_event(WMEvent&);