Skip to content

Commit e5688f5

Browse files
committed
Merge pull request #97292 from KoBeWi/infinite_submenus_in_your_editor
Add submenu support to EditorContextMenuPlugin
2 parents 9108c62 + 866c50a commit e5688f5

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

doc/classes/EditorContextMenuPlugin.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,24 @@
4747
[/codeblock]
4848
</description>
4949
</method>
50+
<method name="add_context_submenu_item">
51+
<return type="void" />
52+
<param index="0" name="name" type="String" />
53+
<param index="1" name="menu" type="PopupMenu" />
54+
<param index="2" name="icon" type="Texture2D" default="null" />
55+
<description>
56+
Add a submenu to the context menu of the plugin's specified slot. The submenu is not automatically handled, you need to connect to its signals yourself. Also the submenu is freed on every popup, so provide a new [PopupMenu] every time.
57+
[codeblock]
58+
func _popup_menu(paths):
59+
var popup_menu = PopupMenu.new()
60+
popup_menu.add_item("Blue")
61+
popup_menu.add_item("White")
62+
popup_menu.id_pressed.connect(_on_color_submenu_option)
63+
64+
add_context_menu_item("Set Node Color", popup_menu)
65+
[/codeblock]
66+
</description>
67+
</method>
5068
<method name="add_menu_shortcut">
5169
<return type="void" />
5270
<param index="0" name="shortcut" type="Shortcut" />

editor/plugins/editor_context_menu_plugin.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,21 @@ void EditorContextMenuPlugin::add_context_menu_item_from_shortcut(const String &
6767
context_menu_items.insert(p_name, item);
6868
}
6969

70+
void EditorContextMenuPlugin::add_context_submenu_item(const String &p_name, PopupMenu *p_menu, const Ref<Texture2D> &p_texture) {
71+
ERR_FAIL_NULL(p_menu);
72+
73+
ContextMenuItem item;
74+
item.item_name = p_name;
75+
item.icon = p_texture;
76+
item.submenu = p_menu;
77+
context_menu_items.insert(p_name, item);
78+
}
79+
7080
void EditorContextMenuPlugin::_bind_methods() {
7181
ClassDB::bind_method(D_METHOD("add_menu_shortcut", "shortcut", "callback"), &EditorContextMenuPlugin::add_menu_shortcut);
7282
ClassDB::bind_method(D_METHOD("add_context_menu_item", "name", "callback", "icon"), &EditorContextMenuPlugin::add_context_menu_item, DEFVAL(Ref<Texture2D>()));
7383
ClassDB::bind_method(D_METHOD("add_context_menu_item_from_shortcut", "name", "shortcut", "icon"), &EditorContextMenuPlugin::add_context_menu_item_from_shortcut, DEFVAL(Ref<Texture2D>()));
84+
ClassDB::bind_method(D_METHOD("add_context_submenu_item", "name", "menu", "icon"), &EditorContextMenuPlugin::add_context_submenu_item, DEFVAL(Ref<Texture2D>()));
7485

7586
GDVIRTUAL_BIND(_popup_menu, "paths");
7687

@@ -117,12 +128,17 @@ void EditorContextMenuPluginManager::add_options_from_plugins(PopupMenu *p_popup
117128
EditorContextMenuPlugin::ContextMenuItem &item = E.value;
118129
item.id = id;
119130

120-
if (item.icon.is_valid()) {
121-
p_popup->add_icon_item(item.icon, item.item_name, id);
122-
p_popup->set_item_icon_max_width(-1, icon_size);
131+
if (item.submenu) {
132+
p_popup->add_submenu_node_item(item.item_name, item.submenu, id);
123133
} else {
124134
p_popup->add_item(item.item_name, id);
125135
}
136+
137+
if (item.icon.is_valid()) {
138+
p_popup->set_item_icon(-1, item.icon);
139+
p_popup->set_item_icon_max_width(-1, icon_size);
140+
}
141+
126142
if (item.shortcut.is_valid()) {
127143
p_popup->set_item_shortcut(-1, item.shortcut, true);
128144
}

editor/plugins/editor_context_menu_plugin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class EditorContextMenuPlugin : public RefCounted {
6565
Callable callable;
6666
Ref<Texture2D> icon;
6767
Ref<Shortcut> shortcut;
68+
PopupMenu *submenu = nullptr;
6869
};
6970
HashMap<String, ContextMenuItem> context_menu_items;
7071
HashMap<Ref<Shortcut>, Callable> context_menu_shortcuts;
@@ -80,6 +81,7 @@ class EditorContextMenuPlugin : public RefCounted {
8081
void add_menu_shortcut(const Ref<Shortcut> &p_shortcut, const Callable &p_callable);
8182
void add_context_menu_item(const String &p_name, const Callable &p_callable, const Ref<Texture2D> &p_texture);
8283
void add_context_menu_item_from_shortcut(const String &p_name, const Ref<Shortcut> &p_shortcut, const Ref<Texture2D> &p_texture);
84+
void add_context_submenu_item(const String &p_name, PopupMenu *p_menu, const Ref<Texture2D> &p_texture);
8385
};
8486

8587
VARIANT_ENUM_CAST(EditorContextMenuPlugin::ContextMenuSlot);

0 commit comments

Comments
 (0)