@@ -2934,7 +2934,16 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
2934
2934
2935
2935
default : {
2936
2936
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) {
2938
2947
2939
2948
ERR_FAIL_COND (!current);
2940
2949
@@ -5269,6 +5278,100 @@ void EditorNode::add_plugin_init_callback(EditorPluginInitializeCallback p_callb
5269
5278
5270
5279
EditorPluginInitializeCallback EditorNode::plugin_init_callbacks[EditorNode::MAX_INIT_CALLBACKS];
5271
5280
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
+ }
5272
5375
5273
5376
int EditorNode::build_callback_count=0 ;
5274
5377
@@ -5412,6 +5515,8 @@ EditorNode::EditorNode() {
5412
5515
docks_visible = true ;
5413
5516
5414
5517
5518
+ _initializing_tool_menu = true ;
5519
+
5415
5520
FileAccess::set_backup_save (true );
5416
5521
5417
5522
PathRemap::get_singleton ()->clear_remaps ();; // editor uses no remaps
@@ -5871,10 +5976,9 @@ EditorNode::EditorNode() {
5871
5976
5872
5977
// tool_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
5873
5978
left_menu_hb->add_child ( tool_menu );
5979
+ tool_menu->get_popup ()->connect (" id_pressed" , this , " _menu_option" );
5874
5980
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);
5878
5982
5879
5983
export_button = memnew ( ToolButton );
5880
5984
export_button->set_tooltip (TTR (" Export the project to many platforms." ));
@@ -6755,7 +6859,8 @@ EditorNode::EditorNode() {
6755
6859
_initializing_addons=false ;
6756
6860
}
6757
6861
6758
-
6862
+ _initializing_tool_menu = false ;
6863
+ _rebuild_tool_menu ();
6759
6864
6760
6865
_load_docks ();
6761
6866
0 commit comments