diff --git a/Userland/Libraries/LibGUI/Action.h b/Userland/Libraries/LibGUI/Action.h index 0769822650..7823796714 100644 --- a/Userland/Libraries/LibGUI/Action.h +++ b/Userland/Libraries/LibGUI/Action.h @@ -118,6 +118,8 @@ public: const ActionGroup* group() const { return m_action_group.ptr(); } void set_group(Badge, ActionGroup*); + HashTable menu_items() const { return m_menu_items; } + private: Action(String, Function = nullptr, Core::Object* = nullptr, bool checkable = false); Action(String, const Shortcut&, Function = nullptr, Core::Object* = nullptr, bool checkable = false); diff --git a/Userland/Libraries/LibGUI/CommandPalette.cpp b/Userland/Libraries/LibGUI/CommandPalette.cpp index 4d2725cc2d..a230a43d87 100644 --- a/Userland/Libraries/LibGUI/CommandPalette.cpp +++ b/Userland/Libraries/LibGUI/CommandPalette.cpp @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include #include @@ -63,6 +65,7 @@ public: enum Column { Icon, Text, + Menu, Shortcut, __Count, }; @@ -117,7 +120,9 @@ public: } return ""; case Column::Text: - return Gfx::parse_ampersand_string(action.text()); + return action_text(index); + case Column::Menu: + return menu_name(index); case Column::Shortcut: if (!action.shortcut().is_valid()) return ""; @@ -129,13 +134,33 @@ public: virtual TriState data_matches(GUI::ModelIndex const& index, GUI::Variant const& term) const override { - auto& action = *static_cast(index.internal_data()); - auto text = Gfx::parse_ampersand_string(action.text()); - if (text.contains(term.as_string(), CaseSensitivity::CaseInsensitive)) + auto search = String::formatted("{} {}", menu_name(index), action_text(index)); + if (search.contains(term.as_string(), CaseSensitivity::CaseInsensitive)) return TriState::True; return TriState::False; } + static String action_text(ModelIndex const& index) + { + auto& action = *static_cast(index.internal_data()); + + return Gfx::parse_ampersand_string(action.text()); + } + + static String menu_name(ModelIndex const& index) + { + auto& action = *static_cast(index.internal_data()); + if (action.menu_items().is_empty()) + return {}; + + auto* menu_item = *action.menu_items().begin(); + auto* menu = Menu::from_menu_id(menu_item->menu_id()); + if (!menu) + return {}; + + return Gfx::parse_ampersand_string(menu->name()); + } + private: Vector> const& m_actions; };