Skip to content

Commit b24b52d

Browse files
Franklin Sobrinhoakien-mga
Franklin Sobrinho
authored andcommitted
Add a API to add/remove items to the "Tools" menu
1 parent e0faf8a commit b24b52d

File tree

4 files changed

+158
-6
lines changed

4 files changed

+158
-6
lines changed

tools/editor/editor_node.cpp

+110-5
Original file line numberDiff line numberDiff line change
@@ -2934,7 +2934,16 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
29342934

29352935
default: {
29362936

2937-
if (p_option>=OBJECT_METHOD_BASE) {
2937+
if (p_option>=TOOL_MENU_BASE) {
2938+
int idx = p_option - TOOL_MENU_BASE;
2939+
2940+
if (tool_menu_items[idx].submenu != "")
2941+
break;
2942+
2943+
Object *handler = ObjectDB::get_instance(tool_menu_items[idx].handler);
2944+
ERR_FAIL_COND(!handler);
2945+
handler->call(tool_menu_items[idx].callback, tool_menu_items[idx].ud);
2946+
} else if (p_option>=OBJECT_METHOD_BASE) {
29382947

29392948
ERR_FAIL_COND(!current);
29402949

@@ -5269,6 +5278,100 @@ void EditorNode::add_plugin_init_callback(EditorPluginInitializeCallback p_callb
52695278

52705279
EditorPluginInitializeCallback EditorNode::plugin_init_callbacks[EditorNode::MAX_INIT_CALLBACKS];
52715280

5281+
void EditorNode::_tool_menu_insert_item(const ToolMenuItem& p_item) {
5282+
5283+
int idx = tool_menu_items.size();
5284+
5285+
String cat;
5286+
if (p_item.name.find("/") >= 0) {
5287+
cat = p_item.name.get_slice("/", 0);
5288+
} else {
5289+
idx = 0;
5290+
cat = "";
5291+
}
5292+
5293+
for (int i = tool_menu_items.size() - 1; i >= 0; i--) {
5294+
String name = tool_menu_items[i].name;
5295+
5296+
if (name.begins_with(cat) && (cat != "" || name.find("/") < 0)) {
5297+
idx = i + 1;
5298+
break;
5299+
}
5300+
}
5301+
5302+
tool_menu_items.insert(idx, p_item);
5303+
}
5304+
5305+
void EditorNode::_rebuild_tool_menu() const {
5306+
5307+
if (_initializing_tool_menu)
5308+
return;
5309+
5310+
PopupMenu *menu = tool_menu->get_popup();
5311+
menu->clear();
5312+
5313+
for (int i = 0; i < tool_menu_items.size(); i++) {
5314+
menu->add_item(tool_menu_items[i].name.get_slice("/", 1), TOOL_MENU_BASE + i);
5315+
5316+
if (tool_menu_items[i].submenu != "")
5317+
menu->set_item_submenu(i, tool_menu_items[i].submenu);
5318+
}
5319+
}
5320+
5321+
void EditorNode::add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud) {
5322+
5323+
ERR_FAIL_COND(!p_handler);
5324+
5325+
ToolMenuItem tmi;
5326+
tmi.name = p_name;
5327+
tmi.submenu = "";
5328+
tmi.ud = p_ud;
5329+
tmi.handler = p_handler->get_instance_ID();
5330+
tmi.callback = p_callback;
5331+
_tool_menu_insert_item(tmi);
5332+
5333+
_rebuild_tool_menu();
5334+
}
5335+
5336+
void EditorNode::add_tool_submenu_item(const String& p_name, PopupMenu *p_submenu) {
5337+
5338+
ERR_FAIL_COND(!p_submenu);
5339+
ERR_FAIL_COND(p_submenu->get_parent() != NULL);
5340+
5341+
ToolMenuItem tmi;
5342+
tmi.name = p_name;
5343+
tmi.submenu = p_submenu->get_name();
5344+
tmi.ud = Variant();
5345+
tmi.handler = -1;
5346+
tmi.callback = "";
5347+
_tool_menu_insert_item(tmi);
5348+
5349+
tool_menu->get_popup()->add_child(p_submenu);
5350+
5351+
_rebuild_tool_menu();
5352+
}
5353+
5354+
void EditorNode::remove_tool_menu_item(const String& p_name) {
5355+
5356+
for (int i = 0; i < tool_menu_items.size(); i++) {
5357+
if (tool_menu_items[i].name == p_name) {
5358+
String submenu = tool_menu_items[i].submenu;
5359+
5360+
if (submenu != "") {
5361+
Node *n = tool_menu->get_popup()->get_node(submenu);
5362+
5363+
if (n) {
5364+
tool_menu->get_popup()->remove_child(n);
5365+
memdelete(n);
5366+
}
5367+
}
5368+
5369+
tool_menu_items.remove(i);
5370+
}
5371+
}
5372+
5373+
_rebuild_tool_menu();
5374+
}
52725375

52735376
int EditorNode::build_callback_count=0;
52745377

@@ -5412,6 +5515,8 @@ EditorNode::EditorNode() {
54125515
docks_visible = true;
54135516

54145517

5518+
_initializing_tool_menu = true;
5519+
54155520
FileAccess::set_backup_save(true);
54165521

54175522
PathRemap::get_singleton()->clear_remaps();; //editor uses no remaps
@@ -5871,10 +5976,9 @@ EditorNode::EditorNode() {
58715976

58725977
//tool_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
58735978
left_menu_hb->add_child( tool_menu );
5979+
tool_menu->get_popup()->connect("id_pressed", this, "_menu_option");
58745980

5875-
p=tool_menu->get_popup();
5876-
p->connect("id_pressed",this,"_menu_option");
5877-
p->add_item(TTR("Orphan Resource Explorer"),TOOLS_ORPHAN_RESOURCES);
5981+
add_tool_menu_item(TTR("Orphan Resource Explorer"), this, "_menu_option", TOOLS_ORPHAN_RESOURCES);
58785982

58795983
export_button = memnew( ToolButton );
58805984
export_button->set_tooltip(TTR("Export the project to many platforms."));
@@ -6755,7 +6859,8 @@ EditorNode::EditorNode() {
67556859
_initializing_addons=false;
67566860
}
67576861

6758-
6862+
_initializing_tool_menu = false;
6863+
_rebuild_tool_menu();
67596864

67606865
_load_docks();
67616866

tools/editor/editor_node.h

+22-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ class EditorNode : public Node {
197197

198198
IMPORT_PLUGIN_BASE=100,
199199

200-
OBJECT_METHOD_BASE=500
200+
OBJECT_METHOD_BASE=500,
201+
202+
TOOL_MENU_BASE=1000
201203
};
202204

203205

@@ -593,6 +595,22 @@ class EditorNode : public Node {
593595
void _call_build();
594596
static int build_callback_count;
595597
static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS];
598+
599+
bool _initializing_tool_menu;
600+
601+
struct ToolMenuItem {
602+
String name;
603+
String submenu;
604+
Variant ud;
605+
ObjectID handler;
606+
String callback;
607+
};
608+
609+
Vector<ToolMenuItem> tool_menu_items;
610+
611+
void _tool_menu_insert_item(const ToolMenuItem& p_item);
612+
void _rebuild_tool_menu() const;
613+
596614
protected:
597615
void _notification(int p_what);
598616
static void _bind_methods();
@@ -755,6 +773,9 @@ class EditorNode : public Node {
755773
Variant drag_files(const Vector<String>& p_files,Control* p_from);
756774
Variant drag_files_and_dirs(const Vector<String>& p_files,Control* p_from);
757775

776+
void add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud = Variant());
777+
void add_tool_submenu_item(const String& p_name, PopupMenu *p_submenu);
778+
void remove_tool_menu_item(const String& p_name);
758779

759780
EditorNode();
760781
~EditorNode();

tools/editor/editor_plugin.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2828
/*************************************************************************/
2929
#include "editor_plugin.h"
30+
#include "scene/gui/popup_menu.h"
3031
#include "scene/3d/camera.h"
3132
#include "plugins/canvas_item_editor_plugin.h"
3233
#include "plugins/spatial_editor_plugin.h"
@@ -132,6 +133,24 @@ void EditorPlugin::add_control_to_container(CustomControlContainer p_location,Co
132133
}
133134
}
134135

136+
void EditorPlugin::add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud) {
137+
138+
EditorNode::get_singleton()->add_tool_menu_item(p_name, p_handler, p_callback, p_ud);
139+
}
140+
141+
void EditorPlugin::add_tool_submenu_item(const String& p_name, Object *p_submenu) {
142+
143+
ERR_FAIL_NULL(p_submenu);
144+
PopupMenu *submenu = p_submenu->cast_to<PopupMenu>();
145+
ERR_FAIL_NULL(submenu);
146+
EditorNode::get_singleton()->add_tool_submenu_item(p_name, submenu);
147+
}
148+
149+
void EditorPlugin::remove_tool_menu_item(const String& p_name) {
150+
151+
EditorNode::get_singleton()->remove_tool_menu_item(p_name);
152+
}
153+
135154
Ref<SpatialEditorGizmo> EditorPlugin::create_spatial_gizmo(Spatial* p_spatial) {
136155
//??
137156
if (get_script_instance() && get_script_instance()->has_method("create_spatial_gizmo")) {
@@ -351,6 +370,9 @@ void EditorPlugin::_bind_methods() {
351370
ClassDB::bind_method(_MD("add_control_to_dock","slot","control:Control"),&EditorPlugin::add_control_to_dock);
352371
ClassDB::bind_method(_MD("remove_control_from_docks","control:Control"),&EditorPlugin::remove_control_from_docks);
353372
ClassDB::bind_method(_MD("remove_control_from_bottom_panel","control:Control"),&EditorPlugin::remove_control_from_bottom_panel);
373+
ClassDB::bind_method(_MD("add_tool_menu_item", "name", "handler", "callback", "ud"),&EditorPlugin::add_tool_menu_item,DEFVAL(Variant()));
374+
ClassDB::bind_method(_MD("add_tool_submenu_item", "name", "submenu:PopupMenu"),&EditorPlugin::add_tool_submenu_item);
375+
ClassDB::bind_method(_MD("remove_tool_menu_item", "name"),&EditorPlugin::remove_tool_menu_item);
354376
ClassDB::bind_method(_MD("add_custom_type","type","base","script:Script","icon:Texture"),&EditorPlugin::add_custom_type);
355377
ClassDB::bind_method(_MD("remove_custom_type","type"),&EditorPlugin::remove_custom_type);
356378
ClassDB::bind_method(_MD("get_editor_viewport:Control"), &EditorPlugin::get_editor_viewport);

tools/editor/editor_plugin.h

+4
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ friend class EditorData;
103103
Control* get_editor_viewport();
104104
void edit_resource(const Ref<Resource>& p_resource);
105105

106+
void add_tool_menu_item(const String& p_name, Object *p_handler, const String& p_callback, const Variant& p_ud = Variant());
107+
void add_tool_submenu_item(const String& p_name, Object *p_submenu);
108+
void remove_tool_menu_item(const String& p_name);
109+
106110
virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial* p_spatial);
107111
virtual bool forward_canvas_gui_input(const Transform2D& p_canvas_xform, const InputEvent& p_event);
108112
virtual void forward_draw_over_canvas(const Transform2D& p_canvas_xform,Control *p_canvas);

0 commit comments

Comments
 (0)