2023-01-05 13:25:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*  editor_node.cpp                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                         This file is part of:                          */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                             GODOT ENGINE                               */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                        https://godotengine.org                         */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Permission is hereby granted, free of charge, to any person obtaining  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* a copy of this software and associated documentation files (the        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* "Software"), to deal in the Software without restriction, including    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* without limitation the rights to use, copy, modify, merge, publish,    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* distribute, sublicense, and/or sell copies of the Software, and to     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* permit persons to whom the Software is furnished to do so, subject to  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* the following conditions:                                              */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* The above copyright notice and this permission notice shall be         */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* included in all copies or substantial portions of the Software.        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2018-01-05 00:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "editor_node.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-01-16 08:04:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-07 19:33:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/config/project_settings.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-08-04 20:34:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/extension/gdextension_manager.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-04-28 15:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/input/input.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/io/config_file.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-06-11 14:51:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/io/file_access.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-10-16 14:13:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/io/image.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "core/io/resource_loader.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/io/resource_saver.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-11-07 19:33:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/object/class_db.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/os/keyboard.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/os/os.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-05-24 07:54:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/os/time.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-11-07 19:33:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/string/print_string.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-08-15 15:00:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/string/translation_server.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/version.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-08-13 02:33:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_string_names.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-09-03 23:07:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/editor_context_menu_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "main/main.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-12-20 22:05:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/2d/node_2d.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-09-28 05:32:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/3d/bone_attachment_3d.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-12-31 01:20:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/animation/animation_tree.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-31 21:14:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/gui/color_picker.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/gui/dialogs.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "scene/gui/file_dialog.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/gui/menu_bar.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/gui/menu_button.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "scene/gui/panel.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/gui/popup.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "scene/gui/rich_text_label.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/gui/split_container.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "scene/gui/tab_container.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-12-10 15:44:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/main/window.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/property_utils.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-07-11 22:29:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/image_texture.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/packed_scene.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-07-11 22:29:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/portable_compressed_texture.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/theme/theme_db.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-12-10 15:44:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "servers/display_server.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "servers/navigation_server_3d.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "servers/physics_server_2d.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-08-30 16:25:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "servers/rendering_server.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/audio_stream_preview.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-03-08 18:58:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/debugger/editor_debugger_node.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/debugger/script_editor_debugger.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/dependency_editor.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/editor_about.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_audio_buses.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-14 14:18:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_build_profile.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_command_palette.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-02-12 02:46:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_data.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_dock_manager.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_feature_profile.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-02-12 02:46:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_folding.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_help.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_inspector.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-04-05 17:14:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_interface.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_layouts_dialog.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/editor_log.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_main_screen.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-04-07 18:59:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_native_shader_source_visualizer.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-05-24 21:25:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_paths.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_properties.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-03-03 18:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_property_name_processor.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_resource_picker.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-11-19 12:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_resource_preview.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_settings.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_settings_dialog.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-06-23 13:48:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_translation_parser.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_undo_redo_manager.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-17 12:24:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/export/editor_export.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-20 17:45:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/export/export_template_manager.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/export/project_export.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-04-02 13:43:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/fbx_importer_manager.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/filesystem_dock.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:22:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/gui/editor_bottom_panel.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-04-07 18:59:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/gui/editor_file_dialog.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/gui/editor_quick_open_dialog.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/gui/editor_run_bar.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/gui/editor_scene_tabs.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-04-07 18:59:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/gui/editor_title_bar.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/gui/editor_toaster.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-08-27 13:52:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/history_dock.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-10-09 01:12:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/3d/editor_import_collada.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/import/3d/resource_importer_obj.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/import/3d/resource_importer_scene.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/import/3d/scene_import_settings.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-21 01:00:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/audio_stream_import_settings.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-02-14 14:00:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/dynamic_font_import_settings.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-01-06 16:36:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_bitmask.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-12-27 15:30:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_bmfont.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_csv_translation.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-02-14 14:00:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_dynamic_font.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-07-29 16:45:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_image.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-12-27 15:30:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_imagefont.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-08-06 14:56:06 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_layered_texture.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-04-19 23:19:21 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_shader_file.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_texture.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-04-19 15:54:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_texture_atlas.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import/resource_importer_wav.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/import_dock.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-11-19 12:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/inspector_dock.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-11-10 09:37:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/multi_node_edit.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/node_dock.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/animation_player_editor_plugin.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/plugins/asset_library_editor_plugin.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/plugins/canvas_item_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-02-07 02:52:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/debugger_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-12-20 15:49:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/dedicated_server_export_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-04-21 01:11:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-11-19 12:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/editor_preview_plugins.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-31 21:14:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/editor_resource_conversion_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:07:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/game_view_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-03-10 09:48:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/gdextension_export_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/material_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-08-21 19:06:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/mesh_library_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-03-27 08:44:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/node_3d_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-06-23 13:48:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/packed_scene_translation_parser_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:48:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/particle_process_material_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-04-21 01:11:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/plugin_config_dialog.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-06-26 19:05:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/root_motion_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/script_text_editor.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/text_editor.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-09-03 20:12:08 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/version_control_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-07-14 18:15:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/plugins/visual_shader_editor_plugin.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/progress_dialog.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/project_settings_editor.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/register_exporters.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-02-12 02:46:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/scene_tree_dock.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-10-19 13:31:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/surface_upgrade_tool.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-01-15 13:14:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/themes/editor_scale.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/themes/editor_theme_manager.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-11-02 15:23:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/window_wrapper.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-12-10 15:44:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-29 16:11:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <stdlib.h> 
  
						 
					
						
							
								
									
										
										
										
											2014-02-18 12:21:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-08 22:16:55 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "modules/modules_enabled.gen.h"   // For gdscript, mono.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EditorNode  * EditorNode : : singleton  =  nullptr ;  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  String  EDITOR_NODE_CONFIG_SECTION  =  " EditorNode " ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  String  REMOVE_ANDROID_BUILD_TEMPLATE_MESSAGE  =  " The Android build template is already installed in this project and it won't be overwritten. \n Remove the  \" %s \"  directory manually before attempting this operation again. " ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  String  INSTALL_ANDROID_BUILD_TEMPLATE_MESSAGE  =  " This will set up your project for gradle Android builds by installing the source template to  \" %s \" . \n Note that in order to make gradle builds instead of using pre-built APKs, the  \" Use Gradle Build \"  option should be enabled in the Android export preset. " ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorProgress : : step ( const  String  & p_state ,  int  p_step ,  bool  p_force_refresh )  {  
						 
					
						
							
								
									
										
										
										
											2024-09-04 14:26:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! force_background  & &  Thread : : is_main_thread ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  EditorNode : : progress_task_step ( task ,  p_state ,  p_step ,  p_force_refresh ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : progress_task_step_bg ( task ,  p_step ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 14:26:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EditorProgress : : EditorProgress ( const  String  & p_task ,  const  String  & p_label ,  int  p_amount ,  bool  p_can_cancel ,  bool  p_force_background )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_force_background  & &  Thread : : is_main_thread ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorNode : : progress_add_task ( p_task ,  p_label ,  p_amount ,  p_can_cancel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : progress_add_task_bg ( p_task ,  p_label ,  p_amount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									task  =  p_task ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 14:26:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									force_background  =  p_force_background ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EditorProgress : : ~ EditorProgress ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-09-04 14:26:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! force_background  & &  Thread : : is_main_thread ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorNode : : progress_end_task ( task ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : progress_end_task_bg ( task ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : disambiguate_filenames ( const  Vector < String >  p_full_paths ,  Vector < String >  & r_filenames )  {  
						 
					
						
							
								
									
										
										
										
											2022-07-27 20:51:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( p_full_paths . size ( )  ! =  r_filenames . size ( ) ,  vformat ( " disambiguate_filenames requires two string vectors of same length (%d != %d). " ,  p_full_paths . size ( ) ,  r_filenames . size ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Keep track of a list of "index sets," i.e. sets of indices
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// within disambiguated_scene_names which contain the same name.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < RBSet < int > >  index_sets ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < String ,  int >  scene_name_to_set_index ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  r_filenames . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-18 17:40:56 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  String  & scene_name  =  r_filenames [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! scene_name_to_set_index . has ( scene_name ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											index_sets . append ( RBSet < int > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scene_name_to_set_index . insert ( r_filenames [ i ] ,  index_sets . size ( )  -  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										index_sets . write [ scene_name_to_set_index [ scene_name ] ] . insert ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// For each index set with a size > 1, we need to disambiguate.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  index_sets . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										RBSet < int >  iset  =  index_sets [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										while  ( iset . size ( )  >  1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Append the parent folder to each scene name.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  int  & E  :  iset )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  set_idx  =  E ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												String  scene_name  =  r_filenames [ set_idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  full_path  =  p_full_paths [ set_idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Get rid of file extensions and res:// prefixes.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-06 15:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												scene_name  =  scene_name . get_basename ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( full_path . begins_with ( " res:// " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													full_path  =  full_path . substr ( 6 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-06 15:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												full_path  =  full_path . get_basename ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-27 20:51:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Normalize trailing slashes when normalizing directory names.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-31 12:45:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												scene_name  =  scene_name . trim_suffix ( " / " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												full_path  =  full_path . trim_suffix ( " / " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-27 20:51:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  scene_name_size  =  scene_name . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  full_path_size  =  full_path . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  difference  =  full_path_size  -  scene_name_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Find just the parent folder of the current path and append it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If the current name is foo.tscn, and the full path is /some/folder/foo.tscn
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// then slash_idx is the second '/', so that we select just "folder", and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// append that to yield "folder/foo.tscn".
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( difference  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  parent  =  full_path . substr ( 0 ,  difference ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-16 18:52:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													int  slash_idx  =  parent . rfind_char ( ' / ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													slash_idx  =  parent . rfind_char ( ' / ' ,  slash_idx  -  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-06 15:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													parent  =  ( slash_idx  > =  0  & &  parent . length ( )  >  1 )  ?  parent . substr ( slash_idx  +  1 )  :  parent ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													r_filenames . write [ set_idx ]  =  parent  +  r_filenames [ set_idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Loop back through scene names and remove non-ambiguous names.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  can_proceed  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RBSet < int > : : Element  * E  =  iset . front ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											while  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  scene_name  =  r_filenames [ E - > get ( ) ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  duplicate_found  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( const  int  & F  :  iset )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( E - > get ( )  = =  F )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-18 17:40:56 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  String  & other_scene_name  =  r_filenames [ F ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( other_scene_name  = =  scene_name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														duplicate_found  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												RBSet < int > : : Element  * to_erase  =  duplicate_found  ?  nullptr  :  E ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// We need to check that we could actually append anymore names
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// if we wanted to for disambiguation. If we can't, then we have
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// to abort even with ambiguous names. We clean the full path
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// and the scene name first to remove extensions so that this
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// comparison actually works.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  path  =  p_full_paths [ E - > get ( ) ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-31 12:45:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Get rid of file extensions and res:// prefixes.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-06 15:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												scene_name  =  scene_name . get_basename ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( path . begins_with ( " res:// " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													path  =  path . substr ( 6 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-06 15:51:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												path  =  path . get_basename ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-31 12:45:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Normalize trailing slashes when normalizing directory names.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scene_name  =  scene_name . trim_suffix ( " / " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												path  =  path . trim_suffix ( " / " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// We can proceed if the full path is longer than the scene name,
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 21:49:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// meaning that there is at least one more parent folder we can
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// tack onto the name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												can_proceed  =  can_proceed  | |  ( path . size ( )  -  scene_name . size ( ) )  > =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												E  =  E - > next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( to_erase )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													iset . erase ( to_erase ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! can_proceed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-03 20:12:08 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _version_control_menu_option ( int  p_idx )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( vcs_actions_menu - > get_item_id ( p_idx ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-29 15:01:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  RUN_VCS_METADATA :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											VersionControlEditorPlugin : : get_singleton ( ) - > popup_vcs_metadata_dialog ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-03 20:12:08 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  RUN_VCS_SETTINGS :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											VersionControlEditorPlugin : : get_singleton ( ) - > popup_vcs_set_up_dialog ( gui_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _update_title ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  String  appname  =  GLOBAL_GET ( " application/config/name " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  title  =  ( appname . is_empty ( )  ?  TTR ( " Unnamed Project " )  :  appname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  String  edited  =  editor_data . get_edited_scene_root ( )  ?  editor_data . get_edited_scene_root ( ) - > get_scene_file_path ( )  :  String ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! edited . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 19:28:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Display the edited scene name before the program name so that it can be seen in the OS task bar.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										title  =  vformat ( " %s - %s " ,  edited . get_file ( ) ,  title ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unsaved_cache )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 19:28:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Display the "modified" mark before anything else so that it can always be seen in the OS task bar.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										title  =  vformat ( " (*) %s " ,  title ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DisplayServer : : get_singleton ( ) - > window_set_title ( title  +  String ( "  -  " )  +  VERSION_NAME ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( project_title )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_title - > set_text ( title ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-11 15:59:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : shortcut_input ( const  Ref < InputEvent >  & p_event )  {  
						 
					
						
							
								
									
										
										
										
											2021-04-05 08:52:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( p_event . is_null ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 12:38:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < InputEventKey >  k  =  p_event ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( k . is_valid ( )  & &  k - > is_pressed ( )  & &  ! k - > is_echo ( ) )  | |  Object : : cast_to < InputEventShortcut > ( * p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-07 10:44:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  is_handled  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 13:07:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ED_IS_SHORTCUT ( " editor/filter_files " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											FileSystemDock : : get_singleton ( ) - > focus_on_filter ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-07 10:44:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_2d " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > select ( EditorMainScreen : : EDITOR_2D ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:26:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_3d " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > select ( EditorMainScreen : : EDITOR_3D ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:26:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_script " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > select ( EditorMainScreen : : EDITOR_SCRIPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:07:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_game " ,  p_event ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_main_screen - > select ( EditorMainScreen : : EDITOR_GAME ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:26:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_help " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-17 18:22:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											emit_signal ( SNAME ( " request_help_search " ) ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-29 19:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_assetlib " ,  p_event )  & &  AssetLibraryEditorPlugin : : is_available ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > select ( EditorMainScreen : : EDITOR_ASSETLIB ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:26:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_next " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > select_next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:26:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/editor_prev " ,  p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > select_prev ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/command_palette " ,  p_event ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_open_command_palette ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-08 00:08:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ED_IS_SHORTCUT ( " editor/toggle_last_opened_bottom_panel " ,  p_event ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bottom_panel - > toggle_last_opened_bottom_panel ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-07 10:44:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											is_handled  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-19 09:04:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-07 10:44:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( is_handled )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-04 13:36:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > get_root ( ) - > set_input_as_handled ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-13 21:20:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-02 01:18:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_vsync_mode ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  DisplayServer : : VSyncMode  window_vsync_mode  =  DisplayServer : : VSyncMode ( int ( EDITOR_GET ( " interface/editor/vsync_mode " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DisplayServer : : get_singleton ( ) - > window_set_vsync_mode ( window_vsync_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_from_settings ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-08-09 17:52:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_title ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  current_filter  =  GLOBAL_GET ( " rendering/textures/canvas_textures/default_texture_filter " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( current_filter  ! =  scene_root - > get_default_canvas_item_texture_filter ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Viewport : : DefaultCanvasItemTextureFilter  tf  =  ( Viewport : : DefaultCanvasItemTextureFilter ) current_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scene_root - > set_default_canvas_item_texture_filter ( tf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  current_repeat  =  GLOBAL_GET ( " rendering/textures/canvas_textures/default_texture_repeat " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( current_repeat  ! =  scene_root - > get_default_canvas_item_texture_repeat ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Viewport : : DefaultCanvasItemTextureRepeat  tr  =  ( Viewport : : DefaultCanvasItemTextureRepeat ) current_repeat ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scene_root - > set_default_canvas_item_texture_repeat ( tr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : DOFBokehShape  dof_shape  =  RS : : DOFBokehShape ( int ( GLOBAL_GET ( " rendering/camera/depth_of_field/depth_of_field_bokeh_shape " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 16:20:24 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > camera_attributes_set_dof_blur_bokeh_shape ( dof_shape ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : DOFBlurQuality  dof_quality  =  RS : : DOFBlurQuality ( int ( GLOBAL_GET ( " rendering/camera/depth_of_field/depth_of_field_bokeh_quality " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  dof_jitter  =  GLOBAL_GET ( " rendering/camera/depth_of_field/depth_of_field_use_jitter " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 16:20:24 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > camera_attributes_set_dof_blur_quality ( dof_quality ,  dof_jitter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_ssao_quality ( RS : : EnvironmentSSAOQuality ( int ( GLOBAL_GET ( " rendering/environment/ssao/quality " ) ) ) ,  GLOBAL_GET ( " rendering/environment/ssao/half_size " ) ,  GLOBAL_GET ( " rendering/environment/ssao/adaptive_target " ) ,  GLOBAL_GET ( " rendering/environment/ssao/blur_passes " ) ,  GLOBAL_GET ( " rendering/environment/ssao/fadeout_from " ) ,  GLOBAL_GET ( " rendering/environment/ssao/fadeout_to " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > screen_space_roughness_limiter_set_active ( GLOBAL_GET ( " rendering/anti_aliasing/screen_space_roughness_limiter/enabled " ) ,  GLOBAL_GET ( " rendering/anti_aliasing/screen_space_roughness_limiter/amount " ) ,  GLOBAL_GET ( " rendering/anti_aliasing/screen_space_roughness_limiter/limit " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  glow_bicubic  =  int ( GLOBAL_GET ( " rendering/environment/glow/upscale_mode " ) )  >  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 00:07:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_ssil_quality ( RS : : EnvironmentSSILQuality ( int ( GLOBAL_GET ( " rendering/environment/ssil/quality " ) ) ) ,  GLOBAL_GET ( " rendering/environment/ssil/half_size " ) ,  GLOBAL_GET ( " rendering/environment/ssil/adaptive_target " ) ,  GLOBAL_GET ( " rendering/environment/ssil/blur_passes " ) ,  GLOBAL_GET ( " rendering/environment/ssil/fadeout_from " ) ,  GLOBAL_GET ( " rendering/environment/ssil/fadeout_to " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_glow_set_use_bicubic_upscale ( glow_bicubic ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : EnvironmentSSRRoughnessQuality  ssr_roughness_quality  =  RS : : EnvironmentSSRRoughnessQuality ( int ( GLOBAL_GET ( " rendering/environment/screen_space_reflection/roughness_quality " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_ssr_roughness_quality ( ssr_roughness_quality ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : SubSurfaceScatteringQuality  sss_quality  =  RS : : SubSurfaceScatteringQuality ( int ( GLOBAL_GET ( " rendering/environment/subsurface_scattering/subsurface_scattering_quality " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > sub_surface_scattering_set_quality ( sss_quality ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									float  sss_scale  =  GLOBAL_GET ( " rendering/environment/subsurface_scattering/subsurface_scattering_scale " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									float  sss_depth_scale  =  GLOBAL_GET ( " rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > sub_surface_scattering_set_scale ( sss_scale ,  sss_depth_scale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 16:20:24 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uint32_t  directional_shadow_size  =  GLOBAL_GET ( " rendering/lights_and_shadows/directional_shadow/size " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uint32_t  directional_shadow_16_bits  =  GLOBAL_GET ( " rendering/lights_and_shadows/directional_shadow/16_bits " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > directional_shadow_atlas_set_size ( directional_shadow_size ,  directional_shadow_16_bits ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 16:20:24 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : ShadowQuality  shadows_quality  =  RS : : ShadowQuality ( int ( GLOBAL_GET ( " rendering/lights_and_shadows/positional_shadow/soft_shadow_filter_quality " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-01 01:40:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > positional_soft_shadow_filter_set_quality ( shadows_quality ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 16:20:24 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : ShadowQuality  directional_shadow_quality  =  RS : : ShadowQuality ( int ( GLOBAL_GET ( " rendering/lights_and_shadows/directional_shadow/soft_shadow_filter_quality " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-01 01:40:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > directional_soft_shadow_filter_set_quality ( directional_shadow_quality ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									float  probe_update_speed  =  GLOBAL_GET ( " rendering/lightmapping/probe_capture/update_speed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > lightmap_set_probe_capture_update_speed ( probe_update_speed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : EnvironmentSDFGIFramesToConverge  frames_to_converge  =  RS : : EnvironmentSDFGIFramesToConverge ( int ( GLOBAL_GET ( " rendering/global_illumination/sdfgi/frames_to_converge " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_sdfgi_frames_to_converge ( frames_to_converge ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : EnvironmentSDFGIRayCount  ray_count  =  RS : : EnvironmentSDFGIRayCount ( int ( GLOBAL_GET ( " rendering/global_illumination/sdfgi/probe_ray_count " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_sdfgi_ray_count ( ray_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 19:47:26 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : VoxelGIQuality  voxel_gi_quality  =  RS : : VoxelGIQuality ( int ( GLOBAL_GET ( " rendering/global_illumination/voxel_gi/quality " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > voxel_gi_set_quality ( voxel_gi_quality ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_volumetric_fog_volume_size ( GLOBAL_GET ( " rendering/environment/volumetric_fog/volume_size " ) ,  GLOBAL_GET ( " rendering/environment/volumetric_fog/volume_depth " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > environment_set_volumetric_fog_filter_active ( bool ( GLOBAL_GET ( " rendering/environment/volumetric_fog/use_filter " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > canvas_set_shadow_texture_size ( GLOBAL_GET ( " rendering/2d/shadow_atlas/size " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-20 15:43:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  use_half_res_gi  =  GLOBAL_GET ( " rendering/global_illumination/gi/use_half_resolution " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > gi_set_use_half_resolution ( use_half_res_gi ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  snap_2d_transforms  =  GLOBAL_GET ( " rendering/2d/snap/snap_2d_transforms_to_pixel " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_snap_2d_transforms_to_pixel ( snap_2d_transforms ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  snap_2d_vertices  =  GLOBAL_GET ( " rendering/2d/snap/snap_2d_vertices_to_pixel " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_snap_2d_vertices_to_pixel ( snap_2d_vertices ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Viewport : : SDFOversize  sdf_oversize  =  Viewport : : SDFOversize ( int ( GLOBAL_GET ( " rendering/2d/sdf/oversize " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_sdf_oversize ( sdf_oversize ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-17 13:44:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Viewport : : SDFScale  sdf_scale  =  Viewport : : SDFScale ( int ( GLOBAL_GET ( " rendering/2d/sdf/scale " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_sdf_scale ( sdf_scale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 01:02:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Viewport : : MSAA  msaa  =  Viewport : : MSAA ( int ( GLOBAL_GET ( " rendering/anti_aliasing/quality/msaa_2d " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_root - > set_msaa_2d ( msaa ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-03 14:10:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  use_hdr_2d  =  GLOBAL_GET ( " rendering/viewport/hdr_2d " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_root - > set_use_hdr_2d ( use_hdr_2d ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-29 00:10:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									float  mesh_lod_threshold  =  GLOBAL_GET ( " rendering/mesh_lod/lod_change/threshold_pixels " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_root - > set_mesh_lod_threshold ( mesh_lod_threshold ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-19 16:41:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > decals_set_filter ( RS : : DecalFilter ( int ( GLOBAL_GET ( " rendering/textures/decals/filter " ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > light_projectors_set_filter ( RS : : LightProjectorFilter ( int ( GLOBAL_GET ( " rendering/textures/light_projectors/filter " ) ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-25 17:48:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > lightmaps_set_bicubic_filter ( GLOBAL_GET ( " rendering/lightmapping/lightmap_gi/use_bicubic_filter " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-28 10:49:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SceneTree  * tree  =  get_tree ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tree - > set_debug_collisions_color ( GLOBAL_GET ( " debug/shapes/collision/shape_color " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tree - > set_debug_collision_contact_color ( GLOBAL_GET ( " debug/shapes/collision/contact_color " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-01 18:58:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-09 17:52:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceImporterTexture : : get_singleton ( ) - > update_imports ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-01 18:58:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2022-12-21 14:21:43 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_edge_connection_color ( GLOBAL_GET ( " debug/shapes/navigation/edge_connection_color " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_geometry_edge_color ( GLOBAL_GET ( " debug/shapes/navigation/geometry_edge_color " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_geometry_face_color ( GLOBAL_GET ( " debug/shapes/navigation/geometry_face_color " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_geometry_edge_disabled_color ( GLOBAL_GET ( " debug/shapes/navigation/geometry_edge_disabled_color " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_geometry_face_disabled_color ( GLOBAL_GET ( " debug/shapes/navigation/geometry_face_disabled_color " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_enable_edge_connections ( GLOBAL_GET ( " debug/shapes/navigation/enable_edge_connections " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_enable_edge_connections_xray ( GLOBAL_GET ( " debug/shapes/navigation/enable_edge_connections_xray " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_enable_edge_lines ( GLOBAL_GET ( " debug/shapes/navigation/enable_edge_lines " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_enable_edge_lines_xray ( GLOBAL_GET ( " debug/shapes/navigation/enable_edge_lines_xray " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavigationServer3D : : get_singleton ( ) - > set_debug_navigation_enable_geometry_face_random_color ( GLOBAL_GET ( " debug/shapes/navigation/enable_geometry_face_random_color " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-01 18:58:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-04 20:34:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _gdextensions_reloaded ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// In case the developer is inspecting an object that will be changed by the reload.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InspectorDock : : get_inspector_singleton ( ) - > update_tree ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-24 16:40:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 10:16:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Reload script editor to revalidate GDScript if classes are added or removed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ScriptEditor : : get_singleton ( ) - > reload_scripts ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-24 16:40:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Regenerate documentation.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorHelp : : generate_doc ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-04 20:34:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_theme ( bool  p_skip_creation )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_skip_creation )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 13:14:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										theme  =  EditorThemeManager : : generate_theme ( theme ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										DisplayServer : : set_early_window_clear_color_override ( true ,  theme - > get_color ( SNAME ( " background " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 10:09:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < Ref < Theme > >  editor_themes ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_themes . push_back ( theme ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_themes . push_back ( ThemeDB : : get_singleton ( ) - > get_default_theme ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ThemeContext  * node_tc  =  ThemeDB : : get_singleton ( ) - > get_theme_context ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( node_tc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										node_tc - > set_themes ( editor_themes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ThemeDB : : get_singleton ( ) - > create_theme_context ( this ,  editor_themes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Window  * window  =  get_window ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( window )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ThemeContext  * window_tc  =  ThemeDB : : get_singleton ( ) - > get_theme_context ( window ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( window_tc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											window_tc - > set_themes ( editor_themes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ThemeDB : : get_singleton ( ) - > create_theme_context ( window ,  editor_themes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( CanvasItemEditor : : get_singleton ( ) - > get_theme_preview ( )  = =  CanvasItemEditor : : THEME_PREVIEW_EDITOR )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										update_preview_themes ( CanvasItemEditor : : THEME_PREVIEW_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:35:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Update styles.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:50:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										gui_base - > add_theme_style_override ( SceneStringName ( panel ) ,  theme - > get_stylebox ( SNAME ( " Background " ) ,  EditorStringName ( EditorStyles ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:35:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										main_vbox - > set_anchors_and_offsets_preset ( Control : : PRESET_FULL_RECT ,  Control : : PRESET_MODE_MINSIZE ,  theme - > get_constant ( SNAME ( " window_border_margin " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										main_vbox - > add_theme_constant_override ( " separation " ,  theme - > get_constant ( SNAME ( " top_bar_separation " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_main_screen - > add_theme_style_override ( SceneStringName ( panel ) ,  theme - > get_stylebox ( SNAME ( " Content " ) ,  EditorStringName ( EditorStyles ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:50:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bottom_panel - > add_theme_style_override ( SceneStringName ( panel ) ,  theme - > get_stylebox ( SNAME ( " BottomPanel " ) ,  EditorStringName ( EditorStyles ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-09 15:21:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										distraction_free - > set_button_icon ( theme - > get_icon ( SNAME ( " DistractionFree " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:41:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										distraction_free - > add_theme_style_override ( SceneStringName ( pressed ) ,  theme - > get_stylebox ( CoreStringName ( normal ) ,  " FlatMenuButton " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:35:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										help_menu - > set_item_icon ( help_menu - > get_item_index ( HELP_SEARCH ) ,  theme - > get_icon ( SNAME ( " HelpSearch " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										help_menu - > set_item_icon ( help_menu - > get_item_index ( HELP_COPY_SYSTEM_INFO ) ,  theme - > get_icon ( SNAME ( " ActionCopy " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										help_menu - > set_item_icon ( help_menu - > get_item_index ( HELP_ABOUT ) ,  theme - > get_icon ( SNAME ( " Godot " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										help_menu - > set_item_icon ( help_menu - > get_item_index ( HELP_SUPPORT_GODOT_DEVELOPMENT ) ,  theme - > get_icon ( SNAME ( " Heart " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( EditorDebuggerNode : : get_singleton ( ) - > is_visible ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:50:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bottom_panel - > add_theme_style_override ( SceneStringName ( panel ) ,  theme - > get_stylebox ( SNAME ( " BottomPanelDebuggerOverride " ) ,  EditorStringName ( EditorStyles ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:35:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 19:04:36 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_update_renderer_color ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > update_tab_styles ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > set_tab_icon_max_width ( theme - > get_constant ( SNAME ( " class_icon_size " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : update_preview_themes ( int  p_mode )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! scene_root - > is_inside_tree ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ;  // Too early.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 10:09:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < Ref < Theme > >  preview_themes ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( p_mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  CanvasItemEditor : : THEME_PREVIEW_PROJECT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											preview_themes . push_back ( ThemeDB : : get_singleton ( ) - > get_project_theme ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  CanvasItemEditor : : THEME_PREVIEW_EDITOR : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											preview_themes . push_back ( get_editor_theme ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									preview_themes . push_back ( ThemeDB : : get_singleton ( ) - > get_default_theme ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ThemeContext  * preview_context  =  ThemeDB : : get_singleton ( ) - > get_theme_context ( scene_root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( preview_context )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										preview_context - > set_themes ( preview_themes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ThemeDB : : get_singleton ( ) - > create_theme_context ( scene_root ,  preview_themes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _notification ( int  p_what )  {  
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( p_what )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 22:14:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_POSTINITIALIZE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorHelp : : generate_doc ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-08 22:16:55 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if defined(MODULE_GDSCRIPT_ENABLED) || defined(MODULE_MONO_ENABLED) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorHelpHighlighter : : create_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2023-10-20 22:14:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_PROCESS :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( opening_prev  & &  ! confirmation - > is_visible ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												opening_prev  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-20 19:38:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  global_unsaved  =  EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( EditorUndoRedoManager : : GLOBAL_HISTORY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  scene_or_global_unsaved  =  global_unsaved  | |  EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( editor_data . get_current_edited_scene_history_id ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( unsaved_cache  ! =  scene_or_global_unsaved )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												unsaved_cache  =  scene_or_global_unsaved ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_title ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 23:45:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( editor_data . is_scene_changed ( - 1 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-26 08:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Update the animation frame of the update spinner.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uint64_t  frame  =  Engine : : get_singleton ( ) - > get_frames_drawn ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-26 08:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uint64_t  tick  =  OS : : get_singleton ( ) - > get_ticks_msec ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( frame  ! =  update_spinner_step_frame  & &  ( tick  -  update_spinner_step_msec )  >  ( 1000  /  8 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												update_spinner_step + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( update_spinner_step  > =  8 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													update_spinner_step  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												update_spinner_step_msec  =  tick ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												update_spinner_step_frame  =  frame  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-26 08:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Update the icon itself only when the spinner is visible.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-08 15:13:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( _should_display_update_spinner ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-09 15:21:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													update_spinner - > set_button_icon ( theme - > get_icon ( " Progress "  +  itos ( update_spinner_step  +  1 ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_selection - > update ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-13 11:06:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceImporterTexture : : get_singleton ( ) - > update_imports ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-15 21:23:21 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-30 15:34:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( requested_first_scan )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												requested_first_scan  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-08 12:52:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												OS : : get_singleton ( ) - > benchmark_begin_measure ( " Editor " ,  " First Scan " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-30 15:34:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( run_surface_upgrade_tool )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													run_surface_upgrade_tool  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													SurfaceUpgradeTool : : get_singleton ( ) - > connect ( " upgrade_finished " ,  callable_mp ( EditorFileSystem : : get_singleton ( ) ,  & EditorFileSystem : : scan ) ,  CONNECT_ONE_SHOT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													SurfaceUpgradeTool : : get_singleton ( ) - > finish_upgrade ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EditorFileSystem : : get_singleton ( ) - > scan ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_ENTER_TREE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-10 18:45:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > set_disable_node_threading ( true ) ;  // No node threading while running editor.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Engine : : get_singleton ( ) - > set_editor_hint ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-12 16:18:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-14 00:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Window  * window  =  get_window ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( window )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Handle macOS fullscreen and extend-to-title changes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												window - > connect ( " titlebar_changed " ,  callable_mp ( this ,  & EditorNode : : _titlebar_resized ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Theme has already been created in the constructor, so we can skip that step.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_theme ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > set_low_processor_usage_mode_sleep_usec ( int ( EDITOR_GET ( " interface/editor/low_processor_mode_sleep_usec " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-02 12:31:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > get_root ( ) - > set_as_audio_listener_3d ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > get_root ( ) - > set_as_audio_listener_2d ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 18:09:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > get_root ( ) - > set_snap_2d_transforms_to_pixel ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											get_tree ( ) - > get_root ( ) - > set_snap_2d_vertices_to_pixel ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > set_auto_accept_quit ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-25 16:45:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef ANDROID_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											get_tree ( ) - > set_quit_on_go_back ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2020-03-04 13:36:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_tree ( ) - > get_root ( ) - > connect ( " files_dropped " ,  callable_mp ( this ,  & EditorNode : : _dropped_files ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											command_palette - > register_shortcuts_as_command ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 15:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											callable_mp ( this ,  & EditorNode : : _begin_first_scan ) . call_deferred ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 10:13:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											last_dark_mode_state  =  DisplayServer : : get_singleton ( ) - > is_dark_mode ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											last_system_accent_color  =  DisplayServer : : get_singleton ( ) - > get_accent_color ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											last_system_base_color  =  DisplayServer : : get_singleton ( ) - > get_base_color ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DisplayServer : : get_singleton ( ) - > set_system_theme_change_callback ( callable_mp ( this ,  & EditorNode : : _check_system_theme_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-14 15:13:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-15 13:19:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_viewport ( ) - > connect ( " size_changed " ,  callable_mp ( this ,  & EditorNode : : _viewport_resized ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-13 16:21:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_EXIT_TREE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:56:46 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											singleton - > active_plugins . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-11 10:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( progress_dialog )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												progress_dialog - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( load_error_dialog )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												load_error_dialog - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( execute_output_dialog )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												execute_output_dialog - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( warning )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												warning - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( accept )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												accept - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( save_accept )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												save_accept - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_data . save_editor_external_data ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											FileAccess : : set_file_close_fail_notify_callback ( nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											log - > deinit ( ) ;  // Do not get messages anymore.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_data . clear_edited_scenes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-15 13:19:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											get_viewport ( ) - > disconnect ( " size_changed " ,  callable_mp ( this ,  & EditorNode : : _viewport_resized ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 11:00:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_READY :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 01:30:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											started_timestamp  =  Time : : get_singleton ( ) - > get_unix_time_from_system ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-15 16:08:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-30 23:17:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RenderingServer : : get_singleton ( ) - > viewport_set_disable_2d ( get_scene_root ( ) - > get_viewport_rid ( ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-29 16:04:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RenderingServer : : get_singleton ( ) - > viewport_set_environment_mode ( get_viewport ( ) - > get_viewport_rid ( ) ,  RenderingServer : : VIEWPORT_ENVIRONMENT_DISABLED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 03:44:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DisplayServer : : get_singleton ( ) - > screen_set_keep_on ( EDITOR_GET ( " interface/editor/keep_screen_on " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											feature_profile_manager - > notify_changed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-23 12:44:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Save the project after opening to mark it as last modified, except in headless mode.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( DisplayServer : : get_singleton ( ) - > window_can_draw ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ProjectSettings : : get_singleton ( ) - > save ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 14:10:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_titlebar_resized ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Set up a theme context for the 2D preview viewport using the stored preview theme.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											CanvasItemEditor : : ThemePreviewMode  theme_preview_mode  =  ( CanvasItemEditor : : ThemePreviewMode ) ( int ) EditorSettings : : get_singleton ( ) - > get_project_metadata ( " 2d_editor " ,  " theme_preview " ,  CanvasItemEditor : : THEME_PREVIEW_PROJECT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											update_preview_themes ( theme_preview_mode ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-29 20:47:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_APPLICATION_FOCUS_IN :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-11 15:39:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Restore the original FPS cap after focusing back on the editor.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > set_low_processor_usage_mode_sleep_usec ( int ( EDITOR_GET ( " interface/editor/low_processor_mode_sleep_usec " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorFileSystem : : get_singleton ( ) - > scan_changes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_scan_external_changes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-04 20:34:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											GDExtensionManager  * gdextension_manager  =  GDExtensionManager : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											callable_mp ( gdextension_manager ,  & GDExtensionManager : : reload_extensions ) . call_deferred ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-29 20:47:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_APPLICATION_FOCUS_OUT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-11 15:39:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Save on focus loss before applying the FPS limit to avoid slowing down the saving process.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( EDITOR_GET ( " interface/editor/save_on_focus_loss " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-04 14:22:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_menu_option_confirm ( FILE_SAVE_SCENE_SILENTLY ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-11 15:39:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Set a low FPS cap to decrease CPU/GPU usage while the editor is unfocused.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 16:57:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( unfocused_low_processor_usage_mode_enabled )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												OS : : get_singleton ( ) - > set_low_processor_usage_mode_sleep_usec ( int ( EDITOR_GET ( " interface/editor/unfocused_low_processor_mode_sleep_usec " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-04 13:36:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_WM_ABOUT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 19:46:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											show_about ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-04 13:36:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_WM_CLOSE_REQUEST :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_menu_option_confirm ( FILE_QUIT ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-29 23:12:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " filesystem/file_dialog " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												FileDialog : : set_default_show_hidden_files ( EDITOR_GET ( " filesystem/file_dialog/show_hidden_files " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EditorFileDialog : : set_default_show_hidden_files ( EDITOR_GET ( " filesystem/file_dialog/show_hidden_files " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EditorFileDialog : : set_default_display_mode ( ( EditorFileDialog : : DisplayMode ) EDITOR_GET ( " filesystem/file_dialog/display_mode " ) . operator  int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-15 22:34:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-12 07:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EDITOR_GET ( " interface/editor/import_resources_when_unfocused " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scan_changes_timer - > start ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scan_changes_timer - > stop ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-14 15:13:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											follow_system_theme  =  EDITOR_GET ( " interface/theme/follow_system_theme " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											use_system_accent_color  =  EDITOR_GET ( " interface/theme/use_system_accent_color " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 13:14:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EditorThemeManager : : is_generated_theme_outdated ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_update_theme ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_build_icon_type_cache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												recent_scenes - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-15 22:34:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-20 06:24:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " interface/editor/dock_tab_style " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_dock_manager - > update_tab_styles ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " interface/scene_tabs " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " docks/filesystem " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												HashSet < String >  updated_textfile_extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-05 12:12:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												HashSet < String >  updated_other_file_extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  extensions_match  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  Vector < String >  textfile_ext  =  ( ( String ) ( EDITOR_GET ( " docks/filesystem/textfile_extensions " ) ) ) . split ( " , " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( const  String  & E  :  textfile_ext )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													updated_textfile_extensions . insert ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( extensions_match  & &  ! textfile_extensions . has ( E ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														extensions_match  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-05 12:12:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  Vector < String >  other_file_ext  =  ( ( String ) ( EDITOR_GET ( " docks/filesystem/other_file_extensions " ) ) ) . split ( " , " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( const  String  & E  :  other_file_ext )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													updated_other_file_extensions . insert ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( extensions_match  & &  ! other_file_extensions . has ( E ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														extensions_match  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-25 23:04:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-05 12:12:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! extensions_match  | |  updated_textfile_extensions . size ( )  <  textfile_extensions . size ( )  | |  updated_other_file_extensions . size ( )  <  other_file_extensions . size ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													textfile_extensions  =  updated_textfile_extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-05 12:12:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													other_file_extensions  =  updated_other_file_extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													EditorFileSystem : : get_singleton ( ) - > scan ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:14:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " interface/editor " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_update_spinner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_vsync_mode ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 03:44:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												DisplayServer : : get_singleton ( ) - > screen_set_keep_on ( EDITOR_GET ( " interface/editor/keep_screen_on " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-08 22:16:55 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if defined(MODULE_GDSCRIPT_ENABLED) || defined(MODULE_MONO_ENABLED) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " text_editor/theme/highlighting " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EditorHelpHighlighter : : get_singleton ( ) - > reset_cache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2019-07-14 11:26:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 17:57:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_update_spinner ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-02-08 15:13:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									update_spinner - > set_visible ( ! RenderingServer : : get_singleton ( ) - > canvas_item_get_debug_redraw ( )  & &  _should_display_update_spinner ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  update_continuously  =  EDITOR_GET ( " interface/editor/update_continuously " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PopupMenu  * update_popup  =  update_spinner - > get_popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									update_popup - > set_item_checked ( update_popup - > get_item_index ( SETTINGS_UPDATE_CONTINUOUSLY ) ,  update_continuously ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									update_popup - > set_item_checked ( update_popup - > get_item_index ( SETTINGS_UPDATE_WHEN_CHANGED ) ,  ! update_continuously ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 17:22:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( update_continuously )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-25 12:42:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										update_spinner - > set_tooltip_text ( TTR ( " Spins when the editor window redraws. \n Update Continuously is enabled, which can increase power usage. Click to disable it. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 17:22:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Use a different color for the update spinner when Update Continuously is enabled,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// as this feature should only be enabled for troubleshooting purposes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Make the icon modulate color overbright because icons are not completely white on a dark theme.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// On a light theme, icons are dark, so we need to modulate them with an even brighter color.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-17 15:03:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  bool  dark_theme  =  EditorThemeManager : : is_dark_theme ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										update_spinner - > set_self_modulate ( theme - > get_color ( SNAME ( " error_color " ) ,  EditorStringName ( Editor ) )  *  ( dark_theme  ?  Color ( 1.1 ,  1.1 ,  1.1 )  :  Color ( 4.25 ,  4.25 ,  4.25 ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 17:22:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-25 12:42:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										update_spinner - > set_tooltip_text ( TTR ( " Spins when the editor window redraws. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 17:22:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										update_spinner - > set_self_modulate ( Color ( 1 ,  1 ,  1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									OS : : get_singleton ( ) - > set_low_processor_usage_mode ( ! update_continuously ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 01:30:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : init_plugins ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_initializing_plugins  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < String >  addons ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ProjectSettings : : get_singleton ( ) - > has_setting ( " editor_plugins/enabled " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										addons  =  GLOBAL_GET ( " editor_plugins/enabled " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  String  & addon  :  addons )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_addon_plugin_enabled ( addon ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_initializing_plugins  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! pending_addons . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorFileSystem : : get_singleton ( ) - > connect ( " script_classes_updated " ,  callable_mp ( this ,  & EditorNode : : _enable_pending_addons ) ,  CONNECT_ONE_SHOT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 10:34:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _on_plugin_ready ( Object  * p_script ,  const  String  & p_activate_name )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Script >  scr  =  Object : : cast_to < Script > ( p_script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( scr . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 10:34:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_settings_editor - > update_plugins ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									project_settings_editor - > hide ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									push_item ( scr . operator - > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-18 20:20:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_activate_name . length ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_addon_plugin_enabled ( p_activate_name ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 10:34:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-09 05:17:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _remove_plugin_from_enabled ( const  String  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ProjectSettings  * ps  =  ProjectSettings : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PackedStringArray  enabled_plugins  =  ps - > get ( " editor_plugins/enabled " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  enabled_plugins . size ( ) ;  + + i )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( enabled_plugins . get ( i )  = =  p_name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-03 16:17:03 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											enabled_plugins . remove_at ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-09 05:17:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ps - > set ( " editor_plugins/enabled " ,  enabled_plugins ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-06 15:35:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _plugin_over_edit ( EditorPlugin  * p_plugin ,  Object  * p_object )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_object )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_plugins_over - > add_plugin ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_plugin - > make_visible ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_plugin - > edit ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_plugins_over - > remove_plugin ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_plugin - > make_visible ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_plugin - > edit ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _plugin_over_self_own ( EditorPlugin  * p_plugin )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									active_plugins [ p_plugin - > get_instance_id ( ) ] . insert ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _resources_changed ( const  Vector < String >  & p_resources )  {  
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < Ref < Resource > >  changed ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc  =  p_resources . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  rc ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 13:46:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < Resource >  res  =  ResourceCache : : get_ref ( p_resources . get ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( res . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! res - > editor_can_reload_from_file ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 19:37:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-03 15:41:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! res - > get_path ( ) . is_resource_file ( )  & &  ! res - > get_path ( ) . is_absolute_path ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! FileAccess : : exists ( res - > get_path ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-10 03:41:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! res - > get_import_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// This is an imported resource, will be reloaded if reimported via the _resources_reimported() callback.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										changed . push_back ( res ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( changed . size ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 17:50:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( Ref < Resource >  & res  :  changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											res - > reload_from_file ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _fs_changed ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( FileDialog  * E  :  file_dialogs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										E - > invalidate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-20 21:47:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( EditorFileDialog  * E  :  editor_file_dialogs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										E - > invalidate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 00:37:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_mark_unsaved_scenes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// FIXME: Move this to a cleaner location, it's hacky to do this in _fs_changed.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  export_error ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 01:30:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// It's important to wait for the first scan to finish; otherwise, scripts or resources might not be imported.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! export_defer . preset . is_empty ( )  & &  ! EditorFileSystem : : get_singleton ( ) - > is_scanning ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  preset_name  =  export_defer . preset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Ensures export_project does not loop infinitely, because notifications may
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// come during the export.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										export_defer . preset  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < EditorExportPreset >  export_preset ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ;  + + i )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											export_preset  =  EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( export_preset - > get_name ( )  = =  preset_name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											export_preset . unref ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( export_preset . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 11:08:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < DirAccess >  da  =  DirAccess : : create ( DirAccess : : ACCESS_RESOURCES ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( da - > file_exists ( " res://export_presets.cfg " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												err  =  FAILED ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												export_error  =  vformat ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														" Invalid export preset name: %s. \n The following presets were detected in this project's `export_presets.cfg`: \n \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														preset_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ;  + + i )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Write the preset name between double quotes since it needs to be written between quotes on the command line if it contains spaces.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													export_error  + =  vformat ( "          \" %s \" \n " ,  EditorExport : : get_singleton ( ) - > get_export_preset ( i ) - > get_name ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												err  =  FAILED ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												export_error  =  " This project doesn't have an `export_presets.cfg` file at its root. \n Create an export preset from the  \" Project > Export \"  dialog and try again. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < EditorExportPlatform >  platform  =  export_preset - > get_platform ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  String  export_path  =  export_defer . path . is_empty ( )  ?  export_preset - > get_export_path ( )  :  export_defer . path ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( export_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												err  =  FAILED ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												export_error  =  vformat ( " Export preset  \" %s \"  doesn't have a default export path, and none was specified. " ,  preset_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-17 18:02:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( platform . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												err  =  FAILED ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												export_error  =  vformat ( " Export preset  \" %s \"  doesn't have a matching platform. " ,  preset_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-12 16:16:48 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												export_preset - > update_value_overrides ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 14:22:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( export_defer . pack_only )  {  // Only export .pck or .zip data pack.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-17 18:02:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( export_path . ends_with ( " .zip " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-17 12:48:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( export_defer . patch )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															err  =  platform - > export_zip_patch ( export_preset ,  export_defer . debug ,  export_path ,  export_defer . patches ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															err  =  platform - > export_zip ( export_preset ,  export_defer . debug ,  export_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-17 18:02:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  if  ( export_path . ends_with ( " .pck " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-17 12:48:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( export_defer . patch )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															err  =  platform - > export_pack_patch ( export_preset ,  export_defer . debug ,  export_path ,  export_defer . patches ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															err  =  platform - > export_pack ( export_preset ,  export_defer . debug ,  export_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-06 12:14:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ERR_PRINT ( vformat ( " Export path  \" %s \"  doesn't end with a supported extension. " ,  export_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err  =  FAILED ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  {  // Normal project export.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  config_error ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													bool  missing_templates ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 23:35:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( export_defer . android_build_template )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														export_template_manager - > install_android_template ( export_preset ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 23:35:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 14:01:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! platform - > can_export ( export_preset ,  config_error ,  missing_templates ,  export_defer . debug ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-06 01:44:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ERR_PRINT ( vformat ( " Cannot export project with preset  \" %s \"  due to configuration errors: \n %s " ,  preset_name ,  config_error ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err  =  missing_templates  ?  ERR_FILE_NOT_FOUND  :  ERR_UNCONFIGURED ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 18:34:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														platform - > clear_messages ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err  =  platform - > export_project ( export_preset ,  export_defer . debug ,  export_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-04 16:13:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 18:34:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													export_error  =  vformat ( " Project export for preset  \" %s \"  failed. " ,  preset_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  if  ( platform - > get_worst_message_type ( )  > =  EditorExportPlatform : : EXPORT_MESSAGE_WARNING )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													export_error  =  vformat ( " Project export for preset  \" %s \"  completed with warnings. " ,  preset_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_PRINT ( export_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-18 12:48:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_exit_editor ( EXIT_FAILURE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-07 01:00:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! export_error . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											WARN_PRINT ( export_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-07 13:29:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-10 23:39:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_exit_editor ( EXIT_SUCCESS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-30 16:39:09 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _resources_reimporting ( const  Vector < String >  & p_resources )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This will copy all the modified properties of the nodes into 'scenes_modification_table'
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// before they are actually reimported. It's important to do this before the reimportation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// because if a mesh is present in an inherited scene, the resource will be modified in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// the inherited scene. Then, get_modified_properties_for_node will return the mesh property,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// which will trigger a recopy of the previous mesh, preventing the reload.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scenes_modification_table . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scenes_reimported . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resources_reimported . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileSystem  * editor_file_system  =  EditorFileSystem : : get_singleton ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & res_path  :  p_resources )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// It's faster to use EditorFileSystem::get_file_type than fetching the resource type from disk.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This makes a big difference when reimporting many resources.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  file_type  =  editor_file_system - > get_file_type ( res_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( file_type . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											file_type  =  ResourceLoader : : get_resource_type ( res_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( file_type  = =  " PackedScene " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scenes_reimported . push_back ( res_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											resources_reimported . push_back ( res_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scenes_reimported . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										preload_reimporting_with_path_in_edited_scenes ( scenes_reimported ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 18:57:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _resources_reimported ( const  Vector < String >  & p_resources )  {  
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  current_tab  =  scene_tabs - > get_current_tab ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 18:57:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & res_path  :  resources_reimported )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ResourceCache : : has ( res_path ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Not loaded, no need to reload.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 18:57:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Reload normally.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < Resource >  resource  =  ResourceCache : : get_ref ( res_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 13:46:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( resource . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 18:57:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											resource - > reload_from_file ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-11 12:58:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Editor may crash when related animation is playing while re-importing GLTF scene, stop it in advance.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AnimationPlayer  * ap  =  AnimationPlayerEditor : : get_singleton ( ) - > get_player ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap  & &  scenes_reimported . size ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-11 12:58:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > stop ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  scenes_reimported )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reload_scene ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 18:57:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									reload_instances_with_path_in_edited_scenes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scenes_modification_table . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scenes_reimported . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resources_reimported . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_set_current_scene_nocheck ( current_tab ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-31 18:57:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _sources_changed ( bool  p_exist )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( waiting_for_first_scan )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 18:14:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										waiting_for_first_scan  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-08 12:52:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OS : : get_singleton ( ) - > benchmark_end_measure ( " Editor " ,  " First Scan " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-19 14:21:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 23:52:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Reload the global shader variables, but this time
 
							 
						 
					
						
							
								
									
										
										
											
												Fix various typos with codespell
Found via `codespell -q 3 -S ./thirdparty,*.po,./DONORS.md -L ackward,ang,ans,ba,beng,cas,childs,childrens,dof,doubleclick,fave,findn,hist,inout,leapyear,lod,nd,numer,ois,ony,paket,seeked,sinc,switchs,te,uint`
											 
										 
										
											2021-07-07 11:17:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// loading textures, as they are now properly imported.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-27 12:22:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										RenderingServer : : get_singleton ( ) - > global_shader_parameters_load_settings ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 23:52:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_load_editor_layout ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 11:00:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! defer_load_scene . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-08 12:52:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > benchmark_begin_measure ( " Editor " ,  " Load Scene " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											load_scene ( defer_load_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											defer_load_scene  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-19 14:21:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-08 12:52:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > benchmark_end_measure ( " Editor " ,  " Load Scene " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-13 11:24:12 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > benchmark_dump ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-30 15:34:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( SurfaceUpgradeTool : : get_singleton ( ) - > is_show_requested ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SurfaceUpgradeTool : : get_singleton ( ) - > show_popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-22 16:15:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Start preview thread now that it's safe.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! singleton - > cmdline_export_mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorResourcePreview : : get_singleton ( ) - > start ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _scan_external_changes ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									disk_changed_list - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TreeItem  * r  =  disk_changed_list - > create_item ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									disk_changed_list - > set_hide_root ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  need_reload  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Check if any edited scene has changed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 11:08:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < DirAccess >  da  =  DirAccess : : create ( DirAccess : : ACCESS_RESOURCES ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-26 23:18:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( editor_data . get_scene_path ( i )  = =  " "  | |  ! da - > file_exists ( editor_data . get_scene_path ( i ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uint64_t  last_date  =  editor_data . get_scene_modified_time ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uint64_t  date  =  FileAccess : : get_modified_time ( editor_data . get_scene_path ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( date  >  last_date )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TreeItem  * ti  =  disk_changed_list - > create_item ( r ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ti - > set_text ( 0 ,  editor_data . get_scene_path ( i ) . get_file ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											need_reload  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  project_settings_path  =  ProjectSettings : : get_singleton ( ) - > get_resource_path ( ) . path_join ( " project.godot " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-17 01:09:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( FileAccess : : get_modified_time ( project_settings_path )  >  ProjectSettings : : get_singleton ( ) - > get_last_saved_time ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										TreeItem  * ti  =  disk_changed_list - > create_item ( r ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_text ( 0 ,  " project.godot " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										need_reload  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( need_reload )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 15:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										callable_mp ( ( Window  * ) disk_changed ,  & Window : : popup_centered_ratio ) . call_deferred ( 0.3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _resave_scenes ( String  p_str )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									save_all_scenes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-17 01:09:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ProjectSettings : : get_singleton ( ) - > save ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									disk_changed - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _reload_modified_scenes ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  current_idx  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( editor_data . get_scene_path ( i )  = =  " " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uint64_t  last_date  =  editor_data . get_scene_modified_time ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uint64_t  date  =  FileAccess : : get_modified_time ( editor_data . get_scene_path ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( date  >  last_date )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  filename  =  editor_data . get_scene_path ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_data . set_edited_scene ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_remove_edited_scene ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 15:11:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Error  err  =  load_scene ( filename ,  false ,  false ,  false ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-17 01:09:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ERR_PRINT ( vformat ( " Failed to load scene: %s " ,  filename ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_data . move_edited_scene_to_index ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_set_current_scene ( current_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									disk_changed - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-17 01:09:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _reload_project_settings ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-01 11:38:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ProjectSettings : : get_singleton ( ) - > setup ( ProjectSettings : : get_singleton ( ) - > get_resource_path ( ) ,  String ( ) ,  true ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-17 01:09:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _vp_resized ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-15 13:19:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _viewport_resized ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Window  * w  =  get_window ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( w )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										was_window_windowed_last  =  w - > get_mode ( )  = =  Window : : MODE_WINDOWED ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _titlebar_resized ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DisplayServer : : get_singleton ( ) - > window_set_window_buttons_offset ( Vector2i ( title_bar - > get_global_position ( ) . y  +  title_bar - > get_size ( ) . y  /  2 ,  title_bar - > get_global_position ( ) . y  +  title_bar - > get_size ( ) . y  /  2 ) ,  DisplayServer : : MAIN_WINDOW_ID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-10 10:32:41 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  Vector3i  & margin  =  DisplayServer : : get_singleton ( ) - > window_get_safe_title_margins ( DisplayServer : : MAIN_WINDOW_ID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( left_menu_spacer )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  w  =  ( gui_base - > is_layout_rtl ( ) )  ?  margin . y  :  margin . x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										left_menu_spacer - > set_custom_minimum_size ( Size2 ( w ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( right_menu_spacer )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  w  =  ( gui_base - > is_layout_rtl ( ) )  ?  margin . x  :  margin . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										right_menu_spacer - > set_custom_minimum_size ( Size2 ( w ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( title_bar )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										title_bar - > set_custom_minimum_size ( Size2 ( 0 ,  margin . z  -  title_bar - > get_global_position ( ) . y ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-10 10:32:41 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-08 18:35:15 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_undo_redo_allowed ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorUndoRedoManager  * undo_redo  =  EditorUndoRedoManager : : get_singleton ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-08 18:35:15 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > set_item_disabled ( file_menu - > get_item_index ( EDIT_UNDO ) ,  ! undo_redo - > has_undo ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > set_item_disabled ( file_menu - > get_item_index ( EDIT_REDO ) ,  ! undo_redo - > has_redo ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _node_renamed ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( InspectorDock : : get_inspector_singleton ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > update_tree ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _open_command_palette ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									command_palette - > open_popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-02 04:44:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  EditorNode : : load_resource ( const  String  & p_resource ,  bool  p_ignore_broken_deps )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dependency_errors . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Resource >  res ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ResourceLoader : : exists ( p_resource ,  " " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										res  =  ResourceLoader : : load ( p_resource ,  " " ,  ResourceFormatLoader : : CACHE_MODE_REUSE ,  & err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( textfile_extensions . has ( p_resource . get_extension ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										res  =  ScriptEditor : : get_singleton ( ) - > open_file ( p_resource ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-05 12:12:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( other_file_extensions . has ( p_resource . get_extension ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										OS : : get_singleton ( ) - > shell_open ( ProjectSettings : : get_singleton ( ) - > globalize_path ( p_resource ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( ! res . is_valid ( ) ,  ERR_CANT_OPEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-02 04:44:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_ignore_broken_deps  & &  dependency_errors . has ( p_resource ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector < String >  errors ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  String  & E  :  dependency_errors [ p_resource ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											errors . push_back ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-02 04:44:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dependency_error - > show ( DependencyErrorDialog : : MODE_RESOURCE ,  p_resource ,  errors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dependency_errors . erase ( p_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_FILE_MISSING_DEPENDENCIES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									InspectorDock : : get_singleton ( ) - > edit_resource ( res ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : edit_node ( Node  * p_node )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									push_item ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-19 12:45:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : edit_resource ( const  Ref < Resource >  & p_resource )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									InspectorDock : : get_singleton ( ) - > edit_resource ( p_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_resource_in_path ( const  Ref < Resource >  & p_resource ,  const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . apply_changes_in_editors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:46:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( saving_resources_in_path . has ( p_resource ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									saving_resources_in_path . insert ( p_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  flg  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EDITOR_GET ( " filesystem/on_save/compress_binary_resources " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										flg  | =  ResourceSaver : : FLAG_COMPRESS ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 17:00:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  path  =  ProjectSettings : : get_singleton ( ) - > localize_path ( p_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 01:33:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  ResourceSaver : : save ( p_resource ,  path ,  flg  |  ResourceSaver : : FLAG_REPLACE_SUBRESOURCE_PATHS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 11:06:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ResourceLoader : : is_imported ( p_resource - > get_path ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											show_accept ( TTR ( " Imported resources can't be saved. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											show_accept ( TTR ( " Error saving resource! " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:46:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										saving_resources_in_path . erase ( p_resource ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									( ( Resource  * ) p_resource . ptr ( ) ) - > set_path ( path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:46:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									saving_resources_in_path . erase ( p_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_resource_saved ( p_resource ,  path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-17 18:22:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									emit_signal ( SNAME ( " resource_saved " ) ,  p_resource ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-12 15:43:29 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . notify_resource_saved ( p_resource ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_resource ( const  Ref < Resource >  & p_resource )  {  
						 
					
						
							
								
									
										
										
										
											2023-11-08 21:08:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// If built-in resource, save the scene instead.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_resource - > is_built_in ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  String  scene_path  =  p_resource - > get_path ( ) . get_slice ( " :: " ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! scene_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-02 12:53:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ResourceLoader : : exists ( scene_path )  & &  ResourceLoader : : get_resource_type ( scene_path )  = =  " PackedScene " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												save_scene_if_open ( scene_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Not a packed scene, so save it as regular resource.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < Resource >  parent_resource  =  ResourceCache : : get_ref ( scene_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_FAIL_COND_MSG ( parent_resource . is_null ( ) ,  " Parent resource not loaded, can't save. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												save_resource ( parent_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 21:08:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// If the resource has been imported, ask the user to use a different path in order to save it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  path  =  p_resource - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( path . is_resource_file ( )  & &  ! FileAccess : : exists ( path  +  " .import " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_resource_in_path ( p_resource ,  p_resource - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										save_resource_as ( p_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_resource_as ( const  Ref < Resource >  & p_resource ,  const  String  & p_at_path )  {  
						 
					
						
							
								
									
										
										
										
											2019-03-04 11:06:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  path  =  p_resource - > get_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! path . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  srpos  =  path . find ( " :: " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( srpos  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  base  =  path . substr ( 0 ,  srpos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! get_edited_scene ( )  | |  get_edited_scene ( ) - > get_scene_file_path ( )  ! =  base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													show_warning ( TTR ( " This resource can't be saved because it does not belong to the edited scene. Make it unique first. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-17 13:55:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( FileAccess : : exists ( path  +  " .import " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											show_warning ( TTR ( " This resource can't be saved because it was imported from another file. Make it unique first. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 11:06:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file - > set_file_mode ( EditorFileDialog : : FILE_MODE_SAVE_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-18 15:17:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									saving_resource  =  p_resource ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current_menu_option  =  RESOURCE_SAVE_AS ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < String >  extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < PackedScene >  sd  =  memnew ( PackedScene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ResourceSaver : : get_recognized_extensions ( p_resource ,  & extensions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file - > clear_filters ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 13:12:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < String >  preferred ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  extensions )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_resource - > is_class ( " Script " )  & &  ( E  = =  " tres "  | |  E  = =  " res " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// This serves no purpose and confused people.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 13:12:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-04 16:26:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file - > add_filter ( " *. "  +  E ,  E . to_upper ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										preferred . push_back ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-13 02:37:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Lowest priority extension.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-13 02:37:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < String > : : Element  * res_element  =  preferred . find ( " res " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( res_element )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										preferred . move_to_back ( res_element ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Highest priority extension.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-13 02:37:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < String > : : Element  * tres_element  =  preferred . find ( " tres " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tres_element )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										preferred . move_to_front ( tres_element ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_at_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file - > set_current_dir ( p_at_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_resource - > get_path ( ) . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											file - > set_current_file ( p_resource - > get_path ( ) . get_file ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-03 22:54:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! preferred . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-30 12:36:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												String  resource_name_snake_case  =  p_resource - > get_class ( ) . to_snake_case ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-29 20:42:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												file - > set_current_file ( " new_ "  +  resource_name_snake_case  +  " . "  +  preferred . front ( ) - > get ( ) . to_lower ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												file - > set_current_file ( String ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( ! p_resource - > get_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file - > set_current_path ( p_resource - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-03 22:54:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! extensions . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  String  ext  =  p_resource - > get_path ( ) . get_extension ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( extensions . find ( ext )  = =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												file - > set_current_path ( p_resource - > get_path ( ) . replacen ( " . "  +  ext ,  " . "  +  extensions . front ( ) - > get ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-03 22:54:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( ! preferred . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  String  resource_name_snake_case  =  p_resource - > get_class ( ) . to_snake_case ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  String  existing  =  " new_ "  +  resource_name_snake_case  +  " . "  +  preferred . front ( ) - > get ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file - > set_current_path ( existing ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-22 19:36:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file - > set_title ( TTR ( " Save Resource As... " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-11 18:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file - > popup_file_dialog ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-12 22:17:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : ensure_uid_file ( const  String  & p_new_resource_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ResourceLoader : : exists ( p_new_resource_path )  & &  ! ResourceLoader : : has_custom_uid_support ( p_new_resource_path )  & &  ! FileAccess : : exists ( p_new_resource_path  +  " .uid " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < FileAccess >  f  =  FileAccess : : open ( p_new_resource_path  +  " .uid " ,  FileAccess : : WRITE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( f . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  ResourceUID : : ID  id  =  ResourceUID : : get_singleton ( ) - > create_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											f - > store_line ( ResourceUID : : get_singleton ( ) - > id_to_text ( id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _menu_option ( int  p_option )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_menu_option_confirm ( p_option ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _menu_confirm_current ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_menu_option_confirm ( current_menu_option ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : trigger_menu_option ( int  p_option ,  bool  p_confirmed )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_menu_option_confirm ( p_option ,  p_confirmed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _dialog_display_save_error ( String  p_file ,  Error  p_error )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( p_error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										switch  ( p_error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											case  ERR_FILE_CANT_WRITE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( TTR ( " Can't open file for writing: " )  +  "   "  +  p_file . get_extension ( ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  ERR_FILE_UNRECOGNIZED :  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( TTR ( " Requested file format unknown: " )  +  "   "  +  p_file . get_extension ( ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default :  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( TTR ( " Error while saving. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _dialog_display_load_error ( String  p_file ,  Error  p_error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( p_error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  ERR_CANT_OPEN :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-08 13:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( vformat ( TTR ( " Can't open file '%s'. The file could have been moved or deleted. " ) ,  p_file . get_file ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  ERR_PARSE_ERROR :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-08 13:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( vformat ( TTR ( " Error while parsing file '%s'. " ) ,  p_file . get_file ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  ERR_FILE_CORRUPT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-08 13:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( vformat ( TTR ( " Scene file '%s' appears to be invalid/corrupt. " ) ,  p_file . get_file ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  ERR_FILE_NOT_FOUND :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-12 10:36:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( vformat ( TTR ( " Missing file '%s' or one of its dependencies. " ) ,  p_file . get_file ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 11:42:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  ERR_FILE_UNRECOGNIZED :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												show_accept ( vformat ( TTR ( " File '%s' is saved in a format that is newer than the formats supported by this version of Godot, so it can't be opened. " ) ,  p_file . get_file ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											default :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-08 13:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( vformat ( TTR ( " Error while loading file '%s'. " ) ,  p_file . get_file ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _load_editor_plugin_states_from_config ( const  Ref < ConfigFile >  & p_config_file )  {  
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < String >  esl ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_config_file - > get_section_keys ( " editor_states " ,  & esl ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Dictionary  md ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  esl )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Variant  st  =  p_config_file - > get_value ( " editor_states " ,  E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-20 08:09:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( st . get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											md [ E ]  =  st ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . set_editor_plugin_states ( md ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_editor_states ( const  String  & p_file ,  int  p_idx )  {  
						 
					
						
							
								
									
										
										
										
											2016-06-26 00:54:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * scene  =  editor_data . get_edited_scene_root ( p_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  path  =  EditorPaths : : get_singleton ( ) - > get_project_settings_dir ( ) . path_join ( p_file . get_file ( )  +  " -editstate- "  +  p_file . md5_text ( )  +  " .cfg " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < ConfigFile >  cf ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cf . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-17 16:59:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Dictionary  md ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_idx  <  0  | |  editor_data . get_edited_scene ( )  = =  p_idx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										md  =  editor_data . get_editor_plugin_states ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-17 16:59:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										md  =  editor_data . get_scene_editor_states ( p_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < Variant >  keys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									md . get_key_list ( & keys ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  Variant  & E  :  keys )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cf - > set_value ( " editor_states " ,  E ,  md [ E ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Save the currently selected nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < Node  * >  selection  =  editor_selection - > get_full_selected_node_list ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TypedArray < NodePath >  selection_paths ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Node  * selected_node  :  selection )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										selection_paths . push_back ( selected_node - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cf - > set_value ( " editor_states " ,  " selected_nodes " ,  selection_paths ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-31 00:31:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  cf - > save ( path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-25 10:28:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( err  ! =  OK ,  " Cannot save config file to ' "  +  path  +  " '. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : _find_and_save_resource ( Ref < Resource >  p_res ,  HashMap < Ref < Resource > ,  bool >  & processed ,  int32_t  flags )  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_res . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( processed . has ( p_res ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  processed [ p_res ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  changed  =  p_res - > is_edited ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_res - > set_edited ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  subchanged  =  _find_and_save_edited_subresources ( p_res . ptr ( ) ,  processed ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_res - > get_path ( ) . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( changed  | |  subchanged )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 01:33:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceSaver : : save ( p_res ,  p_res - > get_path ( ) ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										processed [ p_res ]  =  false ;  // Because it's a file.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										processed [ p_res ]  =  changed ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  changed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : _find_and_save_edited_subresources ( Object  * obj ,  HashMap < Ref < Resource > ,  bool >  & processed ,  int32_t  flags )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  ret_changed  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									List < PropertyInfo >  pi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									obj - > get_property_list ( & pi ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  PropertyInfo  & E  :  pi )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ( E . usage  &  PROPERTY_USAGE_STORAGE ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										switch  ( E . type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											case  Variant : : OBJECT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Ref < Resource >  res  =  obj - > get ( E . name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( _find_and_save_resource ( res ,  processed ,  flags ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ret_changed  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : ARRAY :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Array  varray  =  obj - > get ( E . name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  len  =  varray . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  len ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-10 05:13:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  Variant  & v  =  varray . get ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Ref < Resource >  res  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( _find_and_save_resource ( res ,  processed ,  flags ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ret_changed  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : DICTIONARY :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Dictionary  d  =  obj - > get ( E . name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												List < Variant >  keys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												d . get_key_list ( & keys ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( const  Variant  & F  :  keys )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Variant  v  =  d [ F ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Ref < Resource >  res  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( _find_and_save_resource ( res ,  processed ,  flags ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ret_changed  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 13:11:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 17:08:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											default :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ret_changed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_edited_subresources ( Node  * scene ,  HashMap < Ref < Resource > ,  bool >  & processed ,  int32_t  flags )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_find_and_save_edited_subresources ( scene ,  processed ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  scene - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										Node  * n  =  scene - > get_child ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( n - > get_owner ( )  ! =  editor_data . get_edited_scene_root ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_save_edited_subresources ( n ,  processed ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _find_node_types ( Node  * p_node ,  int  & count_2d ,  int  & count_3d )  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_node - > is_class ( " Viewport " )  | |  ( p_node  ! =  editor_data . get_edited_scene_root ( )  & &  p_node - > get_owner ( )  ! =  editor_data . get_edited_scene_root ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_node - > is_class ( " CanvasItem " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										count_2d + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( p_node - > is_class ( " Node3D " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										count_3d + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_find_node_types ( p_node - > get_child ( i ) ,  count_2d ,  count_3d ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-11 21:48:00 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_scene_with_preview ( String  p_file ,  int  p_idx )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_scene_progress  =  memnew ( EditorProgress ( " save " ,  TTR ( " Saving Scene " ) ,  4 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( editor_data . get_edited_scene_root ( )  ! =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_scene_progress - > step ( TTR ( " Analyzing " ) ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  c2d  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  c3d  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-09 00:23:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_find_node_types ( editor_data . get_edited_scene_root ( ) ,  c2d ,  c3d ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_scene_progress - > step ( TTR ( " Creating Thumbnail " ) ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Current view?
 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-27 13:39:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < Image >  img ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 18:55:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// If neither 3D or 2D nodes are present, make a 1x1 black texture.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// We cannot fallback on the 2D editor, because it may not have been used yet,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// which would result in an invalid texture.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( c3d  = =  0  & &  c2d  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											img . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 20:06:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											img - > initialize_data ( 1 ,  1 ,  false ,  Image : : FORMAT_RGB8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 18:55:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( c3d  <  c2d )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-27 16:49:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < ViewportTexture >  viewport_texture  =  scene_root - > get_texture ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( viewport_texture - > get_width ( )  >  0  & &  viewport_texture - > get_height ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-28 12:32:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												img  =  viewport_texture - > get_image ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-27 16:49:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 18:55:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// The 3D editor may be disabled as a feature, but scenes can still be opened.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// This check prevents the preview from regenerating in case those scenes are then saved.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-19 20:54:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// The preview will be generated if no feature profile is set (as the 3D editor is enabled by default).
 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 18:55:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < EditorFeatureProfile >  profile  =  feature_profile_manager - > get_current_profile ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-19 20:54:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! profile . is_valid ( )  | |  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_3D ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-28 12:32:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												img  =  Node3DEditor : : get_singleton ( ) - > get_editor_viewport ( 0 ) - > get_viewport_node ( ) - > get_texture ( ) - > get_image ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 18:55:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-27 13:39:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-27 16:49:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( img . is_valid ( )  & &  img - > get_width ( )  >  0  & &  img - > get_height ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											img  =  img - > duplicate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											save_scene_progress - > step ( TTR ( " Creating Thumbnail " ) ,  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  preview_size  =  EDITOR_GET ( " filesystem/file_dialog/thumbnail_size " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											preview_size  * =  EDSCALE ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Consider a square region.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  vp_size  =  MIN ( img - > get_width ( ) ,  img - > get_height ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  x  =  ( img - > get_width ( )  -  vp_size )  /  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  y  =  ( img - > get_height ( )  -  vp_size )  /  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:42:14 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( vp_size  <  preview_size )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Just square it.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												img - > crop_from_point ( x ,  y ,  vp_size ,  vp_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  ratio  =  vp_size  /  preview_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  size  =  preview_size  *  MAX ( 1 ,  ratio  /  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												x  =  ( img - > get_width ( )  -  size )  /  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												y  =  ( img - > get_height ( )  -  size )  /  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												img - > crop_from_point ( x ,  y ,  size ,  size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												img - > resize ( preview_size ,  preview_size ,  Image : : INTERPOLATE_LANCZOS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											img - > convert ( Image : : FORMAT_RGB8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Save thumbnail directly, as thumbnailer may not update due to actual scene not changing md5.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-24 21:25:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  temp_path  =  EditorPaths : : get_singleton ( ) - > get_cache_dir ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  cache_base  =  ProjectSettings : : get_singleton ( ) - > globalize_path ( p_file ) . md5_text ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cache_base  =  temp_path . path_join ( " resthumb- "  +  cache_base ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-09 00:23:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Does not have it, try to load a cached thumbnail.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											post_process_preview ( img ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											img - > save_png ( cache_base  +  " .png " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-26 09:15:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-09 00:23:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_scene_progress - > step ( TTR ( " Saving Scene " ) ,  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-11 21:48:00 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_scene ( p_file ,  p_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 11:32:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! singleton - > cmdline_export_mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorResourcePreview : : get_singleton ( ) - > check_for_invalidation ( p_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_close_save_scene_progress ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _close_save_scene_progress ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memdelete_notnull ( save_scene_progress ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									save_scene_progress  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-27 18:56:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : _validate_scene_recursive ( const  String  & p_filename ,  Node  * p_node )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * child  =  p_node - > get_child ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( child - > get_scene_file_path ( )  = =  p_filename )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-27 18:56:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( _validate_scene_recursive ( p_filename ,  child ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-29 16:19:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  EditorNode : : _save_external_resources ( bool  p_also_save_external_data )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Save external resources and its subresources if any was modified.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  flg  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EDITOR_GET ( " filesystem/on_save/compress_binary_resources " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										flg  | =  ResourceSaver : : FLAG_COMPRESS ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flg  | =  ResourceSaver : : FLAG_REPLACE_SUBRESOURCE_PATHS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 19:03:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashSet < String >  edited_resources ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  saved  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < Ref < Resource > >  cached ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceCache : : get_cached_resources ( & cached ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 19:03:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Ref < Resource >  res  :  cached )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! res - > is_edited ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 19:03:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  path  =  res - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( path . begins_with ( " res:// " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  subres_pos  =  path . find ( " :: " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( subres_pos  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Actual resource.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												edited_resources . insert ( path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												edited_resources . insert ( path . substr ( 0 ,  subres_pos ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										res - > set_edited ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 19:03:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  edited_resources )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-27 14:02:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < Resource >  res  =  ResourceCache : : get_ref ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 19:03:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! res . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ;  // Maybe it was erased in a thread, who knows.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < PackedScene >  ps  =  res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ps . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ;  // Do not save PackedScenes, this will mess up the editor.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 01:33:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceSaver : : save ( res ,  res - > get_path ( ) ,  flg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 19:03:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										saved + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-29 16:19:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_also_save_external_data )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  editor_data . get_editor_plugin_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorPlugin  * plugin  =  editor_data . get_editor_plugin ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! plugin - > get_unsaved_status ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												plugin - > save_external_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												saved + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorUndoRedoManager : : get_singleton ( ) - > set_history_as_saved ( EditorUndoRedoManager : : GLOBAL_HISTORY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  saved ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-21 00:34:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  _reset_animation_mixers ( Node  * p_node ,  List < Pair < AnimationMixer  * ,  Ref < AnimatedValuesBackup > > >  * r_anim_backups )  {  
						 
					
						
							
								
									
										
										
										
											2020-12-20 11:46:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-21 00:34:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										AnimationMixer  * mixer  =  Object : : cast_to < AnimationMixer > ( p_node - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-31 01:20:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( mixer  & &  mixer - > is_active ( )  & &  mixer - > is_reset_on_save_enabled ( )  & &  mixer - > can_apply_reset ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											AnimationTree  * tree  =  Object : : cast_to < AnimationTree > ( p_node - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( tree )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												AnimationPlayer  * player  =  Object : : cast_to < AnimationPlayer > ( tree - > get_node_or_null ( tree - > get_animation_player ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( player  & &  player - > is_active ( )  & &  player - > is_reset_on_save_enabled ( )  & &  player - > can_apply_reset ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													continue ;  // Avoid to process reset/restore many times.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-21 00:34:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < AnimatedValuesBackup >  backup  =  mixer - > apply_reset ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( backup . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Pair < AnimationMixer  * ,  Ref < AnimatedValuesBackup > >  pair ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pair . first  =  mixer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pair . second  =  backup ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_anim_backups - > push_back ( pair ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-12 10:53:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-20 11:46:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-21 00:34:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_reset_animation_mixers ( p_node - > get_child ( i ) ,  r_anim_backups ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-20 11:46:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-26 00:54:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_scene ( String  p_file ,  int  idx )  {  
						 
					
						
							
								
									
										
										
										
											2023-11-22 17:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( ! saving_scene . is_empty ( )  & &  saving_scene  = =  p_file ,  " Scene saved while already being saved! " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 21:57:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-26 00:54:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * scene  =  editor_data . get_edited_scene_root ( idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										show_accept ( TTR ( " This operation can't be done without a tree root. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! scene - > get_scene_file_path ( ) . is_empty ( )  & &  _validate_scene_recursive ( scene - > get_scene_file_path ( ) ,  scene ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-16 00:13:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										show_accept ( TTR ( " This scene can't be saved because there is a cyclic instance inclusion. \n Please resolve it and then attempt to save again. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-27 18:56:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												New and improved IK system for Skeleton2D
This PR and commit adds a new IK system for 2D with the Skeleton2D node
that adds several new IK solvers, a way to control bones in a Skeleton2D
node similar to that in Skeleton3D. It also adds additional changes
and functionality.
This work was sponsored by GSoC 2020 and TwistedTwigleg.
Full list of changes:
* Adds a SkeletonModifier2D resource
  * This resource is the base where all IK code is written and executed
  * Has a function for clamping angles, since it is so commonly used
  * Modifiers are unique when duplicated so it works with instancing
* Adds a SkeletonModifierStack2D resource
  * This resource manages a series of SkeletonModification2Ds
  * This is what the Skeleton2D directly interfaces with to make IK possible
* Adds SkeletonModifier2D resources for LookAt, CCDIK, FABRIK, Jiggle, and TwoBoneIK
  * Each modification is in its own file
  * There is also a SkeletonModifier2D resource that acts as a stack for using multiple stacks together
* Adds a PhysicalBone2D node
  * Works similar to the PhysicalBone3D node, but uses a RigidBody2D node
* Changes to Skeleton2D listed below:
  * Skeleton2D now holds a single SkeletonModificationStack2D for IK
  * Skeleton2D now has a local_pose_override, which overrides the Bone2D position similar to how the overrides work in Skeleton3D
* Changes to Bone2D listed below:
  * The default_length property has been changed to length. Length is the length of the bone to its child bone node
  * New bone_angle property, which is the angle the bone has to its first child bone node
  * Bone2D caches its transform when not modified by IK for IK interpolation purposes
  * Bone2D draws its own editor gizmo, though this is stated to change in the future
* Changes to CanvasItemEditor listed below:
  * Bone2D gizmo drawing code removed
  * The 2D IK code is removed. Now Bone2D is the only bone system for 2D
* Transform2D now has a looking_at function for rotating to face a position
* Two new node notifications: NOTIFICATION_EDITOR_PRE_SAVE and NOTIFICATION_EDITOR_POST_SAVE
  * These notifications only are called in the editor right before and after saving a scene
  * Needed for not saving the IK position when executing IK in the editor
* Documentation for all the changes listed above.
											 
										 
										
											2020-08-03 14:02:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene - > propagate_notification ( NOTIFICATION_EDITOR_PRE_SAVE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									editor_data . apply_changes_in_editors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-21 00:34:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < Pair < AnimationMixer  * ,  Ref < AnimatedValuesBackup > > >  anim_backups ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_reset_animation_mixers ( scene ,  & anim_backups ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_default_environment ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_editor_states ( p_file ,  idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-13 20:39:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < PackedScene >  sdata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ResourceCache : : has ( p_file ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Something may be referencing this resource and we are good with that.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// We must update it, but also let the previous scene state go, as
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// old version still work for referencing changes in instantiated or inherited scenes.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-13 20:39:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 13:46:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sdata  =  ResourceCache : : get_ref ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( sdata . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-13 20:39:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											sdata - > recreate_state ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											sdata . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-13 20:39:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sdata . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-13 20:39:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Error  err  =  sdata - > pack ( scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										show_accept ( TTR ( " Couldn't save scene. Likely dependencies (instances or inheritance) couldn't be satisfied. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  flg  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EDITOR_GET ( " filesystem/on_save/compress_binary_resources " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										flg  | =  ResourceSaver : : FLAG_COMPRESS ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flg  | =  ResourceSaver : : FLAG_REPLACE_SUBRESOURCE_PATHS ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 01:33:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  =  ResourceSaver : : save ( sdata ,  p_file ,  flg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-26 23:48:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-06 02:15:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// This needs to be emitted before saving external resources.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									emit_signal ( SNAME ( " scene_saved " ) ,  p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-18 13:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . notify_scene_saved ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-01 17:44:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-06 02:15:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_external_resources ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 21:57:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									saving_scene  =  p_file ;  // Some editors may save scenes of built-in resources as external data, so avoid saving this scene again.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									editor_data . save_editor_external_data ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 21:57:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									saving_scene  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-20 11:46:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-21 00:34:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( Pair < AnimationMixer  * ,  Ref < AnimatedValuesBackup > >  & E  :  anim_backups )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										E . first - > restore ( E . second ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-20 11:46:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  = =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scene - > set_scene_file_path ( ProjectSettings : : get_singleton ( ) - > localize_path ( p_file ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_data . set_scene_as_saved ( idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_data . set_scene_modified_time ( idx ,  FileAccess : : get_modified_time ( p_file ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 16:36:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_folding . save_scene_folding ( scene ,  p_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										_update_title ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_dialog_display_save_error ( p_file ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
											 
										
											
												New and improved IK system for Skeleton2D
This PR and commit adds a new IK system for 2D with the Skeleton2D node
that adds several new IK solvers, a way to control bones in a Skeleton2D
node similar to that in Skeleton3D. It also adds additional changes
and functionality.
This work was sponsored by GSoC 2020 and TwistedTwigleg.
Full list of changes:
* Adds a SkeletonModifier2D resource
  * This resource is the base where all IK code is written and executed
  * Has a function for clamping angles, since it is so commonly used
  * Modifiers are unique when duplicated so it works with instancing
* Adds a SkeletonModifierStack2D resource
  * This resource manages a series of SkeletonModification2Ds
  * This is what the Skeleton2D directly interfaces with to make IK possible
* Adds SkeletonModifier2D resources for LookAt, CCDIK, FABRIK, Jiggle, and TwoBoneIK
  * Each modification is in its own file
  * There is also a SkeletonModifier2D resource that acts as a stack for using multiple stacks together
* Adds a PhysicalBone2D node
  * Works similar to the PhysicalBone3D node, but uses a RigidBody2D node
* Changes to Skeleton2D listed below:
  * Skeleton2D now holds a single SkeletonModificationStack2D for IK
  * Skeleton2D now has a local_pose_override, which overrides the Bone2D position similar to how the overrides work in Skeleton3D
* Changes to Bone2D listed below:
  * The default_length property has been changed to length. Length is the length of the bone to its child bone node
  * New bone_angle property, which is the angle the bone has to its first child bone node
  * Bone2D caches its transform when not modified by IK for IK interpolation purposes
  * Bone2D draws its own editor gizmo, though this is stated to change in the future
* Changes to CanvasItemEditor listed below:
  * Bone2D gizmo drawing code removed
  * The 2D IK code is removed. Now Bone2D is the only bone system for 2D
* Transform2D now has a looking_at function for rotating to face a position
* Two new node notifications: NOTIFICATION_EDITOR_PRE_SAVE and NOTIFICATION_EDITOR_POST_SAVE
  * These notifications only are called in the editor right before and after saving a scene
  * Needed for not saving the IK position when executing IK in the editor
* Documentation for all the changes listed above.
											 
										 
										
											2020-08-03 14:02:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene - > propagate_notification ( NOTIFICATION_EDITOR_POST_SAVE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-25 17:23:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_all_scenes ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_run_bar - > stop_playing ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_all_scenes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-25 17:23:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-25 16:16:38 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_scene_if_open ( const  String  & p_scene_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  idx  =  editor_data . get_edited_scene_from_path ( p_scene_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( idx  > =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_save_scene ( p_scene_path ,  idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : save_scene_list ( const  HashSet < String >  & p_scene_paths )  {  
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * scene  =  editor_data . get_edited_scene_root ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-25 16:16:38 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scene  & &  p_scene_paths . has ( scene - > get_scene_file_path ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_save_scene ( scene - > get_scene_file_path ( ) ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_before_run ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current_menu_option  =  FILE_SAVE_AND_RUN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_menu_option_confirm ( FILE_SAVE_AS_SCENE ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file - > set_title ( TTR ( " Save scene before running... " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : try_autosave ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! bool ( EDITOR_GET ( " run/auto_save/save_before_running " ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unsaved_cache )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( scene  & &  ! scene - > get_scene_file_path ( ) . is_empty ( ) )  {  // Only autosave if there is a scene and if it has a path.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_save_scene_with_preview ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_menu_option ( FILE_SAVE_ALL_SCENES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_data . save_editor_external_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:31:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : restart_editor ( bool  p_goto_project_manager )  {  
						 
					
						
							
								
									
										
										
										
											2019-01-25 17:23:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									exiting  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( project_run_bar - > is_playing ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_run_bar - > stop_playing ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-17 03:20:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  to_reopen ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:31:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_goto_project_manager  & &  get_tree ( ) - > get_edited_scene_root ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										to_reopen  =  get_tree ( ) - > get_edited_scene_root ( ) - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-18 12:48:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_exit_editor ( EXIT_SUCCESS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < String >  args ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 21:52:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & a  :  Main : : get_forwardable_cli_arguments ( Main : : CLI_SCOPE_TOOL ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										args . push_back ( a ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:31:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_goto_project_manager )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										args . push_back ( " --project-manager " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										args . push_back ( " --path " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										args . push_back ( ProjectSettings : : get_singleton ( ) - > get_resource_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-26 19:07:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:31:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										args . push_back ( " -e " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-26 19:07:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! to_reopen . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										args . push_back ( to_reopen ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									OS : : get_singleton ( ) - > set_restart_on_exit ( true ,  args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_all_scenes ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-10-12 10:14:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  all_saved  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-29 08:38:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * scene  =  editor_data . get_edited_scene_root ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-12 10:14:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! scene - > get_scene_file_path ( ) . is_empty ( )  & &  DirAccess : : exists ( scene - > get_scene_file_path ( ) . get_base_dir ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-12 10:14:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( i  ! =  editor_data . get_edited_scene ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_save_scene ( scene - > get_scene_file_path ( ) ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_save_scene_with_preview ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( ! scene - > get_scene_file_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-12 10:14:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												all_saved  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-12 10:14:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! all_saved )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										show_warning ( TTR ( " Could not save one or more scenes! " ) ,  TTR ( " Save All Scenes " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_default_environment ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 00:37:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _mark_unsaved_scenes ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * node  =  editor_data . get_edited_scene_root ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 00:37:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 00:37:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  path  =  node - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! path . is_empty ( )  & &  ! FileAccess : : exists ( path ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Mark scene tab as unsaved if the file is gone.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorUndoRedoManager : : get_singleton ( ) - > set_history_as_unsaved ( editor_data . get_scene_history_id ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 00:37:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_title ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 00:37:54 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _dialog_action ( String  p_file )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( current_menu_option )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_NEW_INHERITED_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 03:12:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If the previous scene is rootless, just close it in favor of the new one.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-31 02:08:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_menu_option_confirm ( FILE_CLOSE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 03:12:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											load_scene ( p_file ,  false ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_OPEN_SCENE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											load_scene ( p_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_PICK_MAIN_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ProjectSettings : : get_singleton ( ) - > set ( " application/run/main_scene " ,  ResourceUID : : path_to_uid ( p_file ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 17:00:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ProjectSettings : : get_singleton ( ) - > save ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// TODO: Would be nice to show the project manager opened with the highlighted field.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 02:08:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											project_run_bar - > play_main_scene ( ( bool ) pick_main_scene - > get_meta ( " from_native " ,  false ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_CLOSE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SCENE_TAB_CLOSE : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_SAVE_SCENE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_SAVE_AS_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  scene_idx  =  ( current_menu_option  = =  FILE_SAVE_SCENE  | |  current_menu_option  = =  FILE_SAVE_AS_SCENE )  ?  - 1  :  tab_closing_idx ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( file - > get_file_mode ( )  = =  EditorFileDialog : : FILE_MODE_SAVE_FILE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-07 15:54:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  same_open_scene  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( editor_data . get_scene_path ( i )  = =  p_file  & &  i  ! =  scene_idx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-07 15:54:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														same_open_scene  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-07 15:54:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( same_open_scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													show_warning ( TTR ( " Can't overwrite scene that is still open! " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												save_default_environment ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-11 21:48:00 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_save_scene_with_preview ( p_file ,  scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_add_to_recent_scenes ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												save_editor_layout_delayed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( scene_idx  ! =  - 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													_discard_changes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-29 15:38:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Update the path of the edited scene to ensure later do/undo action history matches.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													editor_data . set_scene_path ( editor_data . get_edited_scene ( ) ,  p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 15:28:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_SAVE_AND_RUN :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( file - > get_file_mode ( )  = =  EditorFileDialog : : FILE_MODE_SAVE_FILE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												save_default_environment ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_save_scene_with_preview ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												project_run_bar - > play_custom_scene ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 15:28:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-21 22:56:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_SAVE_AND_RUN_MAIN_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ProjectSettings : : get_singleton ( ) - > set ( " application/run/main_scene " ,  ResourceUID : : path_to_uid ( p_file ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-21 22:56:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ProjectSettings : : get_singleton ( ) - > save ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( file - > get_file_mode ( )  = =  EditorFileDialog : : FILE_MODE_SAVE_FILE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												save_default_environment ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-21 22:56:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_save_scene_with_preview ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												project_run_bar - > play_main_scene ( ( bool ) pick_main_scene - > get_meta ( " from_native " ,  false ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-21 22:56:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_EXPORT_MESH_LIBRARY :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 10:42:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  Dictionary  & fd_options  =  file_export_lib - > get_selected_options ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  merge_with_existing_library  =  fd_options . get ( TTR ( " Merge With Existing " ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  apply_mesh_instance_transforms  =  fd_options . get ( TTR ( " Apply MeshInstance Transforms " ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-27 16:49:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Ref < MeshLibrary >  ml ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-27 16:49:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( merge_with_existing_library  & &  FileAccess : : exists ( p_file ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ml  =  ResourceLoader : : load ( p_file ,  " MeshLibrary " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ml . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													show_accept ( TTR ( " Can't load MeshLibrary for merging! " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ml . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-09 15:21:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ml . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-27 16:49:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MeshLibraryEditor : : update_library_file ( editor_data . get_edited_scene_root ( ) ,  ml ,  merge_with_existing_library ,  apply_mesh_instance_transforms ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 01:33:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Error  err  =  ResourceSaver : : save ( ml ,  p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_accept ( TTR ( " Error saving MeshLibrary! " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 18:52:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( ResourceCache : : has ( p_file ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Make sure MeshLibrary is updated in the editor.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ResourceLoader : : load ( p_file ) - > reload_from_file ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  RESOURCE_SAVE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RESOURCE_SAVE_AS :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 14:49:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_COND ( saving_resource . is_null ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-18 15:17:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											save_resource_in_path ( saving_resource ,  p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-12 22:17:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( current_menu_option  = =  RESOURCE_SAVE_AS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Create .uid file when making new Resource.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ensure_uid_file ( p_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-18 15:17:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											saving_resource  =  Ref < Resource > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ObjectID  current_id  =  editor_history . get_current ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Object  * current_obj  =  current_id . is_valid ( )  ?  ObjectDB : : get_instance ( current_id )  :  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_NULL ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 17:18:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											current_obj - > notify_property_list_changed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_LAYOUT_SAVE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_file . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:48:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Error  err  =  config - > load ( EditorSettings : : get_singleton ( ) - > get_editor_layouts_config ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-01 18:48:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-10-23 15:02:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err  = =  ERR_FILE_CANT_OPEN  | |  err  = =  ERR_FILE_NOT_FOUND )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-02 14:12:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_warning ( TTR ( " An error occurred while trying to save the editor layout. \n Make sure the editor's user data path is writable. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-01 18:48:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_dock_manager - > save_docks_to_config ( config ,  p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:48:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											config - > save ( EditorSettings : : get_singleton ( ) - > get_editor_layouts_config ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											layout_dialog - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_layouts_menu ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_file  = =  " Default " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-02 14:12:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_warning ( TTR ( " Default editor layout overridden. \n To restore the Default layout to its base settings, use the Delete Layout option and delete the Default layout. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 22:23:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_LAYOUT_DELETE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:48:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Error  err  =  config - > load ( EditorSettings : : get_singleton ( ) - > get_editor_layouts_config ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err  ! =  OK  | |  ! config - > has_section ( p_file ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_warning ( TTR ( " Layout name not found! " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Erase key values.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											List < String >  keys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											config - > get_section_keys ( p_file ,  & keys ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  String  & key  :  keys )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												config - > set_value ( p_file ,  key ,  Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:48:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											config - > save ( EditorSettings : : get_singleton ( ) - > get_editor_layouts_config ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											layout_dialog - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_layouts_menu ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_file  = =  " Default " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-02 14:12:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_warning ( TTR ( " Restored the Default layout to its base settings. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 22:23:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										default :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Save scene?
 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( file - > get_file_mode ( )  = =  EditorFileDialog : : FILE_MODE_SAVE_FILE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_save_scene_with_preview ( p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : _is_class_editor_disabled_by_feature_profile ( const  StringName  & p_class )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < EditorFeatureProfile >  profile  =  EditorFeatureProfileManager : : get_singleton ( ) - > get_current_profile ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( profile . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  class_name  =  p_class ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( class_name  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 20:20:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( profile - > is_class_disabled ( class_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( profile - > is_class_editor_disabled ( class_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										class_name  =  ClassDB : : get_parent_class ( class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : edit_item ( Object  * p_object ,  Object  * p_editing_owner )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_NULL ( p_editing_owner ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Editing for this type of object may be disabled by user's feature profile.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_object  | |  _is_class_editor_disabled_by_feature_profile ( p_object - > get_class ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Nothing to edit, clean up the owner context and return.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hide_unused_editors ( p_editing_owner ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-05 21:04:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-21 18:08:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Get a list of editor plugins that can handle this type of object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < EditorPlugin  * >  available_plugins  =  editor_data . get_handling_sub_editors ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( available_plugins . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// None, clean up the owner context and return.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hide_unused_editors ( p_editing_owner ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-21 18:08:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ObjectID  owner_id  =  p_editing_owner - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Remove editor plugins no longer used by this editing owner. Keep the ones that can
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// still be reused by the new edited object.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-05 21:04:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < EditorPlugin  * >  to_remove ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( EditorPlugin  * plugin  :  active_plugins [ owner_id ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! available_plugins . has ( plugin ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											to_remove . push_back ( plugin ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( plugin - > can_auto_hide ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_plugin_over_edit ( plugin ,  nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If plugin can't be hidden, make it own itself and become responsible for closing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_plugin_over_self_own ( plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 21:44:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 21:44:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( EditorPlugin  * plugin  :  to_remove )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										active_plugins [ owner_id ] . erase ( plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 21:44:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-30 12:40:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									LocalVector < EditorPlugin  * >  to_over_edit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Send the edited object to the plugins.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( EditorPlugin  * plugin  :  available_plugins )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( active_plugins [ owner_id ] . has ( plugin ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-30 12:40:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Plugin was already active, just change the object and ensure it's visible.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											plugin - > make_visible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											plugin - > edit ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( active_plugins . has ( plugin - > get_instance_id ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Plugin is already active, but as self-owning, so it needs a separate check.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-30 12:40:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											plugin - > make_visible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											plugin - > edit ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// If plugin is already associated with another owner, remove it from there first.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( KeyValue < ObjectID ,  HashSet < EditorPlugin  * > >  & kv  :  active_plugins )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( kv . key  ! =  owner_id )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EditorPropertyResource  * epres  =  Object : : cast_to < EditorPropertyResource > ( ObjectDB : : get_instance ( kv . key ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( epres  & &  kv . value . has ( plugin ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// If it's resource property editing the same resource type, fold it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													epres - > fold_resource ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												kv . value . erase ( plugin ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-06 12:42:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Activate previously inactive plugin and edit the object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										active_plugins [ owner_id ] . insert ( plugin ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-30 12:40:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO: Call the function directly once a proper priority system is implemented.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										to_over_edit . push_back ( plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( EditorPlugin  * plugin  :  to_over_edit )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_plugin_over_edit ( plugin ,  p_object ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-01 00:50:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : push_node_item ( Node  * p_node )  {  
						 
					
						
							
								
									
										
										
										
											2023-03-11 22:46:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_node  | |  Object : : cast_to < Node > ( InspectorDock : : get_inspector_singleton ( ) - > get_edited_object ( ) )  | |  Object : : cast_to < MultiNodeEdit > ( InspectorDock : : get_inspector_singleton ( ) - > get_edited_object ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-01 00:50:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Don't push null if the currently edited object is not a Node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										push_item ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : push_item ( Object  * p_object ,  const  String  & p_property ,  bool  p_inspector_only )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( ! p_object )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > edit ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										NodeDock : : get_singleton ( ) - > set_node ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SceneTreeDock : : get_singleton ( ) - > set_selected ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										InspectorDock : : get_singleton ( ) - > update ( nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										hide_unused_editors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 16:54:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_add_to_history ( p_object ,  p_property ,  p_inspector_only ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									_edit_current ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-12 20:51:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : edit_previous_item ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( editor_history . previous ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_edit_current ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 16:54:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : push_item_no_inspector ( Object  * p_object )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_add_to_history ( p_object ,  " " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_edit_current ( false ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_default_environment ( )  {  
						 
					
						
							
								
									
										
										
										
											2020-04-18 11:00:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Environment >  fallback  =  get_tree ( ) - > get_root ( ) - > get_world_3d ( ) - > get_fallback_environment ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( fallback . is_valid ( )  & &  fallback - > get_path ( ) . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < Ref < Resource > ,  bool >  processed ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_find_and_save_edited_subresources ( fallback . ptr ( ) ,  processed ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-29 08:38:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_resource_in_path ( fallback ,  fallback - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : hide_unused_editors ( const  Object  * p_editing_owner )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_editing_owner )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  ObjectID  id  =  p_editing_owner - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( EditorPlugin  * plugin  :  active_plugins [ id ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( plugin - > can_auto_hide ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_plugin_over_edit ( plugin ,  nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_plugin_over_self_own ( plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										active_plugins . erase ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If no editing owner is provided, this method will go over all owners and check if they are valid.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This is to sweep properties that were removed from the inspector.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < ObjectID >  to_remove ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( KeyValue < ObjectID ,  HashSet < EditorPlugin  * > >  & kv  :  active_plugins )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-27 16:32:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Object  * context  =  ObjectDB : : get_instance ( kv . key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( context )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// In case of self-owning plugins, they are disabled here if they can auto hide.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  EditorPlugin  * self_owning  =  Object : : cast_to < EditorPlugin > ( context ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( self_owning  & &  self_owning - > can_auto_hide ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													context  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-27 16:32:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! context  | |  context - > call ( SNAME ( " _should_stop_editing " ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												to_remove . push_back ( kv . key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( EditorPlugin  * plugin  :  kv . value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-10 21:29:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( plugin - > can_auto_hide ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														_plugin_over_edit ( plugin ,  nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														_plugin_over_self_own ( plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  ObjectID  & id  :  to_remove )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											active_plugins . erase ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-03 21:23:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  overrides_external_editor ( Object  * p_object )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Script  * script  =  Object : : cast_to < Script > ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! script )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-03 21:23:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-03 21:23:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  script - > get_language ( ) - > overrides_external_editor ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 16:54:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _add_to_history ( const  Object  * p_object ,  const  String  & p_property ,  bool  p_inspector_only )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ObjectID  id  =  p_object - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ObjectID  history_id  =  editor_history . get_current ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( id  ! =  history_id )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  MultiNodeEdit  * multi_node_edit  =  Object : : cast_to < const  MultiNodeEdit > ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  MultiNodeEdit  * history_multi_node_edit  =  Object : : cast_to < const  MultiNodeEdit > ( ObjectDB : : get_instance ( history_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( multi_node_edit  & &  history_multi_node_edit  & &  multi_node_edit - > is_same_selection ( history_multi_node_edit ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 16:54:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_inspector_only )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_history . add_object ( id ,  String ( ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( p_property . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_history . add_object ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_history . add_object ( id ,  p_property ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _edit_current ( bool  p_skip_foreign ,  bool  p_skip_inspector_update )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ObjectID  current_id  =  editor_history . get_current ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Object  * current_obj  =  current_id . is_valid ( )  ?  ObjectDB : : get_instance ( current_id )  :  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Resource >  res  =  Object : : cast_to < Resource > ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 21:17:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_skip_foreign  & &  res . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  int  current_tab  =  scene_tabs - > get_current_tab ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-06 16:20:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( res - > get_path ( ) . contains ( " :: " )  & &  res - > get_path ( ) . get_slice ( " :: " ,  0 )  ! =  editor_data . get_scene_path ( current_tab ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 21:17:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Trying to edit resource that belongs to another scene; abort.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current_obj  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  inspector_only  =  editor_history . is_current_inspector_only ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current  =  current_obj ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( ! current_obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SceneTreeDock : : get_singleton ( ) - > set_selected ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > edit ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										NodeDock : : get_singleton ( ) - > set_node ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										InspectorDock : : get_singleton ( ) - > update ( nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										hide_unused_editors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Update the use folding setting and state.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-31 17:29:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  disable_folding  =  bool ( EDITOR_GET ( " interface/inspector/disable_folding " ) )  | |  current_obj - > is_class ( " EditorDebuggerRemoteObject " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( InspectorDock : : get_inspector_singleton ( ) - > is_using_folding ( )  = =  disable_folding )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > set_use_folding ( ! disable_folding ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 23:03:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  is_resource  =  current_obj - > is_class ( " Resource " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  is_node  =  current_obj - > is_class ( " Node " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 09:34:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  stay_in_script_editor_on_node_selected  =  bool ( EDITOR_GET ( " text_editor/behavior/navigation/stay_in_script_editor_on_node_selected " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  skip_main_plugin  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-17 01:01:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  editable_info ;  // None by default.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  info_is_warning  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( current_obj - > has_method ( " _is_read_only " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( current_obj - > call ( " _is_read_only " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editable_info  =  TTR ( " This object is marked as read-only, so it's not editable. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-27 18:56:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_resource )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Resource  * current_res  =  Object : : cast_to < Resource > ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_FAIL_NULL ( current_res ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 16:54:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! p_skip_inspector_update )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											InspectorDock : : get_inspector_singleton ( ) - > edit ( current_res ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SceneTreeDock : : get_singleton ( ) - > set_selected ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NodeDock : : get_singleton ( ) - > set_node ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											InspectorDock : : get_singleton ( ) - > update ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ImportDock : : get_singleton ( ) - > set_edit_path ( current_res - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  subr_idx  =  current_res - > get_path ( ) . find ( " :: " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 19:38:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( subr_idx  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  base_path  =  current_res - > get_path ( ) . substr ( 0 ,  subr_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 02:08:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( FileAccess : : exists ( base_path  +  " .import " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! base_path . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( get_edited_scene ( )  & &  get_edited_scene ( ) - > get_scene_file_path ( )  = =  base_path )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														info_is_warning  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 02:08:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												editable_info  =  TTR ( " This resource belongs to a scene that was imported, so it's not editable. \n Please read the documentation relevant to importing scenes to better understand this workflow. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( ( ! get_edited_scene ( )  | |  get_edited_scene ( ) - > get_scene_file_path ( )  ! =  base_path )  & &  ResourceLoader : : get_resource_type ( base_path )  = =  " PackedScene " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editable_info  =  TTR ( " This resource belongs to a scene that was instantiated or inherited. \n Changes to it must be made inside the original scene. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 19:38:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( current_res - > get_path ( ) . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( FileAccess : : exists ( current_res - > get_path ( )  +  " .import " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												editable_info  =  TTR ( " This resource was imported, so it's not editable. Change its settings in the import panel and then re-import. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-09 11:46:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( is_node )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * current_node  =  Object : : cast_to < Node > ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_FAIL_NULL ( current_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > edit ( current_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( current_node - > is_inside_tree ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											NodeDock : : get_singleton ( ) - > set_node ( current_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SceneTreeDock : : get_singleton ( ) - > set_selected ( current_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											SceneTreeDock : : get_singleton ( ) - > set_selection ( {  current_node  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											InspectorDock : : get_singleton ( ) - > update ( current_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 09:34:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! inspector_only  & &  ! skip_main_plugin )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-15 12:40:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												skip_main_plugin  =  stay_in_script_editor_on_node_selected  & &  ! ScriptEditor : : get_singleton ( ) - > is_editor_floating ( )  & &  ScriptEditor : : get_singleton ( ) - > is_visible_in_tree ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 14:29:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											NodeDock : : get_singleton ( ) - > set_node ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SceneTreeDock : : get_singleton ( ) - > set_selected ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											InspectorDock : : get_singleton ( ) - > update ( nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 21:46:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( get_edited_scene ( )  & &  ! get_edited_scene ( ) - > get_scene_file_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  source_scene  =  get_edited_scene ( ) - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 19:38:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( FileAccess : : exists ( source_scene  +  " .import " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-16 00:13:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												editable_info  =  TTR ( " This scene was imported, so changes to it won't be kept. \n Instantiating or inheriting it will allow you to make changes to it. \n Please read the documentation relevant to importing scenes to better understand this workflow. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												info_is_warning  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-25 00:08:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * selected_node  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-10 09:37:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector < Node  * >  multi_nodes ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-31 17:29:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( current_obj - > is_class ( " MultiNodeEdit " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-10 09:37:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												MultiNodeEdit  * multi_node_edit  =  Object : : cast_to < MultiNodeEdit > ( current_obj ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  node_count  =  multi_node_edit - > get_node_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( node_count  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													for  ( int  node_index  =  0 ;  node_index  <  node_count ;  + + node_index )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Node  * node  =  scene - > get_node ( multi_node_edit - > get_node ( node_index ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															multi_nodes . push_back ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! multi_nodes . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														// Pick the top-most node.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-10 09:37:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														multi_nodes . sort_custom < Node : : Comparator > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														selected_node  =  multi_nodes [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-10 09:37:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-17 22:39:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > edit ( current_obj ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										NodeDock : : get_singleton ( ) - > set_node ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SceneTreeDock : : get_singleton ( ) - > set_selected ( selected_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SceneTreeDock : : get_singleton ( ) - > set_selection ( multi_nodes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										InspectorDock : : get_singleton ( ) - > update ( nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									InspectorDock : : get_singleton ( ) - > set_info ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											info_is_warning  ?  TTR ( " Changes may be lost! " )  :  TTR ( " This object is read-only. " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editable_info , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											info_is_warning ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 10:38:59 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-05 13:55:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Object  * editor_owner  =  ( is_node  | |  current_obj - > is_class ( " MultiNodeEdit " ) )  ?  ( Object  * ) SceneTreeDock : : get_singleton ( )  :  is_resource  ?  ( Object  * ) InspectorDock : : get_inspector_singleton ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																																										:  ( Object  * ) this ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Take care of the main editor plugin.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! inspector_only )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorPlugin  * main_plugin  =  editor_data . get_handling_main_editor ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  plugin_index  =  editor_main_screen - > get_plugin_index ( main_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( main_plugin  & &  plugin_index  > =  0  & &  ! editor_main_screen - > is_button_enabled ( plugin_index ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											main_plugin  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorPlugin  * editor_plugin_screen  =  editor_main_screen - > get_selected_plugin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ObjectID  editor_owner_id  =  editor_owner - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 09:34:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( main_plugin  & &  ! skip_main_plugin )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Special case if use of external editor is true.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 10:40:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Resource  * current_res  =  Object : : cast_to < Resource > ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-12 19:42:12 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( main_plugin - > get_plugin_name ( )  = =  " Script "  & &  current_res  & &  ! current_res - > is_built_in ( )  & &  ( bool ( EDITOR_GET ( " text_editor/external/use_external_editor " ) )  | |  overrides_external_editor ( current_obj ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! changing_scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													main_plugin - > edit ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else  if  ( main_plugin  ! =  editor_plugin_screen  & &  ( ! ScriptEditor : : get_singleton ( )  | |  ! ScriptEditor : : get_singleton ( ) - > is_visible_in_tree ( )  | |  ScriptEditor : : get_singleton ( ) - > can_take_away_focus ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Unedit previous plugin.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_plugin_screen - > edit ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												active_plugins [ editor_owner_id ] . erase ( editor_plugin_screen ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Update screen main_plugin.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												editor_main_screen - > select ( plugin_index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-09 09:27:30 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												main_plugin - > edit ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-18 22:10:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_plugin_screen - > edit ( current_obj ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											is_main_screen_editing  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( ! main_plugin  & &  editor_plugin_screen  & &  is_main_screen_editing )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_plugin_screen - > edit ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											is_main_screen_editing  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 22:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										edit_item ( current_obj ,  editor_owner ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									InspectorDock : : get_singleton ( ) - > update ( current_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 10:12:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _android_build_source_selected ( const  String  & p_file )  {  
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_template_manager - > install_android_template_from_file ( p_file ,  android_export_preset ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _android_export_preset_selected ( int  p_index )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_index  > =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										android_export_preset  =  EditorExport : : get_singleton ( ) - > get_export_preset ( choose_android_export_profile - > get_item_id ( p_index ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										android_export_preset . unref ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									install_android_build_template_message - > set_text ( vformat ( TTR ( INSTALL_ANDROID_BUILD_TEMPLATE_MESSAGE ) ,  export_template_manager - > get_android_build_directory ( android_export_preset ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 10:12:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2022-03-01 23:19:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _menu_option_confirm ( int  p_option ,  bool  p_confirmed )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_confirmed )  {  // FIXME: this may be a hack.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										current_menu_option  =  ( MenuOptions ) p_option ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( p_option )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_NEW_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 19:47:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											new_scene ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_NEW_INHERITED_SCENE : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_OPEN_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > set_file_mode ( EditorFileDialog : : FILE_MODE_OPEN_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											List < String >  extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceLoader : : get_recognized_extensions_for_type ( " PackedScene " ,  & extensions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											file - > clear_filters ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-15 15:18:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  String  & extension  :  extensions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												file - > add_filter ( " *. "  +  extension ,  extension . to_upper ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												file - > set_current_path ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > set_title ( p_option  = =  FILE_OPEN_SCENE  ?  TTR ( " Open Scene " )  :  TTR ( " Open Base Scene " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-11 18:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > popup_file_dialog ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-09 22:06:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_QUICK_OPEN :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											quick_open_dialog - > popup_dialog ( {  " Resource "  } ,  callable_mp ( this ,  & EditorNode : : _quick_opened ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_QUICK_OPEN_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											quick_open_dialog - > popup_dialog ( {  " PackedScene "  } ,  callable_mp ( this ,  & EditorNode : : _quick_opened ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_QUICK_OPEN_SCRIPT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											quick_open_dialog - > popup_dialog ( {  " Script "  } ,  callable_mp ( this ,  & EditorNode : : _quick_opened ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_OPEN_PREV :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( previous_scenes . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opening_prev  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											open_request ( previous_scenes . back ( ) - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											previous_scenes . pop_back ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-21 11:44:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_CLOSE_OTHERS :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tab_closing_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( i  = =  editor_data . get_edited_scene ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tabs_to_close . push_back ( editor_data . get_scene_path ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-21 11:44:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_proceed_closing_scene_tabs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_CLOSE_RIGHT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tab_closing_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  editor_data . get_edited_scene ( )  +  1 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tabs_to_close . push_back ( editor_data . get_scene_path ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_proceed_closing_scene_tabs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_CLOSE_ALL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tab_closing_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tabs_to_close . push_back ( editor_data . get_scene_path ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_proceed_closing_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_CLOSE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-20 01:09:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_scene_tab_closed ( editor_data . get_edited_scene ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-04 14:22:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_SAVE_SCENE_SILENTLY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Save scene without displaying progress dialog. Used to work around
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// errors about parent node being busy setting up children
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// when Save on Focus Loss kicks in.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( scene  & &  ! scene - > get_scene_file_path ( ) . is_empty ( )  & &  DirAccess : : exists ( scene - > get_scene_file_path ( ) . get_base_dir ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_save_scene ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												save_editor_layout_delayed ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SCENE_TAB_CLOSE : 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_SAVE_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  scene_idx  =  ( p_option  = =  FILE_SAVE_SCENE )  ?  - 1  :  tab_closing_idx ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( scene  & &  ! scene - > get_scene_file_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( DirAccess : : exists ( scene - > get_scene_file_path ( ) . get_base_dir ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( scene_idx  ! =  editor_data . get_edited_scene ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														_save_scene_with_preview ( scene - > get_scene_file_path ( ) ,  scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														_save_scene_with_preview ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( scene_idx  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														_discard_changes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													save_editor_layout_delayed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													show_save_accept ( vformat ( TTR ( " %s no longer exists! Please specify a new save location. " ) ,  scene - > get_scene_file_path ( ) . get_base_dir ( ) ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 20:47:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											[[fallthrough]] ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-05 14:06:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_SAVE_AS_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  scene_idx  =  ( p_option  = =  FILE_SAVE_SCENE  | |  p_option  = =  FILE_SAVE_AS_SCENE )  ?  - 1  :  tab_closing_idx ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( ! scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-09 12:29:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( p_option  = =  FILE_SAVE_SCENE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Pressing Ctrl + S saves the current script if a scene is currently open, but it won't if the scene has no root node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Work around this by explicitly saving the script in this case (similar to pressing Ctrl + Alt + S).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ScriptEditor : : get_singleton ( ) - > save_current_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-29 16:19:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  int  saved  =  _save_external_resources ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( saved  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-09 18:14:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													EditorToaster : : get_singleton ( ) - > popup_str ( vformat ( TTR ( " The current scene has no root node, but %d modified external resource(s) and/or plugin data were saved anyway. " ) ,  saved ) ,  EditorToaster : : SEVERITY_INFO ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-09 12:29:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( p_option  = =  FILE_SAVE_AS_SCENE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Don't show this dialog when pressing Ctrl + S to avoid interfering with script saving.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													show_accept ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															TTR ( " A root node is required to save the scene. You can add a root node using the Scene tree dock. " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 20:00:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > set_file_mode ( EditorFileDialog : : FILE_MODE_SAVE_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < String >  extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < PackedScene >  sd  =  memnew ( PackedScene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ResourceSaver : : get_recognized_extensions ( sd ,  & extensions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											file - > clear_filters ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-15 15:18:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  String  & extension  :  extensions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												file - > add_filter ( " *. "  +  extension ,  extension . to_upper ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! scene - > get_scene_file_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												String  path  =  scene - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-14 03:28:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												file - > set_current_path ( path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												if  ( extensions . size ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-14 03:28:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													String  ext  =  path . get_extension ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( extensions . find ( ext )  = =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-14 03:28:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														file - > set_current_path ( path . replacen ( " . "  +  ext ,  " . "  +  extensions . front ( ) - > get ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 13:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( extensions . size ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  root_name  =  scene - > get_name ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 10:29:59 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												root_name  =  EditorNode : : adjust_scene_name_casing ( root_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 13:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												file - > set_current_path ( root_name  +  " . "  +  extensions . front ( ) - > get ( ) . to_lower ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-22 19:36:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > set_title ( TTR ( " Save Scene As... " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 10:42:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > popup_file_dialog ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-26 00:54:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_SAVE_ALL_SCENES :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_save_all_scenes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-06 15:28:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_RUN_SCENE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											project_run_bar - > play_current_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  FILE_EXPORT_PROJECT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-19 23:19:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											project_export - > popup_export ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_EXTERNAL_OPEN_SCENE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( unsaved_cache  & &  ! p_confirmed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												confirmation - > set_ok_button_text ( TTR ( " Open " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												confirmation - > set_text ( TTR ( " Current scene not saved. Open anyway? " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												confirmation - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  oprev  =  opening_prev ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Error  err  =  load_scene ( external_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( err  = =  OK  & &  oprev )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												previous_scenes . pop_back ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												opening_prev  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  EDIT_UNDO :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-13 16:31:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ( int ) Input : : get_singleton ( ) - > get_mouse_button_mask ( )  &  0x7 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-17 11:41:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												log - > add_message ( TTR ( " Can't undo while mouse buttons are pressed. " ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorUndoRedoManager  * undo_redo  =  EditorUndoRedoManager : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  action  =  undo_redo - > get_current_action_name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  id  =  undo_redo - > get_current_action_history_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! undo_redo - > undo ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-17 11:41:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													log - > add_message ( TTR ( " Nothing to undo. " ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( ! action . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-08 14:04:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													switch  ( id )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														case  EditorUndoRedoManager : : GLOBAL_HISTORY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															log - > add_message ( vformat ( TTR ( " Global Undo: %s " ) ,  action ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														case  EditorUndoRedoManager : : REMOTE_HISTORY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															log - > add_message ( vformat ( TTR ( " Remote Undo: %s " ) ,  action ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															log - > add_message ( vformat ( TTR ( " Scene Undo: %s " ) ,  action ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  EDIT_REDO :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorUndoRedoManager  * undo_redo  =  EditorUndoRedoManager : : get_singleton ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-13 16:31:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ( int ) Input : : get_singleton ( ) - > get_mouse_button_mask ( )  &  0x7 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-17 11:41:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												log - > add_message ( TTR ( " Can't redo while mouse buttons are pressed. " ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! undo_redo - > redo ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-17 11:41:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													log - > add_message ( TTR ( " Nothing to redo. " ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													String  action  =  undo_redo - > get_current_action_name ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-08 14:04:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( action . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													switch  ( undo_redo - > get_current_action_history_id ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-08 14:04:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														case  EditorUndoRedoManager : : GLOBAL_HISTORY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															log - > add_message ( vformat ( TTR ( " Global Redo: %s " ) ,  action ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														case  EditorUndoRedoManager : : REMOTE_HISTORY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															log - > add_message ( vformat ( TTR ( " Remote Redo: %s " ) ,  action ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															log - > add_message ( vformat ( TTR ( " Scene Redo: %s " ) ,  action ) ,  EditorLog : : MSG_TYPE_EDITOR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 00:14:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 20:12:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_RELOAD_SAVED_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 00:14:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 00:14:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 18:28:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  filename  =  scene - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 18:28:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( filename . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-19 00:08:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												show_warning ( TTR ( " Can't reload a scene that was never saved. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 18:28:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-27 00:00:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( unsaved_cache  & &  ! p_confirmed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												confirmation - > set_ok_button_text ( TTR ( " Reload Saved Scene " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 20:12:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												confirmation - > set_text ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														TTR ( " The current scene has unsaved changes. \n Reload the saved scene anyway? This action cannot be undone. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												confirmation - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-27 00:00:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 00:14:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 18:28:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  cur_idx  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_remove_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Error  err  =  load_scene ( filename ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 22:32:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ERR_PRINT ( " Failed to load scene " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 18:28:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_data . move_edited_scene_to_index ( cur_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 13:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorUndoRedoManager : : get_singleton ( ) - > clear_history ( editor_data . get_current_edited_scene_history_id ( ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 18:28:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scene_tabs - > set_current_tab ( cur_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 00:14:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-13 19:06:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  FILE_SHOW_IN_FILESYSTEM :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  path  =  editor_data . get_scene_path ( editor_data . get_edited_scene ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! path . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												FileSystemDock : : get_singleton ( ) - > navigate_to_path ( path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-13 19:06:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  RUN_SETTINGS :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											project_settings_editor - > popup_project_settings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_INSTALL_ANDROID_SOURCE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_confirmed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( export_template_manager - > is_android_template_installed ( android_export_preset ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													remove_android_build_template - > set_text ( vformat ( TTR ( REMOVE_ANDROID_BUILD_TEMPLATE_MESSAGE ) ,  export_template_manager - > get_android_build_directory ( android_export_preset ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													remove_android_build_template - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( ! export_template_manager - > can_install_android_template ( android_export_preset ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gradle_build_manage_templates - > popup_centered ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													export_template_manager - > install_android_template ( android_export_preset ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  has_custom_gradle_build  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												choose_android_export_profile - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < EditorExportPreset >  export_preset  =  EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( export_preset - > get_platform ( ) - > get_class_name ( )  = =  " EditorExportPlatformAndroid "  & &  ( bool ) export_preset - > get ( " gradle_build/use_gradle_build " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														choose_android_export_profile - > add_item ( export_preset - > get_name ( ) ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String  gradle_build_directory  =  export_preset - > get ( " gradle_build/gradle_build_directory " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String  android_source_template  =  export_preset - > get ( " gradle_build/android_source_template " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! android_source_template . is_empty ( )  | |  ( gradle_build_directory  ! =  " "  & &  gradle_build_directory  ! =  " res://android " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															has_custom_gradle_build  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_android_export_preset_selected ( choose_android_export_profile - > get_item_count ( )  > =  1  ?  0  :  - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( choose_android_export_profile - > get_item_count ( )  >  1  & &  has_custom_gradle_build )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// If there's multiple options and at least one of them uses a custom gradle build then prompt the user to choose.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													choose_android_export_profile - > show ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													install_android_build_template - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													choose_android_export_profile - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( export_template_manager - > is_android_template_installed ( android_export_preset ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														remove_android_build_template - > set_text ( vformat ( TTR ( REMOVE_ANDROID_BUILD_TEMPLATE_MESSAGE ) ,  export_template_manager - > get_android_build_directory ( android_export_preset ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														remove_android_build_template - > popup_centered ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  if  ( export_template_manager - > can_install_android_template ( android_export_preset ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														install_android_build_template - > popup_centered ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														gradle_build_manage_templates - > popup_centered ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 17:51:45 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  RUN_USER_DATA_FOLDER :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Ensure_user_data_dir() to prevent the edge case: "Open User Data Folder" won't work after the project was renamed in ProjectSettingsEditor unless the project is saved.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-13 14:49:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > ensure_user_data_dir ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-07 11:33:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_show_in_file_manager ( OS : : get_singleton ( ) - > get_user_data_dir ( ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-04 22:46:12 +05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_EXPLORE_ANDROID_BUILD_TEMPLATES :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_show_in_file_manager ( ProjectSettings : : get_singleton ( ) - > globalize_path ( export_template_manager - > get_android_build_directory ( android_export_preset ) . get_base_dir ( ) ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_QUIT : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 16:37:29 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  RUN_PROJECT_MANAGER : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RELOAD_CURRENT_PROJECT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-16 18:09:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_confirmed  & &  plugin_to_save )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												plugin_to_save - > save_external_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_confirmed  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-18 12:21:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! p_confirmed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-17 18:02:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  save_each  =  EDITOR_GET ( " interface/editor/save_each_scene_on_quit " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( _next_unsaved_scene ( ! save_each )  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( EditorUndoRedoManager : : GLOBAL_HISTORY ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 16:37:29 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( p_option  = =  RELOAD_CURRENT_PROJECT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															save_confirmation - > set_ok_button_text ( TTR ( " Save & Reload " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															save_confirmation - > set_text ( TTR ( " Save modified resources before reloading? " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 16:37:29 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															save_confirmation - > set_ok_button_text ( TTR ( " Save & Quit " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															save_confirmation - > set_text ( TTR ( " Save modified resources before closing? " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 16:37:29 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-10 17:04:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														save_confirmation - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														save_confirmation - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-16 18:09:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													plugin_to_save  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													for  ( int  i  =  0 ;  i  <  editor_data . get_editor_plugin_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														const  String  unsaved_status  =  editor_data . get_editor_plugin ( i ) - > get_unsaved_status ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! unsaved_status . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( p_option  = =  RELOAD_CURRENT_PROJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																save_confirmation - > set_ok_button_text ( TTR ( " Save & Reload " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																save_confirmation - > set_text ( unsaved_status ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-16 18:09:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																save_confirmation - > set_ok_button_text ( TTR ( " Save & Quit " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																save_confirmation - > set_text ( unsaved_status ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-16 18:09:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															save_confirmation - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-16 18:09:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															save_confirmation - > popup_centered ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															plugin_to_save  =  editor_data . get_editor_plugin ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-16 18:09:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( plugin_to_save )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_discard_changes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( save_each )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													tab_closing_menu_option  =  current_menu_option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														tabs_to_close . push_back ( editor_data . get_scene_path ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_proceed_closing_scene_tabs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  unsaved_scenes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													int  i  =  _next_unsaved_scene ( true ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													while  ( i  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														unsaved_scenes  + =  " \n              "  +  editor_data . get_edited_scene_root ( i ) - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														i  =  _next_unsaved_scene ( true ,  + + i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( p_option  = =  RELOAD_CURRENT_PROJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														save_confirmation - > set_ok_button_text ( TTR ( " Save & Reload " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														save_confirmation - > set_text ( TTR ( " Save changes to the following scene(s) before reloading? " )  +  unsaved_scenes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														save_confirmation - > set_ok_button_text ( TTR ( " Save & Quit " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														save_confirmation - > set_text ( ( p_option  = =  FILE_QUIT  ?  TTR ( " Save changes to the following scene(s) before quitting? " )  :  TTR ( " Save changes to the following scene(s) before opening Project Manager? " ) )  +  unsaved_scenes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-10 17:04:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													save_confirmation - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													save_confirmation - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-03 10:36:29 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												DisplayServer : : get_singleton ( ) - > window_request_attention ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_save_external_resources ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_discard_changes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-18 12:21:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_UPDATE_CONTINUOUSLY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorSettings : : get_singleton ( ) - > set ( " interface/editor/update_continuously " ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_update_spinner ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											show_accept ( TTR ( " This option is deprecated. Situations where refresh must be forced are now considered a bug. Please report. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_UPDATE_WHEN_CHANGED :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorSettings : : get_singleton ( ) - > set ( " interface/editor/update_continuously " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_update_spinner ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_UPDATE_SPINNER_HIDE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-08 15:13:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorSettings : : get_singleton ( ) - > set ( " interface/editor/show_update_spinner " ,  2 ) ;  // Disabled
 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_update_update_spinner ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_PREFERENCES :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_settings_dialog - > popup_edit_settings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_EDITOR_DATA_FOLDER :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-07 11:33:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_show_in_file_manager ( EditorPaths : : get_singleton ( ) - > get_data_dir ( ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_EDITOR_CONFIG_FOLDER :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-07 11:33:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_show_in_file_manager ( EditorPaths : : get_singleton ( ) - > get_config_dir ( ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-20 23:31:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_MANAGE_EXPORT_TEMPLATES :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											export_template_manager - > popup_manager ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-02 13:43:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_MANAGE_FBX_IMPORTER :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if !defined(ANDROID_ENABLED) && !defined(WEB_ENABLED) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											fbx_importer_manager - > show_dialog ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 10:12:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-01 15:17:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											gradle_build_manage_templates - > hide ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 10:12:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file_android_build_source - > popup_centered_ratio ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_MANAGE_FEATURE_PROFILES :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-27 05:36:44 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											feature_profile_manager - > popup_centered_clamped ( Size2 ( 900 ,  800 )  *  EDSCALE ,  0.8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-13 09:46:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 07:53:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_TOGGLE_FULLSCREEN :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-27 12:44:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DisplayServer : : WindowMode  mode  =  DisplayServer : : get_singleton ( ) - > window_get_mode ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( mode  = =  DisplayServer : : WINDOW_MODE_FULLSCREEN  | |  mode  = =  DisplayServer : : WINDOW_MODE_EXCLUSIVE_FULLSCREEN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												DisplayServer : : get_singleton ( ) - > window_set_mode ( prev_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												prev_mode  =  mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												DisplayServer : : get_singleton ( ) - > window_set_mode ( DisplayServer : : WINDOW_MODE_FULLSCREEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-18 14:17:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDITOR_SCREENSHOT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											screenshot_timer - > start ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SETTINGS_PICK_MAIN_SCENE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > set_file_mode ( EditorFileDialog : : FILE_MODE_OPEN_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											List < String >  extensions ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceLoader : : get_recognized_extensions_for_type ( " PackedScene " ,  & extensions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > clear_filters ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-15 15:18:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  String  & extension  :  extensions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												file - > add_filter ( " *. "  +  extension ,  extension . to_upper ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												file - > set_current_path ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-15 15:18:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 12:00:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > set_title ( TTR ( " Pick a Main Scene " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-11 18:45:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											file - > popup_file_dialog ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_SEARCH :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-17 18:22:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											emit_signal ( SNAME ( " request_help_search " ) ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_COMMAND_PALETTE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											command_palette - > open_popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_DOCS :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-17 18:16:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( VERSION_DOCS_URL  " / " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 15:34:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_FORUM :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( " https://forum.godotengine.org/ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 23:10:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_REPORT_A_BUG :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( " https://github.com/godotengine/godot/issues " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_COPY_SYSTEM_INFO :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  info  =  _get_system_info ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DisplayServer : : get_singleton ( ) - > clipboard_set ( info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 18:24:34 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_SUGGEST_A_FEATURE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( " https://github.com/godotengine/godot-proposals#readme " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 23:10:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_SEND_DOCS_FEEDBACK :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( " https://github.com/godotengine/godot-docs/issues " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_COMMUNITY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( " https://godotengine.org/community " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  HELP_ABOUT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											about - > popup_centered ( Size2 ( 780 ,  500 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-15 01:57:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  HELP_SUPPORT_GODOT_DEVELOPMENT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OS : : get_singleton ( ) - > shell_open ( " https://godotengine.org/donate " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SET_RENDERER_NAME_SAVE_AND_RESTART :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ProjectSettings : : get_singleton ( ) - > set ( " rendering/renderer/rendering_method " ,  renderer_request ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 17:28:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( renderer_request  = =  " mobile "  | |  renderer_request  = =  " gl_compatibility " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Also change the mobile override if changing to a compatible rendering method.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// This prevents visual discrepancies between desktop and mobile platforms.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ProjectSettings : : get_singleton ( ) - > set ( " rendering/renderer/rendering_method.mobile " ,  renderer_request ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( renderer_request  = =  " forward_plus " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Use the equivalent mobile rendering method. This prevents the rendering method from staying
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// on its old choice if moving from `gl_compatibility` to `forward_plus`.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ProjectSettings : : get_singleton ( ) - > set ( " rendering/renderer/rendering_method.mobile " ,  " mobile " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ProjectSettings : : get_singleton ( ) - > save ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-25 17:23:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											save_all_scenes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											restart_editor ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 18:23:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  EditorNode : : adjust_scene_name_casing ( const  String  & p_root_name )  {  
						 
					
						
							
								
									
										
										
										
											2023-01-12 11:41:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( GLOBAL_GET ( " editor/naming/scene_name_casing " ) . operator  int ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 10:29:59 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SCENE_NAME_CASING_AUTO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Use casing of the root node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SCENE_NAME_CASING_PASCAL_CASE : 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 18:23:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  p_root_name . replace ( " - " ,  " _ " ) . to_pascal_case ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 10:29:59 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  SCENE_NAME_CASING_SNAKE_CASE : 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 18:23:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  p_root_name . replace ( " - " ,  " _ " ) . to_snake_case ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SCENE_NAME_CASING_KEBAB_CASE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_root_name . to_snake_case ( ) . replace ( " _ " ,  " - " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 10:29:59 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 18:23:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  p_root_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  EditorNode : : adjust_script_name_casing ( const  String  & p_file_name ,  ScriptLanguage : : ScriptNameCasing  p_auto_casing )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  editor_casing  =  GLOBAL_GET ( " editor/naming/script_name_casing " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( editor_casing  = =  ScriptLanguage : : SCRIPT_NAME_CASING_AUTO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Use the script language's preferred casing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_casing  =  p_auto_casing ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( editor_casing )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ScriptLanguage : : SCRIPT_NAME_CASING_AUTO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Script language has no preference, so do not adjust.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ScriptLanguage : : SCRIPT_NAME_CASING_PASCAL_CASE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_file_name . replace ( " - " ,  " _ " ) . to_pascal_case ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ScriptLanguage : : SCRIPT_NAME_CASING_SNAKE_CASE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_file_name . replace ( " - " ,  " _ " ) . to_snake_case ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ScriptLanguage : : SCRIPT_NAME_CASING_KEBAB_CASE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_file_name . to_snake_case ( ) . replace ( " _ " ,  " - " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  p_file_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 10:29:59 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _request_screenshot ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_screenshot ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _screenshot ( bool  p_use_utc )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-24 07:54:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  name  =  " editor_screenshot_ "  +  Time : : get_singleton ( ) - > get_datetime_string_from_system ( p_use_utc ) . replace ( " : " ,  " " )  +  " .png " ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NodePath  path  =  String ( " user:// " )  +  name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_save_screenshot ( path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EDITOR_GET ( " interface/editor/automatically_open_screenshots " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-07 11:33:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OS : : get_singleton ( ) - > shell_show_in_file_manager ( ProjectSettings : : get_singleton ( ) - > globalize_path ( path ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _save_screenshot ( NodePath  p_path )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Control  * main_screen_control  =  editor_main_screen - > get_control ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_NULL_MSG ( main_screen_control ,  " Cannot get the editor main screen control. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Viewport  * viewport  =  main_screen_control - > get_viewport ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_MSG ( viewport ,  " Cannot get a viewport from the editor main screen. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-11 14:12:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < ViewportTexture >  texture  =  viewport - > get_texture ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 02:30:54 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( texture . is_null ( ) ,  " Cannot get a viewport texture from the editor main screen. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-28 12:32:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Image >  img  =  texture - > get_image ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 02:30:54 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( img . is_null ( ) ,  " Cannot get an image from a viewport texture of the editor main screen. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  error  =  img - > save_png ( p_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-25 10:28:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( error  ! =  OK ,  " Cannot save screenshot to file ' "  +  p_path  +  " '. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-14 15:13:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _check_system_theme_changed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DisplayServer  * display_server  =  DisplayServer : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  system_theme_changed  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( follow_system_theme )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( display_server - > get_base_color ( )  ! =  last_system_base_color )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											system_theme_changed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											last_system_base_color  =  display_server - > get_base_color ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( display_server - > is_dark_mode_supported ( )  & &  display_server - > is_dark_mode ( )  ! =  last_dark_mode_state )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											system_theme_changed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											last_dark_mode_state  =  display_server - > is_dark_mode ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( use_system_accent_color )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( display_server - > get_accent_color ( )  ! =  last_system_accent_color )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											system_theme_changed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											last_system_accent_color  =  display_server - > get_accent_color ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( system_theme_changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_update_theme ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _tool_menu_option ( int  p_idx )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( tool_menu - > get_item_id ( p_idx ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  TOOLS_ORPHAN_RESOURCES :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											orphan_resources - > show ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 02:28:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  TOOLS_BUILD_PROFILE_MANAGER :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											build_profile_manager - > popup_centered_clamped ( Size2 ( 700 ,  800 )  *  EDSCALE ,  0.8 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 14:44:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  TOOLS_SURFACE_UPGRADE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-22 16:15:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											surface_upgrade_dialog - > popup_on_demand ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 14:44:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  TOOLS_CUSTOM :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( tool_menu - > get_item_submenu ( p_idx )  = =  " " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 00:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Callable  callback  =  tool_menu - > get_item_metadata ( p_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Callable : : CallError  ce ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 00:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant  result ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-28 22:56:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												callback . callp ( nullptr ,  0 ,  result ,  ce ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ce . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 00:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													String  err  =  Variant : : get_callable_error_text ( callback ,  nullptr ,  0 ,  ce ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-06 17:03:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ERR_PRINT ( " Error calling function from tool menu:  "  +  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  // Else it's a submenu so don't do anything.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 18:11:04 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _export_as_menu_option ( int  p_idx )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_idx  = =  0 )  {  // MeshLibrary
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										current_menu_option  =  FILE_EXPORT_MESH_LIBRARY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! editor_data . get_edited_scene_root ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											show_accept ( TTR ( " This operation can't be done without a scene. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < String >  extensions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < MeshLibrary >  ml ( memnew ( MeshLibrary ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ResourceSaver : : get_recognized_extensions ( ml ,  & extensions ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										file_export_lib - > clear_filters ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  String  & E  :  extensions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											file_export_lib - > add_filter ( " *. "  +  E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										file_export_lib - > set_title ( TTR ( " Export Mesh Library " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 10:42:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file_export_lib - > popup_file_dialog ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 18:11:04 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  {  // Custom menu options added by plugins
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( export_as_menu - > get_item_submenu ( p_idx ) . is_empty ( ) )  {  // If not a submenu
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Callable  callback  =  export_as_menu - > get_item_metadata ( p_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Callable : : CallError  ce ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  result ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-28 22:56:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											callback . callp ( nullptr ,  0 ,  result ,  ce ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 18:11:04 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ce . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  err  =  Variant : : get_callable_error_text ( callback ,  nullptr ,  0 ,  ce ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_PRINT ( " Error calling function from export_as menu:  "  +  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-26 18:29:45 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  EditorNode : : _next_unsaved_scene ( bool  p_valid_filename ,  int  p_start )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  p_start ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! editor_data . get_edited_scene_root ( i ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-10 01:48:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  scene_filename  =  editor_data . get_edited_scene_root ( i ) - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_valid_filename  & &  scene_filename . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  unsaved  =  EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( editor_data . get_scene_history_id ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( unsaved )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  j  =  0 ;  j  <  editor_data . get_editor_plugin_count ( ) ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! editor_data . get_editor_plugin ( j ) - > get_unsaved_status ( scene_filename ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-18 12:48:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _exit_editor ( int  p_exit_code )  {  
						 
					
						
							
								
									
										
										
										
											2019-01-17 09:09:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									exiting  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > stop ( ) ;  // Stop early to avoid crashes.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_editor_layout ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-04 23:45:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Dim the editor window while it's quitting to make it clearer that it's busy.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-28 20:58:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dim_editor ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-04 23:45:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 17:44:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Unload addons before quitting to allow cleanup.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 09:48:45 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unload_editor_addons ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									get_tree ( ) - > quit ( p_exit_code ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : unload_editor_addons ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-16 17:44:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < String ,  EditorPlugin  * >  & E  :  addon_name_to_plugin )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										print_verbose ( vformat ( " Unloading addon: %s " ,  E . key ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										remove_editor_plugin ( E . value ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										memdelete ( E . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 14:06:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									addon_name_to_plugin . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-17 09:09:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _discard_changes ( const  String  & p_str )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( current_menu_option )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_CLOSE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SCENE_TAB_CLOSE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * scene  =  editor_data . get_edited_scene_root ( tab_closing_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( scene  ! =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												String  scene_filename  =  scene - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! scene_filename . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-31 23:49:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													previous_scenes . push_back ( scene_filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Don't close tabs when exiting the editor (required for "restore_scenes_on_load" setting).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! _is_closing_editor ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_remove_scene ( tab_closing_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_proceed_closing_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  FILE_QUIT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											project_run_bar - > stop_playing ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-18 12:48:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_exit_editor ( EXIT_SUCCESS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-17 09:09:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RUN_PROJECT_MANAGER :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:31:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											restart_editor ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 17:57:30 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 16:37:29 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  RELOAD_CURRENT_PROJECT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											restart_editor ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_file_menu_opened ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > set_item_disabled ( file_menu - > get_item_index ( FILE_OPEN_PREV ) ,  previous_scenes . is_empty ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-08 18:35:15 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_undo_redo_allowed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _update_file_menu_closed ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > set_item_disabled ( file_menu - > get_item_index ( FILE_OPEN_PREV ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 10:45:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _palette_quick_open_dialog ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									quick_open_color_palette - > popup_dialog ( {  " ColorPalette "  } ,  palette_file_selected_callback ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									quick_open_color_palette - > set_title ( TTR ( " Quick Open Color Palette... " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 19:39:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : replace_resources_in_object ( Object  * p_object ,  const  Vector < Ref < Resource > >  & p_source_resources ,  const  Vector < Ref < Resource > >  & p_target_resource )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < PropertyInfo >  pi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_object - > get_property_list ( & pi ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  PropertyInfo  & E  :  pi )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ( E . usage  &  PROPERTY_USAGE_STORAGE ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( E . type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : OBJECT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( E . hint  = =  PROPERTY_HINT_RESOURCE_TYPE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  Variant  & v  =  p_object - > get ( E . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < Resource >  res  =  v ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( res . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														int  res_idx  =  p_source_resources . find ( res ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( res_idx  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															p_object - > set ( E . name ,  p_target_resource . get ( res_idx ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															replace_resources_in_object ( v ,  p_source_resources ,  p_target_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : ARRAY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Array  varray  =  p_object - > get ( E . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  len  =  varray . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  array_requires_updating  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  len ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  Variant  & v  =  varray . get ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < Resource >  res  =  v ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( res . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														int  res_idx  =  p_source_resources . find ( res ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( res_idx  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															varray . set ( i ,  p_target_resource . get ( res_idx ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															array_requires_updating  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															replace_resources_in_object ( v ,  p_source_resources ,  p_target_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( array_requires_updating )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_object - > set ( E . name ,  varray ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : DICTIONARY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Dictionary  d  =  p_object - > get ( E . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < Variant >  keys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  dictionary_requires_updating  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												d . get_key_list ( & keys ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( const  Variant  & F  :  keys )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Variant  v  =  d [ F ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < Resource >  res  =  v ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( res . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														int  res_idx  =  p_source_resources . find ( res ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( res_idx  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															d [ F ]  =  p_target_resource . get ( res_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															dictionary_requires_updating  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															replace_resources_in_object ( v ,  p_source_resources ,  p_target_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( dictionary_requires_updating )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_object - > set ( E . name ,  d ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * n  =  Object : : cast_to < Node > ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( n )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  n - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											replace_resources_in_object ( n - > get_child ( i ) ,  p_source_resources ,  p_target_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : replace_resources_in_scenes ( const  Vector < Ref < Resource > >  & p_source_resources ,  const  Vector < Ref < Resource > >  & p_target_resource )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * edited_scene_root  =  editor_data . get_edited_scene_root ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( edited_scene_root )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											replace_resources_in_object ( edited_scene_root ,  p_source_resources ,  p_target_resource ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : add_editor_plugin ( EditorPlugin  * p_editor ,  bool  p_config_changed )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( p_editor - > has_main_screen ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > editor_main_screen - > add_main_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > editor_data . add_editor_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									singleton - > add_child ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_config_changed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_editor - > enable_plugin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : remove_editor_plugin ( EditorPlugin  * p_editor ,  bool  p_config_changed )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( p_editor - > has_main_screen ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > editor_main_screen - > remove_main_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-18 19:29:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_editor - > make_visible ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_editor - > clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_config_changed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_editor - > disable_plugin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-17 10:46:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > editor_plugins_over - > remove_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > editor_plugins_force_over - > remove_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > editor_plugins_force_input_forwarding - > remove_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									singleton - > remove_child ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > editor_data . remove_editor_plugin ( p_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-25 21:12:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < ObjectID ,  HashSet < EditorPlugin  * > >  & kv  :  singleton - > active_plugins )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kv . value . erase ( p_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 16:46:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : add_extension_editor_plugin ( const  StringName  & p_class_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( ! ClassDB : : class_exists ( p_class_name ) ,  vformat ( " No such editor plugin registered: %s " ,  p_class_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( ! ClassDB : : is_parent_class ( p_class_name ,  SNAME ( " EditorPlugin " ) ) ,  vformat ( " Class is not an editor plugin: %s " ,  p_class_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( singleton - > editor_data . has_extension_editor_plugin ( p_class_name ) ,  vformat ( " Editor plugin already added for class: %s " ,  p_class_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorPlugin  * plugin  =  Object : : cast_to < EditorPlugin > ( ClassDB : : instantiate ( p_class_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > editor_data . add_extension_editor_plugin ( p_class_name ,  plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_editor_plugin ( plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : remove_extension_editor_plugin ( const  StringName  & p_class_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If we're exiting, the editor plugins will get cleaned up anyway, so don't do anything.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-18 00:30:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! singleton  | |  singleton - > exiting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 16:46:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( ! singleton - > editor_data . has_extension_editor_plugin ( p_class_name ) ,  vformat ( " No editor plugin added for class: %s " ,  p_class_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorPlugin  * plugin  =  singleton - > editor_data . get_extension_editor_plugin ( p_class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									remove_editor_plugin ( plugin ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-04 20:34:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( plugin ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 16:46:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > editor_data . remove_extension_editor_plugin ( p_class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_addon_config ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( _initializing_plugins )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < String >  enabled_addons ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < String ,  EditorPlugin  * >  & E  :  addon_name_to_plugin )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										enabled_addons . push_back ( E . key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( enabled_addons . size ( )  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 17:00:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ProjectSettings : : get_singleton ( ) - > set ( " editor_plugins/enabled " ,  Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 13:39:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										enabled_addons . sort ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 17:00:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ProjectSettings : : get_singleton ( ) - > set ( " editor_plugins/enabled " ,  enabled_addons ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_settings_editor - > queue_save ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : set_addon_plugin_enabled ( const  String  & p_addon ,  bool  p_enabled ,  bool  p_config_changed )  {  
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  addon_path  =  p_addon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! addon_path . begins_with ( " res:// " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										addon_path  =  " res://addons/ "  +  addon_path  +  " /plugin.cfg " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( p_enabled  & &  addon_name_to_plugin . has ( addon_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! p_enabled  & &  ! addon_name_to_plugin . has ( addon_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_enabled )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorPlugin  * addon  =  addon_name_to_plugin [ addon_path ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										remove_editor_plugin ( addon ,  p_config_changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										memdelete ( addon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										addon_name_to_plugin . erase ( addon_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_update_addon_config ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < ConfigFile >  cf ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cf . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! DirAccess : : exists ( addon_path . get_base_dir ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_remove_plugin_from_enabled ( addon_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_PRINT ( " Addon ' "  +  addon_path  +  " ' failed to load. No directory found. Removing from enabled plugins. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-16 17:53:14 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  cf - > load ( addon_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										show_warning ( vformat ( TTR ( " Unable to enable addon plugin at: '%s' parsing of config failed. " ) ,  addon_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-02 11:14:29 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  plugin_version ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( cf - > has_section_key ( " plugin " ,  " version " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										plugin_version  =  cf - > get_value ( " plugin " ,  " version " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! cf - > has_section_key ( " plugin " ,  " script " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										show_warning ( vformat ( TTR ( " Unable to find script field for addon plugin at: '%s'. " ) ,  addon_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  script_path  =  cf - > get_value ( " plugin " ,  " script " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Script >  scr ;  // We need to save it for creating "ep" below.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Only try to load the script if it has a name. Else, the plugin has no init script.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script_path . length ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script_path  =  addon_path . get_base_dir ( ) . path_join ( script_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 15:52:36 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scr  =  ResourceLoader : : load ( script_path ,  " Script " ,  ResourceFormatLoader : : CACHE_MODE_IGNORE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scr . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											show_warning ( vformat ( TTR ( " Unable to load addon script from path: '%s'. " ) ,  script_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:12:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Errors in the script cause the base_type to be an empty StringName.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scr - > get_instance_base_type ( )  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-28 13:56:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( _initializing_plugins )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// However, if it happens during initialization, waiting for file scan might help.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pending_addons . push_back ( p_addon ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											show_warning ( vformat ( TTR ( " Unable to load addon script from path: '%s'. This might be due to a code error in that script. \n Disabling the addon at '%s' to prevent further errors. " ) ,  script_path ,  addon_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_remove_plugin_from_enabled ( addon_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 14:20:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Plugin init scripts must inherit from EditorPlugin and be tools.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-23 16:19:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ClassDB : : is_parent_class ( scr - > get_instance_base_type ( ) ,  " EditorPlugin " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											show_warning ( vformat ( TTR ( " Unable to load addon script from path: '%s'. Base type is not 'EditorPlugin'. " ) ,  script_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! scr - > is_tool ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-23 16:19:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											show_warning ( vformat ( TTR ( " Unable to load addon script from path: '%s'. Script is not in tool mode. " ) ,  script_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 10:40:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorPlugin  * ep  =  memnew ( EditorPlugin ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ep - > set_script ( scr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-02 11:14:29 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ep - > set_plugin_version ( plugin_version ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									addon_name_to_plugin [ addon_path ]  =  ep ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-11 02:59:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( ep ,  p_config_changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_addon_config ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_addon_plugin_enabled ( const  String  & p_addon )  const  {  
						 
					
						
							
								
									
										
										
										
											2022-06-08 19:22:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_addon . begins_with ( " res:// " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  addon_name_to_plugin . has ( p_addon ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  addon_name_to_plugin . has ( " res://addons/ "  +  p_addon  +  " /plugin.cfg " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _remove_edited_scene ( bool  p_change_tab )  {  
						 
					
						
							
								
									
										
										
										
											2023-08-21 14:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// When scene gets closed no node is edited anymore, so make sure the editors are notified before nodes are freed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hide_unused_editors ( SceneTreeDock : : get_singleton ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  new_index  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  old_index  =  new_index ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( new_index  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new_index  =  new_index  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( editor_data . get_edited_scene_count ( )  >  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new_index  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_data . add_edited_scene ( - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										new_index  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_change_tab )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_set_current_scene ( new_index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . remove_scene ( old_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_title ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-10-22 00:23:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _remove_scene ( int  index ,  bool  p_change_tab )  {  
						 
					
						
							
								
									
										
										
										
											2022-05-05 14:27:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Clear icon cache in case some scripts are no longer needed.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:49:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// FIXME: Ideally the cache should never be cleared and only updated on per-script basis, when an icon changes.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . clear_script_icon_cache ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-05 14:27:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 00:23:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( editor_data . get_edited_scene ( )  = =  index )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Scene to remove is current scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_remove_edited_scene ( p_change_tab ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Scene to remove is not active scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-22 00:23:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_data . remove_scene ( index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : set_edited_scene ( Node  * p_scene )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-04 22:03:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_edited_scene_root ( p_scene ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : set_edited_scene_root ( Node  * p_scene ,  bool  p_auto_add )  {  
						 
					
						
							
								
									
										
										
										
											2022-11-13 14:52:37 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * old_edited_scene_root  =  get_editor_data ( ) . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-04 22:03:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( p_scene  & &  p_scene  ! =  old_edited_scene_root  & &  p_scene - > get_parent ( ) ,  " Non-null nodes that are set as edited scene should not have a parent node. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_auto_add  & &  old_edited_scene_root  & &  old_edited_scene_root - > get_parent ( )  = =  scene_root )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scene_root - > remove_child ( old_edited_scene_root ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									get_editor_data ( ) . set_edited_scene_root ( p_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < Popup > ( p_scene ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Object : : cast_to < Popup > ( p_scene ) - > show ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SceneTreeDock : : get_singleton ( ) - > set_edited_scene ( p_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( get_tree ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										get_tree ( ) - > set_edited_scene_root ( p_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-04 22:03:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_auto_add  & &  p_scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scene_root - > add_child ( p_scene ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Dictionary  EditorNode : : _get_main_scene_state ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Dictionary  state ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									state [ " scene_tree_offset " ]  =  SceneTreeDock : : get_singleton ( ) - > get_tree_editor ( ) - > get_scene_tree ( ) - > get_vscroll_bar ( ) - > get_value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									state [ " property_edit_offset " ]  =  InspectorDock : : get_inspector_singleton ( ) - > get_scroll_offset ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									state [ " node_filter " ]  =  SceneTreeDock : : get_singleton ( ) - > get_filter ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  state ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _set_main_scene_state ( Dictionary  p_state ,  Node  * p_for_scene )  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( get_edited_scene ( )  ! =  p_for_scene  & &  p_for_scene  ! =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  // Not for this scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									changing_scene  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 04:45:04 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( get_edited_scene ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  current_tab  =  editor_main_screen - > get_selected_index ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( current_tab  <  2 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Switch between 2D and 3D if currently in 2D or 3D.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * selected_node  =  SceneTreeDock : : get_singleton ( ) - > get_tree_editor ( ) - > get_selected ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! selected_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												selected_node  =  get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 20:27:04 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( Object : : cast_to < CanvasItem > ( selected_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_main_screen - > select ( EditorMainScreen : : EDITOR_2D ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( Object : : cast_to < Node3D > ( selected_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_main_screen - > select ( EditorMainScreen : : EDITOR_3D ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_state . has ( " scene_tree_offset " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SceneTreeDock : : get_singleton ( ) - > get_tree_editor ( ) - > get_scene_tree ( ) - > get_vscroll_bar ( ) - > set_value ( p_state [ " scene_tree_offset " ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_state . has ( " property_edit_offset " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										InspectorDock : : get_inspector_singleton ( ) - > set_scroll_offset ( p_state [ " property_edit_offset " ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_state . has ( " node_filter " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SceneTreeDock : : get_singleton ( ) - > set_filter ( p_state [ " node_filter " ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// This should only happen at the very end.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-17 09:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-07 02:52:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorDebuggerNode : : get_singleton ( ) - > update_live_edit_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ScriptEditor : : get_singleton ( ) - > set_scene_root_script ( editor_data . get_scene_root_script ( editor_data . get_edited_scene ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-09 09:08:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . notify_edited_scene_changed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-27 13:52:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									emit_signal ( SNAME ( " scene_changed " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-30 16:25:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Reset SDFGI after everything else so that any last-second scene modifications will be processed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RenderingServer : : get_singleton ( ) - > sdfgi_reset ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  EditorNode : : is_changing_scene ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  changing_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-12-13 20:39:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _set_current_scene ( int  p_idx )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_idx  = =  editor_data . get_edited_scene ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ;  // Pointless.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_set_current_scene_nocheck ( p_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _set_current_scene_nocheck ( int  p_idx )  {  
						 
					
						
							
								
									
										
										
										
											2021-10-17 13:55:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Save the folding in case the scene gets reloaded.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( editor_data . get_scene_path ( p_idx )  ! =  " "  & &  editor_data . get_edited_scene_root ( p_idx ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-10 14:43:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_folding . save_scene_folding ( editor_data . get_edited_scene_root ( p_idx ) ,  editor_data . get_scene_path ( p_idx ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-10 14:43:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									changing_scene  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_data . save_edited_scene_state ( editor_selection ,  & editor_history ,  _get_main_scene_state ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * old_scene  =  get_editor_data ( ) . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_selection - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_data . set_edited_scene ( p_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * new_scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Remove the scene only if it's a new scene, preventing performance issues when adding and removing scenes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( old_scene  & &  new_scene  ! =  old_scene  & &  old_scene - > get_parent ( )  = =  scene_root )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scene_root - > remove_child ( old_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 18:06:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Popup  * p  =  Object : : cast_to < Popup > ( new_scene ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p - > show ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SceneTreeDock : : get_singleton ( ) - > set_edited_scene ( new_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( get_tree ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										get_tree ( ) - > set_edited_scene_root ( new_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( new_scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( new_scene - > get_parent ( )  ! =  scene_root )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-21 16:46:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scene_root - > add_child ( new_scene ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 20:26:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( editor_data . check_and_update_scene ( p_idx ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! editor_data . get_scene_path ( p_idx ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_folding . load_scene_folding ( editor_data . get_edited_scene_root ( p_idx ) ,  editor_data . get_scene_path ( p_idx ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 13:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorUndoRedoManager : : get_singleton ( ) - > clear_history ( editor_data . get_scene_history_id ( p_idx ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 20:26:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Dictionary  state  =  editor_data . restore_edited_scene_state ( editor_selection ,  & editor_history ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 21:17:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_edit_current ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-11 12:28:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_title ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 21:41:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									callable_mp ( scene_tabs ,  & EditorSceneTabs : : update_scene_tabs ) . call_deferred ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-11 12:28:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-27 07:38:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( tabs_to_close . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 15:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										callable_mp ( this ,  & EditorNode : : _set_main_scene_state ) . call_deferred ( state ,  get_edited_scene ( ) ) ;  // Do after everything else is done setting up.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-27 07:38:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-13 16:51:34 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_undo_redo_allowed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-11 14:57:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : setup_color_picker ( ColorPicker  * p_picker )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_picker - > set_editor_settings ( EditorSettings : : get_singleton ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-13 20:05:20 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  default_color_mode  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " color_picker " ,  " color_mode " ,  EDITOR_GET ( " interface/inspector/default_color_picker_mode " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  picker_shape  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " color_picker " ,  " picker_shape " ,  EDITOR_GET ( " interface/inspector/default_color_picker_shape " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-11 14:57:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_picker - > set_color_mode ( ( ColorPicker : : ColorModeType ) default_color_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_picker - > set_picker_shape ( ( ColorPicker : : PickerShapeType ) picker_shape ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 10:45:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_picker - > set_quick_open_callback ( callable_mp ( this ,  & EditorNode : : _palette_quick_open_dialog ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_picker - > set_palette_saved_callback ( callable_mp ( EditorFileSystem : : get_singleton ( ) ,  & EditorFileSystem : : update_file ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									palette_file_selected_callback  =  callable_mp ( p_picker ,  & ColorPicker : : _quick_open_palette_file_selected ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-30 23:43:46 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_scene_open ( const  String  & p_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( editor_data . get_scene_path ( i )  = =  p_path )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-06 12:41:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_multi_window_enabled ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ! SceneTree : : get_singleton ( ) - > get_root ( ) - > is_embedding_subwindows ( )  & &  ! EDITOR_GET ( " interface/editor/single_window_mode " )  & &  EDITOR_GET ( " interface/multi_window/enable " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : fix_dependencies ( const  String  & p_for_file )  {  
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dependency_fixer - > edit ( p_for_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 19:47:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  EditorNode : : new_scene ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  idx  =  editor_data . add_edited_scene ( - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-13 16:38:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_set_current_scene ( idx ) ;  // Before trying to remove an empty scene, set the current tab index to the newly added tab index.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 01:11:48 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Remove placeholder empty scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( editor_data . get_edited_scene_count ( )  >  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( )  -  1 ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  unsaved  =  EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( editor_data . get_scene_history_id ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-16 02:09:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! unsaved  & &  editor_data . get_scene_path ( i ) . is_empty ( )  & &  editor_data . get_edited_scene_root ( i )  = =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 01:11:48 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												editor_data . remove_scene ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												idx - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 19:47:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . clear_editor_states ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-15 19:47:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 15:11:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  EditorNode : : load_scene ( const  String  & p_scene ,  bool  p_ignore_broken_deps ,  bool  p_set_inherited ,  bool  p_force_open_imported ,  bool  p_silent_change_tab )  {  
						 
					
						
							
								
									
										
										
										
											2014-11-05 21:20:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! is_inside_tree ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										defer_load_scene  =  p_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  lpath  =  ResourceUID : : ensure_path ( p_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_set_inherited )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( editor_data . get_scene_path ( i )  = =  lpath )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_set_current_scene ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-02 23:42:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! p_force_open_imported  & &  FileAccess : : exists ( lpath  +  " .import " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											open_imported - > set_text ( vformat ( TTR ( " Scene '%s' was automatically imported, so it can't be modified. \n To make changes to it, a new inherited scene can be created. " ) ,  lpath . get_file ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											open_imported - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											new_inherited_button - > grab_focus ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											open_import_request  =  lpath ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									lpath  =  ProjectSettings : : get_singleton ( ) - > localize_path ( lpath ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( ! lpath . begins_with ( " res:// " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-05 16:47:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										show_accept ( TTR ( " Error loading scene, it must be inside the project path. Use 'Import' to open the scene, then save it inside the project path. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										opening_prev  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  ERR_FILE_NOT_FOUND ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  prev  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  idx  =  prev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( prev  = =  - 1  | |  editor_data . get_edited_scene_root ( )  | |  ! editor_data . get_scene_path ( prev ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										idx  =  editor_data . add_edited_scene ( - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_silent_change_tab )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_set_current_scene_nocheck ( idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_set_current_scene ( idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 13:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorUndoRedoManager : : get_singleton ( ) - > clear_history ( editor_data . get_current_edited_scene_history_id ( ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dependency_errors . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 10:24:50 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-11 14:18:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < PackedScene >  sdata  =  ResourceLoader : : load ( lpath ,  " " ,  ResourceFormatLoader : : CACHE_MODE_REPLACE ,  & err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_ignore_broken_deps  & &  dependency_errors . has ( lpath ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector < String >  errors ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  String  & E  :  dependency_errors [ lpath ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											errors . push_back ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-02 04:44:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dependency_error - > show ( DependencyErrorDialog : : MODE_SCENE ,  lpath ,  errors ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										opening_prev  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( prev  ! =  - 1  & &  prev  ! =  idx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_set_current_scene ( prev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_data . remove_scene ( idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_FILE_MISSING_DEPENDENCIES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-09 03:15:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! sdata . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_dialog_display_load_error ( lpath ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										opening_prev  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( prev  ! =  - 1  & &  prev  ! =  idx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-09 03:15:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_set_current_scene ( prev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_data . remove_scene ( idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_FILE_NOT_FOUND ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dependency_errors . erase ( lpath ) ;  // At least not self path.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-19 17:00:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < String ,  HashSet < String > >  & E  :  dependency_errors )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  txt  =  vformat ( TTR ( " Scene '%s' has broken dependencies: " ) ,  E . key )  +  " \n " ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  String  & F  :  E . value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											txt  + =  " \t "  +  F  +  " \n " ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-23 20:15:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										add_io_error ( txt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 11:06:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ResourceCache : : has ( lpath ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Used from somewhere else? No problem! Update state and replace sdata.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-22 13:46:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < PackedScene >  ps  =  ResourceCache : : get_ref ( lpath ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 11:06:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ps . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ps - > replace_state ( sdata - > get_state ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ps - > set_last_modified_time ( sdata - > get_last_modified_time ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sdata  =  ps ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 11:06:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sdata - > set_path ( lpath ,  true ) ;  // Take over path.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-14 11:06:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-26 01:14:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-26 21:12:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * new_scene  =  sdata - > instantiate ( p_set_inherited  ?  PackedScene : : GEN_EDIT_STATE_MAIN_INHERITED  :  PackedScene : : GEN_EDIT_STATE_MAIN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! new_scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sdata . unref ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-08 13:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_dialog_display_load_error ( lpath ,  ERR_FILE_CORRUPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										opening_prev  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( prev  ! =  - 1  & &  prev  ! =  idx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_set_current_scene ( prev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_data . remove_scene ( idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-08 13:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  ERR_FILE_CORRUPT ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_set_inherited )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < SceneState >  state  =  sdata - > get_state ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										state - > set_path ( lpath ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										new_scene - > set_scene_inherited_state ( state ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-25 03:06:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										new_scene - > set_scene_file_path ( String ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-28 20:56:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									new_scene - > set_scene_instance_state ( Ref < SceneState > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-10 09:09:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									set_edited_scene ( new_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-14 20:01:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  config_file_path  =  EditorPaths : : get_singleton ( ) - > get_project_settings_dir ( ) . path_join ( lpath . get_file ( )  +  " -editstate- "  +  lpath . md5_text ( )  +  " .cfg " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < ConfigFile >  editor_state_cf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_state_cf . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Error  editor_state_cf_err  =  editor_state_cf - > load ( config_file_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( editor_state_cf_err  = =  OK  | |  editor_state_cf - > has_section ( " editor_states " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_load_editor_plugin_states_from_config ( editor_state_cf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-25 10:46:26 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( editor_folding . has_folding_data ( lpath ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_folding . load_scene_folding ( new_scene ,  lpath ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( EDITOR_GET ( " interface/inspector/auto_unfold_foreign_scenes " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_folding . unfold_scene ( new_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_folding . save_scene_folding ( new_scene ,  lpath ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 16:36:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opening_prev  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-07 02:52:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorDebuggerNode : : get_singleton ( ) - > update_live_edit_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-02 12:29:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-02 04:15:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( restoring_scenes )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-13 16:38:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Initialize history for restored scenes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ObjectID  id  =  new_scene - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( id  ! =  editor_history . get_current ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_history . add_object ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-11 15:55:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Load the selected nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( editor_state_cf - > has_section_key ( " editor_states " ,  " selected_nodes " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										TypedArray < NodePath >  selected_node_list  =  editor_state_cf - > get_value ( " editor_states " ,  " selected_nodes " ,  TypedArray < String > ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  selected_node_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * selected_node  =  new_scene - > get_node_or_null ( selected_node_list [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( selected_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_selection - > add_node ( selected_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! restoring_scenes )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_editor_layout_delayed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_set_inherited )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorUndoRedoManager : : get_singleton ( ) - > set_history_as_unsaved ( editor_data . get_current_edited_scene_history_id ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_title ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 15:57:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! restoring_scenes )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_add_to_recent_scenes ( lpath ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 14:48:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								HashMap < StringName ,  Variant >  EditorNode : : get_modified_properties_for_node ( Node  * p_node ,  bool  p_node_references_only )  {  
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < StringName ,  Variant >  modified_property_map ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < PropertyInfo >  pinfo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_node - > get_property_list ( & pinfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  PropertyInfo  & E  :  pinfo )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E . usage  &  PROPERTY_USAGE_STORAGE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  node_reference  =  ( E . type  = =  Variant : : OBJECT  & &  E . hint  = =  PROPERTY_HINT_NODE_TYPE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_node_references_only  & &  ! node_reference )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  is_valid_revert  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  revert_value  =  EditorPropertyRevert : : get_property_revert_value ( p_node ,  E . name ,  & is_valid_revert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  current_value  =  p_node - > get ( E . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( is_valid_revert )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-19 00:17:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( PropertyUtils : : is_property_value_different ( p_node ,  current_value ,  revert_value ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													// If this property is a direct node reference, save a NodePath instead to prevent corrupted references.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( node_reference )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Node  * target_node  =  Object : : cast_to < Node > ( current_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( target_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															modified_property_map [ E . name ]  =  p_node - > get_path_to ( target_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														modified_property_map [ E . name ]  =  current_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  modified_property_map ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								HashMap < StringName ,  Variant >  EditorNode : : get_modified_properties_reference_to_nodes ( Node  * p_node ,  List < Node  * >  & p_nodes_referenced_by )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < StringName ,  Variant >  modified_property_map ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < PropertyInfo >  pinfo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_node - > get_property_list ( & pinfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  PropertyInfo  & E  :  pinfo )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E . usage  &  PROPERTY_USAGE_STORAGE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E . type  ! =  Variant : : OBJECT  | |  E . hint  ! =  PROPERTY_HINT_NODE_TYPE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  current_value  =  p_node - > get ( E . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * target_node  =  Object : : cast_to < Node > ( current_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( target_node  & &  p_nodes_referenced_by . find ( target_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												modified_property_map [ E . name ]  =  p_node - > get_path_to ( target_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  modified_property_map ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : update_node_from_node_modification_entry ( Node  * p_node ,  ModificationNodeEntry  & p_node_modification )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// First, attempt to restore the script property since it may affect the get_property_list method.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Variant  * script_property_table_entry  =  p_node_modification . property_table . getptr ( CoreStringName ( script ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script_property_table_entry )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_node - > set_script ( * script_property_table_entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Get properties for this node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < PropertyInfo >  pinfo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_node - > get_property_list ( & pinfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Get names of all valid property names.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < StringName ,  bool >  property_node_reference_table ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  PropertyInfo  & E  :  pinfo )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E . usage  &  PROPERTY_USAGE_STORAGE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( E . type  = =  Variant : : OBJECT  & &  E . hint  = =  PROPERTY_HINT_NODE_TYPE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													property_node_reference_table [ E . name ]  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													property_node_reference_table [ E . name ]  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Restore the modified properties for this node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  Variant >  & E  :  p_node_modification . property_table )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  * property_node_reference_table_entry  =  property_node_reference_table . getptr ( E . key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( property_node_reference_table_entry )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If the property is a node reference, attempt to restore from the node path instead.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  is_node_reference  =  * property_node_reference_table_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( is_node_reference )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( E . value . get_type ( )  = =  Variant : : NODE_PATH )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														p_node - > set ( E . key ,  p_node - > get_node_or_null ( E . value ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_node - > set ( E . key ,  E . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Restore the connections to other nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  ConnectionWithNodePath  & E  :  p_node_modification . connections_to )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Connection  conn  =  E . connection ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get the node the callable is targeting.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * target_node  =  Object : : cast_to < Node > ( conn . callable . get_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If the callable object no longer exists or is marked for deletion,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// attempt to reaccquire the closest match by using the node path
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// we saved earlier.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! target_node  | |  ! target_node - > is_queued_for_deletion ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												target_node  =  p_node - > get_node_or_null ( E . node_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( target_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Reconstruct the callable.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable  new_callable  =  Callable ( target_node ,  conn . callable . get_method ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! p_node - > is_connected ( conn . signal . get_name ( ) ,  new_callable ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ERR_FAIL_COND ( p_node - > connect ( conn . signal . get_name ( ) ,  new_callable ,  conn . flags )  ! =  OK ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Restore the connections from other nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  Connection  & E  :  p_node_modification . connections_from )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Connection  conn  =  E ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  valid  =  p_node - > has_method ( conn . callable . get_method ( ) )  | |  Ref < Script > ( p_node - > get_script ( ) ) . is_null ( )  | |  Ref < Script > ( p_node - > get_script ( ) ) - > has_method ( conn . callable . get_method ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_CONTINUE_MSG ( ! valid ,  vformat ( " Attempt to connect signal '%s.%s' to nonexistent method '%s.%s'. " ,  conn . signal . get_object ( ) - > get_class ( ) ,  conn . signal . get_name ( ) ,  conn . callable . get_object ( ) - > get_class ( ) ,  conn . callable . get_method ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Get the object which the signal is connected from.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Object  * source_object  =  conn . signal . get_object ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( source_object )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_FAIL_COND ( source_object - > connect ( conn . signal . get_name ( ) ,  Callable ( p_node ,  conn . callable . get_method ( ) ) ,  conn . flags )  ! =  OK ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Re-add the groups.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  Node : : GroupInfo  & E  :  p_node_modification . groups )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_node - > add_to_group ( E . name ,  E . persistent ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_additional_node_in_scene ( Node  * p_edited_scene ,  Node  * p_reimported_root ,  Node  * p_node )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_node  = =  p_reimported_root )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  node_part_of_subscene  =  p_node  ! =  p_edited_scene  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_edited_scene - > get_scene_inherited_state ( ) . is_valid ( )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_edited_scene - > get_scene_inherited_state ( ) - > find_node_by_path ( p_edited_scene - > get_path_to ( p_node ) )  > =  0  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// It's important to process added nodes from the base scene in the inherited scene as
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// additional nodes to ensure they do not disappear on reload.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// When p_reimported_root == p_edited_scene that means the edited scene
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// is the reimported scene, in that case the node is in the root base scene,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// so it's not an addition, otherwise, the node would be added twice on reload.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											( p_node - > get_owner ( )  ! =  p_edited_scene  | |  p_reimported_root  = =  p_edited_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( node_part_of_subscene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Loop through the owners until either we reach the root node or nullptr
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * valid_node_owner  =  p_node - > get_owner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( valid_node_owner )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( valid_node_owner  = =  p_reimported_root )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										valid_node_owner  =  valid_node_owner - > get_owner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// When the owner is the imported scene and the owner is also the edited scene,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// that means the node was added in the current edited scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// We can be sure here because if the node that the node does not come from
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// the base scene because we checked just over with 'get_scene_inherited_state()->find_node_by_path'.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( valid_node_owner  = =  p_reimported_root  & &  p_reimported_root  ! =  p_edited_scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : get_scene_editor_data_for_node ( Node  * p_root ,  Node  * p_node ,  HashMap < NodePath ,  SceneEditorDataEntry >  & p_table )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SceneEditorDataEntry  new_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_entry . is_display_folded  =  p_node - > is_displayed_folded ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_root  ! =  p_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new_entry . is_editable  =  p_root - > is_editable_instance ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_table . insert ( p_root - > get_path_to ( p_node ) ,  new_entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										get_scene_editor_data_for_node ( p_root ,  p_node - > get_child ( i ) ,  p_table ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : get_preload_scene_modification_table (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * p_edited_scene , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * p_reimported_root , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * p_node ,  InstanceModificationsEntry  & p_instance_modifications )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( is_additional_node_in_scene ( p_edited_scene ,  p_reimported_root ,  p_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Only save additional nodes which have an owner since this was causing issues transient ownerless nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// which get recreated upon scene tree entry.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// For now instead, assume all ownerless nodes are transient and will have to be recreated.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_node - > get_owner ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  Variant >  modified_properties  =  get_modified_properties_for_node ( p_node ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_node - > get_owner ( )  = =  p_edited_scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												AdditiveNodeEntry  new_additive_node_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_additive_node_entry . node  =  p_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_additive_node_entry . parent  =  p_reimported_root - > get_path_to ( p_node - > get_parent ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_additive_node_entry . owner  =  p_node - > get_owner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_additive_node_entry . index  =  p_node - > get_index ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node2D  * node_2d  =  Object : : cast_to < Node2D > ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( node_2d )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													new_additive_node_entry . transform_2d  =  node_2d - > get_transform ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node3D  * node_3d  =  Object : : cast_to < Node3D > ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( node_3d )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													new_additive_node_entry . transform_3d  =  node_3d - > get_transform ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_instance_modifications . addition_list . push_back ( new_additive_node_entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! modified_properties . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ModificationNodeEntry  modification_node_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												modification_node_entry . property_table  =  modified_properties ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_instance_modifications . modifications [ p_reimported_root - > get_path_to ( p_node ) ]  =  modification_node_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < StringName ,  Variant >  modified_properties  =  get_modified_properties_for_node ( p_node ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Find all valid connections to other nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < Connection >  connections_to ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_node - > get_all_signal_connections ( & connections_to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < ConnectionWithNodePath >  valid_connections_to ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  Connection  & c  :  connections_to )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * connection_target_node  =  Object : : cast_to < Node > ( c . callable . get_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( connection_target_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// TODO: add support for reinstating custom callables
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! c . callable . is_custom ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ConnectionWithNodePath  connection_to ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													connection_to . connection  =  c ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													connection_to . node_path  =  p_node - > get_path_to ( connection_target_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													valid_connections_to . push_back ( connection_to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Find all valid connections from other nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < Connection >  connections_from ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_node - > get_signals_connected_to_this ( & connections_from ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < Connection >  valid_connections_from ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  Connection  & c  :  connections_from )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * source_node  =  Object : : cast_to < Node > ( c . signal . get_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * valid_source_owner  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( source_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												valid_source_owner  =  source_node - > get_owner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												while  ( valid_source_owner )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( valid_source_owner  = =  p_reimported_root )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													valid_source_owner  =  valid_source_owner - > get_owner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! source_node  | |  valid_source_owner  = =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// TODO: add support for reinstating custom callables
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! c . callable . is_custom ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													valid_connections_from . push_back ( c ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Find all node groups.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < Node : : GroupInfo >  groups ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_node - > get_groups ( & groups ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! modified_properties . is_empty ( )  | |  ! valid_connections_to . is_empty ( )  | |  ! valid_connections_from . is_empty ( )  | |  ! groups . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ModificationNodeEntry  modification_node_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											modification_node_entry . property_table  =  modified_properties ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											modification_node_entry . connections_to  =  valid_connections_to ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											modification_node_entry . connections_from  =  valid_connections_from ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											modification_node_entry . groups  =  groups ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_instance_modifications . modifications [ p_reimported_root - > get_path_to ( p_node ) ]  =  modification_node_entry ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										get_preload_scene_modification_table ( p_edited_scene ,  p_reimported_root ,  p_node - > get_child ( i ) ,  p_instance_modifications ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : get_preload_modifications_reference_to_nodes (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * p_root , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * p_node , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashSet < Node  * >  & p_excluded_nodes , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < Node  * >  & p_instance_list_with_children , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < NodePath ,  ModificationNodeEntry >  & p_modification_table )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_excluded_nodes . find ( p_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < StringName ,  Variant >  modified_properties  =  get_modified_properties_reference_to_nodes ( p_node ,  p_instance_list_with_children ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! modified_properties . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ModificationNodeEntry  modification_node_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											modification_node_entry . property_table  =  modified_properties ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_modification_table [ p_root - > get_path_to ( p_node ) ]  =  modification_node_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											get_preload_modifications_reference_to_nodes ( p_root ,  p_node - > get_child ( i ) ,  p_excluded_nodes ,  p_instance_list_with_children ,  p_modification_table ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : get_children_nodes ( Node  * p_node ,  List < Node  * >  & p_nodes )  {  
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * child  =  p_node - > get_child ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_nodes . push_back ( child ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										get_children_nodes ( child ,  p_nodes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 16:50:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : replace_history_reimported_nodes ( Node  * p_original_root_node ,  Node  * p_new_root_node ,  Node  * p_node )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NodePath  scene_path_to_node  =  p_original_root_node - > get_path_to ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * new_node  =  p_new_root_node - > get_node_or_null ( scene_path_to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( new_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_history . replace_object ( p_node - > get_instance_id ( ) ,  new_node - > get_instance_id ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_history . replace_object ( p_node - > get_instance_id ( ) ,  ObjectID ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										replace_history_reimported_nodes ( p_original_root_node ,  p_new_root_node ,  p_node - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 16:50:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-30 18:42:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : open_request ( const  String  & p_path ,  bool  p_set_inherited )  {  
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! opening_prev )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < String > : : Element  * prev_scene_item  =  previous_scenes . find ( p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( prev_scene_item  ! =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											prev_scene_item - > erase ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-30 18:42:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_scene ( p_path ,  false ,  p_set_inherited ) ;  // As it will be opened in separate tab.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : has_previous_scenes ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ! previous_scenes . is_empty ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : edit_foreign_resource ( Ref < Resource >  p_resource )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-25 01:17:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_scene ( p_resource - > get_path ( ) . get_slice ( " :: " ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 15:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									callable_mp ( InspectorDock : : get_singleton ( ) ,  & InspectorDock : : edit_resource ) . call_deferred ( p_resource ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-25 01:17:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 10:14:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_resource_read_only ( Ref < Resource >  p_resource ,  bool  p_foreign_resources_are_writable )  {  
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( p_resource . is_null ( ) ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  path  =  p_resource - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! path . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If the resource name contains '::', that means it is a subresource embedded in another resource.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  srpos  =  path . find ( " :: " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( srpos  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  base  =  path . substr ( 0 ,  srpos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If the base resource is a packed scene, we treat it as read-only if it is not the currently edited scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ResourceLoader : : get_resource_type ( base )  = =  " PackedScene " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! get_tree ( ) - > get_edited_scene_root ( )  | |  get_tree ( ) - > get_edited_scene_root ( ) - > get_scene_file_path ( )  ! =  base )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 10:14:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													// If we have not flagged foreign resources as writable or the base scene the resource is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// part was imported, it can be considered read-only.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! p_foreign_resources_are_writable  | |  FileAccess : : exists ( base  +  " .import " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If a corresponding .import file exists for the base file, we assume it to be imported and should therefore treated as read-only.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( FileAccess : : exists ( base  +  " .import " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-17 13:55:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( FileAccess : : exists ( path  +  " .import " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// The resource is not a subresource, but if it has an .import file, it's imported so treat it as read only.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-17 13:55:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-29 07:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-16 00:13:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : request_instantiate_scene ( const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SceneTreeDock : : get_singleton ( ) - > instantiate ( p_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : request_instantiate_scenes ( const  Vector < String >  & p_files )  {  
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SceneTreeDock : : get_singleton ( ) - > instantiate_scenes ( p_files ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-06 12:41:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  EditorNode : : get_multiwindow_support_tooltip_text ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( SceneTree : : get_singleton ( ) - > get_root ( ) - > is_embedding_subwindows ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( DisplayServer : : get_singleton ( ) - > has_feature ( DisplayServer : : FEATURE_SUBWINDOWS ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  TTR ( " Multi-window support is not available because the `--single-window` command line argument was used to start the editor. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  TTR ( " Multi-window support is not available because the current platform doesn't support multiple windows. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( EDITOR_GET ( " interface/editor/single_window_mode " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  TTR ( " Multi-window support is not available because Interface > Editor > Single Window Mode is enabled in the editor settings. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  TTR ( " Multi-window support is not available because Interface > Multi Window > Enable is disabled in the editor settings. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-07 23:35:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _inherit_request ( String  p_file )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current_menu_option  =  FILE_NEW_INHERITED_SCENE ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-07 23:35:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_dialog_action ( p_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _instantiate_request ( const  Vector < String >  & p_files )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									request_instantiate_scenes ( p_files ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _close_messages ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									old_split_ofs  =  center_split - > get_split_offset ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									center_split - > set_split_offset ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _show_messages ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split - > set_split_offset ( old_split_ofs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _add_to_recent_scenes ( const  String  & p_scene )  {  
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Array  rc  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " recent_files " ,  " scenes " ,  Array ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 00:04:13 +05:45 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc . has ( p_scene ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc . erase ( p_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc . push_front ( p_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc . size ( )  >  10 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										rc . resize ( 10 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorSettings : : get_singleton ( ) - > set_project_metadata ( " recent_files " ,  " scenes " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									_update_recent_scenes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _open_recent_scene ( int  p_idx )  {  
						 
					
						
							
								
									
										
										
										
											2017-10-11 19:35:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_idx  = =  recent_scenes - > get_item_count ( )  -  1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorSettings : : get_singleton ( ) - > set_project_metadata ( " recent_files " ,  " scenes " ,  Array ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-18 15:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										callable_mp ( this ,  & EditorNode : : _update_recent_scenes ) . call_deferred ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-11 19:35:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Array  rc  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " recent_files " ,  " scenes " ,  Array ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-11 19:35:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_FAIL_INDEX ( p_idx ,  rc . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( load_scene ( rc [ p_idx ] )  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-03 16:17:03 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc . remove_at ( p_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorSettings : : get_singleton ( ) - > set_project_metadata ( " recent_files " ,  " scenes " ,  rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_recent_scenes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-11 19:35:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _update_recent_scenes ( )  {  
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Array  rc  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " recent_files " ,  " scenes " ,  Array ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									recent_scenes - > clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-11 19:35:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  path ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  rc . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-09 10:42:45 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										path  =  rc [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										recent_scenes - > add_item ( path . replace ( " res:// " ,  " " ) ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-11 19:35:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									recent_scenes - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									recent_scenes - > add_shortcut ( ED_SHORTCUT ( " editor/clear_recent " ,  TTRC ( " Clear Recent Scenes " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-06 00:57:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									recent_scenes - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _quick_opened ( const  String  & p_file_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ClassDB : : is_parent_class ( ResourceLoader : : get_resource_type ( p_file_path ) ,  " PackedScene " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										open_request ( p_file_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										load_resource ( p_file_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-08 08:27:34 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _project_run_started ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( bool ( EDITOR_GET ( " run/output/always_clear_output_on_play " ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										log - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-22 19:22:06 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  action_on_play  =  EDITOR_GET ( " run/bottom_panel/action_on_play " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( action_on_play  = =  ACTION_ON_PLAY_OPEN_OUTPUT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:22:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bottom_panel - > make_item_visible ( log ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-22 19:22:06 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( action_on_play  = =  ACTION_ON_PLAY_OPEN_DEBUGGER )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bottom_panel - > make_item_visible ( EditorDebuggerNode : : get_singleton ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _project_run_stopped ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-22 19:22:06 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  action_on_stop  =  EDITOR_GET ( " run/bottom_panel/action_on_stop " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( action_on_stop  = =  ACTION_ON_STOP_CLOSE_BUTTOM_PANEL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bottom_panel - > hide_bottom_panel ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-07 02:52:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : notify_all_debug_sessions_exited ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_run_bar - > stop_playing ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : add_io_error ( const  String  & p_error )  {  
						 
					
						
							
								
									
										
										
										
											2023-01-19 13:45:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DEV_ASSERT ( Thread : : get_caller_id ( )  = =  Thread : : get_main_id ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > load_errors - > add_image ( singleton - > theme - > get_icon ( SNAME ( " Error " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-17 14:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > load_errors - > add_text ( p_error  +  " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-10 19:07:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// When a progress dialog is displayed, we will wait for it ot close before displaying
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// the io errors to prevent the io popup to set it's parent to the progress dialog.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( singleton - > progress_dialog - > is_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										singleton - > load_errors_queued_to_display  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_ratio ( singleton - > load_error_dialog ,  0.5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-07 13:44:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : add_io_warning ( const  String  & p_warning )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DEV_ASSERT ( Thread : : get_caller_id ( )  = =  Thread : : get_main_id ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > load_errors - > add_image ( singleton - > theme - > get_icon ( SNAME ( " Warning " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-07 13:44:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > load_errors - > add_text ( p_warning  +  " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-10 19:07:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// When a progress dialog is displayed, we will wait for it ot close before displaying
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// the io errors to prevent the io popup to set it's parent to the progress dialog.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( singleton - > progress_dialog - > is_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										singleton - > load_errors_queued_to_display  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_ratio ( singleton - > load_error_dialog ,  0.5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-07 13:44:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : _find_scene_in_use ( Node  * p_node ,  const  String  & p_path )  const  {  
						 
					
						
							
								
									
										
										
										
											2021-09-30 16:30:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_node - > get_scene_file_path ( )  = =  p_path )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-19 02:23:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( _find_scene_in_use ( p_node - > get_child ( i ) ,  p_path ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-19 02:23:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_scene_in_use ( const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2014-06-19 02:23:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * es  =  get_edited_scene ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( es )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  _find_scene_in_use ( es ,  p_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-19 02:23:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								OS : : ProcessID  EditorNode : : has_child_process ( OS : : ProcessID  p_pid )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  project_run_bar - > has_child_process ( p_pid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-07 02:52:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : stop_child_process ( OS : : ProcessID  p_pid )  {  
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_run_bar - > stop_child_process ( p_pid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Script >  EditorNode : : get_object_custom_type_base ( const  Object  * p_object )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_V ( p_object ,  nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-25 00:32:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  Node  * node  =  Object : : cast_to < const  Node > ( p_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( node  & &  node - > has_meta ( SceneStringName ( _custom_type_script ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  node - > get_meta ( SceneStringName ( _custom_type_script ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Script >  scr  =  p_object - > get_script ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Uncommenting would break things! Consider adding a parameter if you need it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// StringName name = EditorNode::get_editor_data().script_class_get_name(base_script->get_path());
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-16 13:56:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// if (name != StringName()) {
 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// 	return name;
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-16 13:56:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// }
 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO: Should probably be deprecated in 4.x
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										StringName  base  =  scr - > get_instance_base_type ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( base  ! =  StringName ( )  & &  EditorNode : : get_editor_data ( ) . get_custom_types ( ) . has ( base ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  Vector < EditorData : : CustomType >  & types  =  EditorNode : : get_editor_data ( ) . get_custom_types ( ) [ base ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < Script >  base_scr  =  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											while  ( base_scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  types . size ( ) ;  + + i )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( types [ i ] . script  = =  base_scr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														return  types [ i ] . script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												base_scr  =  base_scr - > get_base_script ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								StringName  EditorNode : : get_object_custom_type_name ( const  Object  * p_object )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_V ( p_object ,  StringName ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Script >  scr  =  p_object - > get_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( scr . is_null ( )  & &  Object : : cast_to < Script > ( p_object ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scr  =  p_object ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < Script >  base_scr  =  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( base_scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											StringName  name  =  EditorNode : : get_editor_data ( ) . script_class_get_name ( base_scr - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( name  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// TODO: Should probably be deprecated in 4.x.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											StringName  base  =  base_scr - > get_instance_base_type ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( base  ! =  StringName ( )  & &  EditorNode : : get_editor_data ( ) . get_custom_types ( ) . has ( base ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  Vector < EditorData : : CustomType >  & types  =  EditorNode : : get_editor_data ( ) . get_custom_types ( ) [ base ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  types . size ( ) ;  + + i )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( types [ i ] . script  = =  base_scr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														return  types [ i ] . name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											base_scr  =  base_scr - > get_base_script ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-19 22:21:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  StringName ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-07 00:10:07 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _pick_main_scene_custom_action ( const  String  & p_custom_action_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_custom_action_name  = =  " select_current " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * scene  =  editor_data . get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											show_accept ( TTR ( " There is no defined scene to run. " ) ,  TTR ( " OK " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pick_main_scene - > hide ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-21 22:56:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! FileAccess : : exists ( scene - > get_scene_file_path ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current_menu_option  =  FILE_SAVE_AND_RUN_MAIN_SCENE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_menu_option_confirm ( FILE_SAVE_AS_SCENE ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											file - > set_title ( TTR ( " Save scene before running... " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current_menu_option  =  SETTINGS_PICK_MAIN_SCENE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_dialog_action ( scene - > get_scene_file_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-07 00:10:07 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-08 15:03:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Texture2D >  EditorNode : : _get_class_or_script_icon ( const  String  & p_class ,  const  Ref < Script >  & p_script ,  const  String  & p_fallback ,  bool  p_fallback_script_to_theme )  {  
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V_MSG ( p_class . is_empty ( ) ,  nullptr ,  " Class name cannot be empty. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorData  & ed  =  EditorNode : : get_editor_data ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Check for a script icon first.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < Texture2D >  script_icon  =  ed . get_script_icon ( p_script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script_icon . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  script_icon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-08 15:03:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_fallback_script_to_theme )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 15:20:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Look for the native base type in the editor theme. This is relevant for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// scripts extending other scripts and for built-in classes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  script_class_name  =  p_script - > get_language ( ) - > get_global_class_name ( p_script - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-17 06:06:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  base_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( script_class_name . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base_type  =  p_script - > get_instance_base_type ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base_type  =  ScriptServer : : get_global_class_native_base ( script_class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( theme . is_valid ( )  & &  theme - > has_icon ( base_type ,  EditorStringName ( EditorIcons ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  theme - > get_icon ( base_type ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-08 15:03:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Script was not valid or didn't yield any useful values, try the class name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// directly.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Check if the class name is an extension-defined type.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < Texture2D >  ext_icon  =  ed . extension_class_get_icon ( p_class ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ext_icon . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ext_icon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Check if the class name is a custom type.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// TODO: Should probably be deprecated in 4.x
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  EditorData : : CustomType  * ctype  =  ed . get_custom_type_by_name ( p_class ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ctype  & &  ctype - > icon . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ctype - > icon ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Look up the class name or the fallback name in the editor theme.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This is only relevant for built-in classes.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( theme . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( theme - > has_icon ( p_class ,  EditorStringName ( EditorIcons ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  theme - > get_icon ( p_class ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! p_fallback . is_empty ( )  & &  theme - > has_icon ( p_fallback ,  EditorStringName ( EditorIcons ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  theme - > get_icon ( p_fallback ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-01 20:04:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If the fallback is empty or wasn't found, use the default fallback.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ClassDB : : class_exists ( p_class ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  instantiable  =  ! ClassDB : : is_virtual ( p_class )  & &  ClassDB : : can_instantiate ( p_class ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ClassDB : : is_parent_class ( p_class ,  SNAME ( " Node " ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  theme - > get_icon ( instantiable  ?  " Node "  :  " NodeDisabled " ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-01 20:04:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  theme - > get_icon ( instantiable  ?  " Object "  :  " ObjectDisabled " ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-01 20:04:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Texture2D >  EditorNode : : get_object_icon ( const  Object  * p_object ,  const  String  & p_fallback )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_NULL_V_MSG ( p_object ,  nullptr ,  " Object cannot be null. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-06 17:53:24 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Script >  scr  =  p_object - > get_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( scr . is_null ( )  & &  p_object - > is_class ( " Script " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scr  =  p_object ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  _get_class_or_script_icon ( p_object - > get_class ( ) ,  scr ,  p_fallback ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Texture2D >  EditorNode : : get_class_icon ( const  String  & p_class ,  const  String  & p_fallback )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND_V_MSG ( p_class . is_empty ( ) ,  nullptr ,  " Class name cannot be empty. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-25 02:13:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 21:17:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Script >  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ScriptServer : : is_global_class ( p_class ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scr  =  EditorNode : : get_editor_data ( ) . script_class_load_script ( p_class ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-17 06:06:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( ResourceLoader : : exists ( p_class ) )  {  // If the script is not a class_name we check if the script resource exists.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scr  =  ResourceLoader : : load ( p_class ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-08 15:03:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  _get_class_or_script_icon ( p_class ,  scr ,  p_fallback ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-02 16:40:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 00:16:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_object_of_custom_type ( const  Object  * p_object ,  const  StringName  & p_class )  {  
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_V ( p_object ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 00:16:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < Script >  scr  =  p_object - > get_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( scr . is_null ( )  & &  Object : : cast_to < Script > ( p_object ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scr  =  p_object ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < Script >  base_script  =  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( base_script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											StringName  name  =  EditorNode : : get_editor_data ( ) . script_class_get_name ( base_script - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( name  = =  p_class )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											base_script  =  base_script - > get_base_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 08:59:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : progress_add_task ( const  String  & p_task ,  const  String  & p_label ,  int  p_steps ,  bool  p_can_cancel )  {  
						 
					
						
							
								
									
										
										
										
											2024-01-11 20:47:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! singleton )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( singleton - > cmdline_export_mode )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										print_line ( p_task  +  " : begin:  "  +  p_label  +  "  steps:  "  +  itos ( p_steps ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-11 10:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( singleton - > progress_dialog )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > progress_dialog - > add_task ( p_task ,  p_label ,  p_steps ,  p_can_cancel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 08:59:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : progress_task_step ( const  String  & p_task ,  const  String  & p_state ,  int  p_step ,  bool  p_force_refresh )  {  
						 
					
						
							
								
									
										
										
										
											2024-01-11 20:47:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! singleton )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( singleton - > cmdline_export_mode )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										print_line ( " \t "  +  p_task  +  " : step  "  +  itos ( p_step )  +  " :  "  +  p_state ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-11 10:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( singleton - > progress_dialog )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  singleton - > progress_dialog - > task_step ( p_task ,  p_state ,  p_step ,  p_force_refresh ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-11 10:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : progress_end_task ( const  String  & p_task )  {  
						 
					
						
							
								
									
										
										
										
											2024-01-11 20:47:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! singleton )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( singleton - > cmdline_export_mode )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										print_line ( p_task  +  " : end " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-11 10:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( singleton - > progress_dialog )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-28 08:45:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > progress_dialog - > end_task ( p_task ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : progress_add_task_bg ( const  String  & p_task ,  const  String  & p_label ,  int  p_steps )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > progress_hb - > add_task ( p_task ,  p_label ,  p_steps ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : progress_task_step_bg ( const  String  & p_task ,  int  p_step )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > progress_hb - > task_step ( p_task ,  p_step ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : progress_end_task_bg ( const  String  & p_task )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									singleton - > progress_hb - > end_task ( p_task ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-10 19:07:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _progress_dialog_visibility_changed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Open the io errors after the progress dialog is closed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( load_errors_queued_to_display  & &  ! progress_dialog - > is_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_ratio ( singleton - > load_error_dialog ,  0.5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										load_errors_queued_to_display  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 15:11:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _load_error_dialog_visibility_changed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! load_error_dialog - > is_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										load_errors - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  EditorNode : : _get_system_info ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  distribution_name  =  OS : : get_singleton ( ) - > get_distribution_name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( distribution_name . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										distribution_name  =  OS : : get_singleton ( ) - > get_name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( distribution_name . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										distribution_name  =  " Other " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-13 17:16:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  String  distribution_version  =  OS : : get_singleton ( ) - > get_version_alias ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  godot_version  =  " Godot v "  +  String ( VERSION_FULL_CONFIG ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( String ( VERSION_BUILD )  ! =  " official " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  hash  =  String ( VERSION_HASH ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hash  =  hash . is_empty ( )  ?  String ( " unknown " )  :  vformat ( " (%s) " ,  hash . left ( 9 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										godot_version  + =  "   "  +  hash ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  display_session_type ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-12 23:12:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef LINUXBSD_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// `replace` is necessary, because `capitalize` introduces a whitespace between "x" and "11".
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									display_session_type  =  OS : : get_singleton ( ) - > get_environment ( " XDG_SESSION_TYPE " ) . capitalize ( ) . replace ( "   " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-12 23:12:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // LINUXBSD_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2024-08-21 09:56:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  driver_name  =  OS : : get_singleton ( ) - > get_current_rendering_driver_name ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  rendering_method  =  OS : : get_singleton ( ) - > get_current_rendering_method ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-06 23:29:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  String  rendering_device_name  =  RenderingServer : : get_singleton ( ) - > get_video_adapter_name ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RenderingDevice : : DeviceType  device_type  =  RenderingServer : : get_singleton ( ) - > get_video_adapter_type ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  device_type_string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( device_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RenderingDevice : : DeviceType : : DEVICE_TYPE_INTEGRATED_GPU : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											device_type_string  =  " integrated " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RenderingDevice : : DeviceType : : DEVICE_TYPE_DISCRETE_GPU : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											device_type_string  =  " dedicated " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RenderingDevice : : DeviceType : : DEVICE_TYPE_VIRTUAL_GPU : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											device_type_string  =  " virtual " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RenderingDevice : : DeviceType : : DEVICE_TYPE_CPU : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											device_type_string  =  " (software emulation on CPU) " ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RenderingDevice : : DeviceType : : DEVICE_TYPE_OTHER : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  RenderingDevice : : DeviceType : : DEVICE_TYPE_MAX : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ;  // Can't happen, but silences warning for DEVICE_TYPE_MAX
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  Vector < String >  video_adapter_driver_info  =  OS : : get_singleton ( ) - > get_video_adapter_driver_info ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  String  processor_name  =  OS : : get_singleton ( ) - > get_processor_name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  int  processor_count  =  OS : : get_singleton ( ) - > get_processor_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Prettify
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rendering_method  = =  " forward_plus " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rendering_method  =  " Forward+ " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( rendering_method  = =  " mobile " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rendering_method  =  " Mobile " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( rendering_method  = =  " gl_compatibility " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rendering_method  =  " Compatibility " ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-13 16:54:45 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( driver_name  = =  " vulkan " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										driver_name  =  " Vulkan " ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 09:56:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( driver_name  = =  " d3d12 " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										driver_name  =  " Direct3D 12 " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( driver_name  = =  " opengl3_angle " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										driver_name  =  " OpenGL ES 3/ANGLE " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( driver_name  = =  " opengl3_es " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										driver_name  =  " OpenGL ES 3 " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( driver_name  = =  " opengl3 " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-03 15:35:25 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( OS : : get_singleton ( ) - > get_gles_over_gl ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 09:56:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											driver_name  =  " OpenGL 3 " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											driver_name  =  " OpenGL ES 3 " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-20 05:52:00 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( driver_name  = =  " metal " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										driver_name  =  " Metal " ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Join info.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < String >  info ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									info . push_back ( godot_version ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  distribution_display_session_type  =  distribution_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! distribution_version . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										distribution_display_session_type  + =  "   "  +  distribution_version ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! display_session_type . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										distribution_display_session_type  + =  "  on  "  +  display_session_type ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-12 23:12:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									info . push_back ( distribution_display_session_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  display_driver_window_mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef LINUXBSD_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// `replace` is necessary, because `capitalize` introduces a whitespace between "x" and "11".
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									display_driver_window_mode  =  DisplayServer : : get_singleton ( ) - > get_name ( ) . capitalize ( ) . replace ( "   " ,  " " )  +  "  display driver " ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-12 23:12:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // LINUXBSD_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! display_driver_window_mode . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										display_driver_window_mode  + =  " ,  " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									display_driver_window_mode  + =  get_viewport ( ) - > is_embedding_subwindows ( )  ?  " Single-window "  :  " Multi-window " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( DisplayServer : : get_singleton ( ) - > get_screen_count ( )  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										display_driver_window_mode  + =  " ,  "  +  itos ( DisplayServer : : get_singleton ( ) - > get_screen_count ( ) )  +  "  monitor " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										display_driver_window_mode  + =  " ,  "  +  itos ( DisplayServer : : get_singleton ( ) - > get_screen_count ( ) )  +  "  monitors " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									info . push_back ( display_driver_window_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									info . push_back ( vformat ( " %s (%s) " ,  driver_name ,  rendering_method ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  graphics ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! device_type_string . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graphics  =  device_type_string  +  "   " ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graphics  + =  rendering_device_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( video_adapter_driver_info . size ( )  = =  2 )  {  // This vector is always either of length 0 or 2.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-18 17:40:56 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  String  & vad_name  =  video_adapter_driver_info [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  String  & vad_version  =  video_adapter_driver_info [ 1 ] ;  // Version could be potentially empty on Linux/BSD.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! vad_version . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											graphics  + =  vformat ( "  (%s; %s) " ,  vad_name ,  vad_version ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 16:18:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ! vad_name . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											graphics  + =  vformat ( "  (%s) " ,  vad_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									info . push_back ( graphics ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-20 17:07:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									info . push_back ( vformat ( " %s (%d threads) " ,  processor_name ,  processor_count ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  String ( "  -  " ) . join ( info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-27 18:21:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-08 15:13:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : _should_display_update_spinner ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEV_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  bool  in_dev  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  bool  in_dev  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  int  show_update_spinner_setting  =  EDITOR_GET ( " interface/editor/show_update_spinner " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ( show_update_spinner_setting  = =  0  & &  in_dev )  | |  show_update_spinner_setting  = =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Texture2D >  EditorNode : : _file_dialog_get_icon ( const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2017-01-14 11:07:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileSystemDirectory  * efsd  =  EditorFileSystem : : get_singleton ( ) - > get_filesystem_path ( p_path . get_base_dir ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( efsd )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  file  =  p_path . get_file ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  efsd - > get_file_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( efsd - > get_file ( i )  = =  file )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												String  type  =  efsd - > get_file_type ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( singleton - > icon_type_cache . has ( type ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  singleton - > icon_type_cache [ type ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  singleton - > icon_type_cache [ " Object " ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  singleton - > icon_type_cache [ " Object " ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-25 23:04:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _build_icon_type_cache ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  tl ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									theme - > get_icon_list ( EditorStringName ( EditorIcons ) ,  & tl ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  StringName  & E  :  tl )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ClassDB : : class_exists ( E ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-25 23:04:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										icon_type_cache [ E ]  =  theme - > get_icon ( E ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-25 23:04:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-28 13:56:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _enable_pending_addons ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( uint32_t  i  =  0 ;  i  <  pending_addons . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_addon_plugin_enabled ( pending_addons [ i ] ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pending_addons . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _file_dialog_register ( FileDialog  * p_dialog )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > file_dialogs . insert ( p_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _file_dialog_unregister ( FileDialog  * p_dialog )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									singleton - > file_dialogs . erase ( p_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _editor_file_dialog_register ( EditorFileDialog  * p_dialog )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > editor_file_dialogs . insert ( p_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _editor_file_dialog_unregister ( EditorFileDialog  * p_dialog )  {  
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > editor_file_dialogs . erase ( p_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-25 09:31:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector < EditorNodeInitCallback >  EditorNode : : _init_callbacks ;  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-19 14:21:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _begin_first_scan ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-11-07 10:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// In headless mode, scan right away.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This allows users to continue using `godot --headless --editor --quit` to prepare a project.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! DisplayServer : : get_singleton ( ) - > window_can_draw ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-08 12:52:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OS : : get_singleton ( ) - > benchmark_begin_measure ( " Editor " ,  " First Scan " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-07 10:46:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorFileSystem : : get_singleton ( ) - > scan ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-30 15:34:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! waiting_for_first_scan )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									requested_first_scan  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-19 14:21:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-17 12:48:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  EditorNode : : export_preset ( const  String  & p_preset ,  const  String  & p_path ,  bool  p_debug ,  bool  p_pack_only ,  bool  p_android_build_template ,  bool  p_patch ,  const  Vector < String >  & p_patches )  {  
						 
					
						
							
								
									
										
										
										
											2017-09-14 13:49:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_defer . preset  =  p_preset ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_defer . path  =  p_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									export_defer . debug  =  p_debug ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 14:22:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_defer . pack_only  =  p_pack_only ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 23:35:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_defer . android_build_template  =  p_android_build_template ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-17 12:48:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_defer . patch  =  p_patch ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									export_defer . patches  =  p_patches ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 11:32:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cmdline_export_mode  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 14:44:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_project_exporting ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  project_export  & &  project_export - > is_exporting ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : show_accept ( const  String  & p_text ,  const  String  & p_title )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( accept )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_close_save_scene_progress ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										accept - > set_ok_button_text ( p_title ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accept - > set_text ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-01 01:32:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										accept - > reset_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_clamped ( accept ,  Size2i ( ) ,  0.0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-26 23:41:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : show_save_accept ( const  String  & p_text ,  const  String  & p_title )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( save_accept )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_close_save_scene_progress ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_accept - > set_ok_button_text ( p_title ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										save_accept - > set_text ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-01 01:32:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_accept - > reset_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_clamped ( save_accept ,  Size2i ( ) ,  0.0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : show_warning ( const  String  & p_text ,  const  String  & p_title )  {  
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( warning )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 08:27:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_close_save_scene_progress ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-21 09:04:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										warning - > set_text ( p_text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										warning - > set_title ( p_title ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-01 01:32:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										warning - > reset_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_clamped ( warning ,  Size2i ( ) ,  0.0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-21 09:04:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-07 09:44:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WARN_PRINT ( p_title  +  "   "  +  p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-21 09:04:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-14 12:09:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-09 21:11:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _copy_warning ( const  String  & p_str )  {  
						 
					
						
							
								
									
										
										
										
											2020-03-03 10:36:29 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DisplayServer : : get_singleton ( ) - > clipboard_set ( warning - > get_text ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-09 21:11:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_editor_layout ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-09-04 19:31:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! load_editor_layout_done )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-27 18:14:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 11:05:09 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Load and amend existing config if it exists.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config - > load ( EditorPaths : : get_singleton ( ) - > get_project_settings_dir ( ) . path_join ( " editor_layout.cfg " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > save_docks_to_config ( config ,  " docks " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_open_scenes_to_config ( config ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_save_central_editor_layout_to_config ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-15 13:19:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_window_settings_to_config ( config ,  " EditorWindow " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . get_plugin_window_layout ( config ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config - > save ( EditorPaths : : get_singleton ( ) - > get_project_settings_dir ( ) . path_join ( " editor_layout.cfg " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_open_scenes_to_config ( Ref < ConfigFile >  p_layout )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PackedStringArray  scenes ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  path  =  editor_data . get_scene_path ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( path . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scenes . push_back ( path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_layout - > set_value ( EDITOR_NODE_CONFIG_SECTION ,  " open_scenes " ,  scenes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  currently_edited_scene_path  =  editor_data . get_scene_path ( editor_data . get_edited_scene ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-27 07:45:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_layout - > set_value ( EDITOR_NODE_CONFIG_SECTION ,  " current_scene " ,  currently_edited_scene_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : save_editor_layout_delayed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_layout_save_delay_timer - > start ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _load_editor_layout ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorProgress  ep ( " loading_editor_layout " ,  TTR ( " Loading editor " ) ,  5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ep . step ( TTR ( " Loading editor layout... " ) ,  0 ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  config - > load ( EditorPaths : : get_singleton ( ) - > get_project_settings_dir ( ) . path_join ( " editor_layout.cfg " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-26 12:07:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  {  // No config.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-28 00:46:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// If config is not found, expand the res:// folder and favorites by default.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-26 12:07:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * root  =  FileSystemDock : : get_singleton ( ) - > get_tree_control ( ) - > get_item_with_metadata ( " res:// " ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( root )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											root - > set_collapsed ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-28 00:46:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * favorites  =  FileSystemDock : : get_singleton ( ) - > get_tree_control ( ) - > get_item_with_metadata ( " Favorites " ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( favorites )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											favorites - > set_collapsed ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( overridden_default_layout  > =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 22:23:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_layout_menu_option ( overridden_default_layout ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 19:31:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ep . step ( TTR ( " Loading docks... " ) ,  1 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > load_docks_from_config ( config ,  " docks " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 19:31:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ep . step ( TTR ( " Reopening scenes... " ) ,  2 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_load_open_scenes_from_config ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 19:31:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ep . step ( TTR ( " Loading central editor layout... " ) ,  3 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_load_central_editor_layout_from_config ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 00:14:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 19:31:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ep . step ( TTR ( " Loading plugin window layout... " ) ,  4 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_data . set_plugin_window_layout ( config ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 20:11:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 19:31:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ep . step ( TTR ( " Editor layout ready. " ) ,  5 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									load_editor_layout_done  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_central_editor_layout_to_config ( Ref < ConfigFile >  p_config_file )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Bottom panel.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  center_split_offset  =  center_split - > get_split_offset ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_config_file - > set_value ( EDITOR_NODE_CONFIG_SECTION ,  " center_split_offset " ,  center_split_offset ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:22:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bottom_panel - > save_layout_to_config ( p_config_file ,  EDITOR_NODE_CONFIG_SECTION ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Debugger tab.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  selected_default_debugger_tab_idx  =  EditorDebuggerNode : : get_singleton ( ) - > get_default_debugger ( ) - > get_current_debugger_tab ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_config_file - > set_value ( EDITOR_NODE_CONFIG_SECTION ,  " selected_default_debugger_tab_idx " ,  selected_default_debugger_tab_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Main editor (plugin).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_main_screen - > save_layout_to_config ( p_config_file ,  EDITOR_NODE_CONFIG_SECTION ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _load_central_editor_layout_from_config ( Ref < ConfigFile >  p_config_file )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Bottom panel.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:22:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bottom_panel - > load_layout_from_config ( p_config_file ,  EDITOR_NODE_CONFIG_SECTION ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-07-05 23:04:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_config_file - > has_section_key ( EDITOR_NODE_CONFIG_SECTION ,  " center_split_offset " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  center_split_offset  =  p_config_file - > get_value ( EDITOR_NODE_CONFIG_SECTION ,  " center_split_offset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										center_split - > set_split_offset ( center_split_offset ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Debugger tab.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_config_file - > has_section_key ( EDITOR_NODE_CONFIG_SECTION ,  " selected_default_debugger_tab_idx " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  selected_default_debugger_tab_idx  =  p_config_file - > get_value ( EDITOR_NODE_CONFIG_SECTION ,  " selected_default_debugger_tab_idx " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorDebuggerNode : : get_singleton ( ) - > get_default_debugger ( ) - > switch_to_debugger ( selected_default_debugger_tab_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Main editor (plugin).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_main_screen - > load_layout_from_config ( p_config_file ,  EDITOR_NODE_CONFIG_SECTION ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-15 13:19:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _save_window_settings_to_config ( Ref < ConfigFile >  p_layout ,  const  String  & p_section )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Window  * w  =  get_window ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( w )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_layout - > set_value ( p_section ,  " screen " ,  w - > get_current_screen ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Window : : Mode  mode  =  w - > get_mode ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Window : : MODE_WINDOWED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_layout - > set_value ( p_section ,  " mode " ,  " windowed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_layout - > set_value ( p_section ,  " size " ,  w - > get_size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Window : : MODE_FULLSCREEN : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Window : : MODE_EXCLUSIVE_FULLSCREEN : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_layout - > set_value ( p_section ,  " mode " ,  " fullscreen " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Window : : MODE_MINIMIZED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( was_window_windowed_last )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_layout - > set_value ( p_section ,  " mode " ,  " windowed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_layout - > set_value ( p_section ,  " size " ,  w - > get_size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_layout - > set_value ( p_section ,  " mode " ,  " maximized " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_layout - > set_value ( p_section ,  " mode " ,  " maximized " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_layout - > set_value ( p_section ,  " position " ,  w - > get_position ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _load_open_scenes_from_config ( Ref < ConfigFile >  p_layout )  {  
						 
					
						
							
								
									
										
										
										
											2018-05-17 18:02:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! bool ( EDITOR_GET ( " interface/scene_tabs/restore_scenes_on_load " ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_layout - > has_section ( EDITOR_NODE_CONFIG_SECTION )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											! p_layout - > has_section_key ( EDITOR_NODE_CONFIG_SECTION ,  " open_scenes " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									restoring_scenes  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PackedStringArray  scenes  =  p_layout - > get_value ( EDITOR_NODE_CONFIG_SECTION ,  " open_scenes " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  scenes . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 20:55:34 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( FileAccess : : exists ( scenes [ i ] ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											load_scene ( scenes [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_layout - > has_section_key ( EDITOR_NODE_CONFIG_SECTION ,  " current_scene " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  current_scene  =  p_layout - > get_value ( EDITOR_NODE_CONFIG_SECTION ,  " current_scene " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 20:55:34 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( editor_data . get_scene_path ( i )  = =  current_scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_set_current_scene ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-27 07:45:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									save_editor_layout_delayed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									restoring_scenes  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 00:14:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : has_scenes_in_session ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! bool ( EDITOR_GET ( " interface/scene_tabs/restore_scenes_on_load " ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  config - > load ( EditorPaths : : get_singleton ( ) - > get_project_settings_dir ( ) . path_join ( " editor_layout.cfg " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 00:14:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! config - > has_section ( EDITOR_NODE_CONFIG_SECTION )  | |  ! config - > has_section_key ( EDITOR_NODE_CONFIG_SECTION ,  " open_scenes " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 00:14:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Array  scenes  =  config - > get_value ( EDITOR_NODE_CONFIG_SECTION ,  " open_scenes " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ! scenes . is_empty ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 00:14:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-03 15:14:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : undo ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									trigger_menu_option ( EDIT_UNDO ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : redo ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									trigger_menu_option ( EDIT_REDO ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 02:08:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : ensure_main_scene ( bool  p_from_native )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pick_main_scene - > set_meta ( " from_native " ,  p_from_native ) ;  // Whether from play button or native run.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-20 15:43:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  main_scene  =  GLOBAL_GET ( " application/run/main_scene " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 02:08:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( main_scene . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-19 14:59:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pick_main_scene - > set_text ( TTR ( " No main scene has ever been defined. Select one? \n You can change it later in  \" Project Settings \"  under the 'application' category. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pick_main_scene - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-07 00:10:07 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( editor_data . get_edited_scene_root ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											select_current_scene_button - > set_disabled ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											select_current_scene_button - > grab_focus ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											select_current_scene_button - > set_disabled ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 02:08:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! FileAccess : : exists ( main_scene ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-19 14:59:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pick_main_scene - > set_text ( vformat ( TTR ( " Selected scene '%s' does not exist. Select a valid one? \n You can change it later in  \" Project Settings \"  under the 'application' category. " ) ,  main_scene ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pick_main_scene - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 02:08:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ResourceLoader : : get_resource_type ( main_scene )  ! =  " PackedScene " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-19 14:59:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pick_main_scene - > set_text ( vformat ( TTR ( " Selected scene '%s' is not a scene file. Select a valid one? \n You can change it later in  \" Project Settings \"  under the 'application' category. " ) ,  main_scene ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pick_main_scene - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 02:08:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-20 15:32:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _immediate_dialog_confirmed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									immediate_dialog_confirmed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-10-19 13:31:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : immediate_confirmation_dialog ( const  String  & p_text ,  const  String  & p_ok_text ,  const  String  & p_cancel_text ,  uint32_t  p_wrap_width )  {  
						 
					
						
							
								
									
										
										
										
											2021-08-20 15:32:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ConfirmationDialog  * cd  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cd - > set_text ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cd - > set_ok_button_text ( p_ok_text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cd - > set_cancel_button_text ( p_cancel_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-19 13:31:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_wrap_width  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cd - > set_autowrap ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cd - > get_label ( ) - > set_custom_minimum_size ( Size2 ( p_wrap_width ,  0 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cd - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( singleton ,  & EditorNode : : _immediate_dialog_confirmed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-20 15:32:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > gui_base - > add_child ( cd ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cd - > popup_centered ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( true )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DisplayServer : : get_singleton ( ) - > process_events ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Main : : iteration ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( singleton - > immediate_dialog_confirmed  | |  ! cd - > is_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memdelete ( cd ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  singleton - > immediate_dialog_confirmed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-01 11:57:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : cleanup ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_init_callbacks . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_layouts_menu ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_layouts - > clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									overridden_default_layout  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 22:23:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-20 11:04:57 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts - > add_shortcut ( ED_SHORTCUT ( " layout/save " ,  TTRC ( " Save Layout... " ) ) ,  SETTINGS_LAYOUT_SAVE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_layouts - > add_shortcut ( ED_SHORTCUT ( " layout/delete " ,  TTRC ( " Delete Layout... " ) ) ,  SETTINGS_LAYOUT_DELETE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts - > add_shortcut ( ED_SHORTCUT ( " layout/default " ,  TTRC ( " Default " ) ) ,  SETTINGS_LAYOUT_DEFAULT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:48:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  config - > load ( EditorSettings : : get_singleton ( ) - > get_editor_layouts_config ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  // No config.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < String >  layouts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									config . ptr ( ) - > get_sections ( & layouts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & layout  :  layouts )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( layout  = =  TTR ( " Default " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 22:23:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_layouts - > remove_item ( editor_layouts - > get_item_index ( SETTINGS_LAYOUT_DEFAULT ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											overridden_default_layout  =  editor_layouts - > get_item_count ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 22:23:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_layouts - > add_item ( layout ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _layout_menu_option ( int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( p_id )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_LAYOUT_SAVE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											current_menu_option  =  p_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > set_title ( TTR ( " Save Layout " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > set_ok_button_text ( TTR ( " Save " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 20:16:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > set_name_line_enabled ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 22:26:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_LAYOUT_DELETE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											current_menu_option  =  p_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > set_title ( TTR ( " Delete Layout " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > set_ok_button_text ( TTR ( " Delete " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 20:16:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > set_name_line_enabled ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 22:26:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											layout_dialog - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  SETTINGS_LAYOUT_DEFAULT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_dock_manager - > load_docks_from_config ( default_layout ,  " docks " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_save_editor_layout ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < ConfigFile >  config ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											config . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:48:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Error  err  =  config - > load ( EditorSettings : : get_singleton ( ) - > get_editor_layouts_config ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return ;  // No config.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_dock_manager - > load_docks_from_config ( config ,  editor_layouts - > get_item_text ( p_id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_save_editor_layout ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _proceed_closing_scene_tabs ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < String > : : Element  * E  =  tabs_to_close . front ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( _is_closing_editor ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current_menu_option  =  tab_closing_menu_option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_menu_option_confirm ( tab_closing_menu_option ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											save_confirmation - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  scene_to_close  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tabs_to_close . pop_front ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  tab_idx  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( editor_data . get_scene_path ( i )  = =  scene_to_close )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tab_idx  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( tab_idx  <  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_scene_tab_closed ( tab_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  EditorNode : : _is_closing_editor ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  tab_closing_menu_option  = =  FILE_QUIT  | |  tab_closing_menu_option  = =  RUN_PROJECT_MANAGER  | |  tab_closing_menu_option  = =  RELOAD_CURRENT_PROJECT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _scene_tab_closed ( int  p_tab )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current_menu_option  =  SCENE_TAB_CLOSE ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tab_closing_idx  =  p_tab ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-26 21:04:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * scene  =  editor_data . get_edited_scene_root ( p_tab ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-10 01:48:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! scene )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_discard_changes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-02 13:40:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  scene_filename  =  scene - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  unsaved_message ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( editor_data . get_scene_history_id ( p_tab ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( scene_filename . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsaved_message  =  TTR ( " This scene was never saved. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-25 01:18:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Consider editor startup to be a point of saving, so that when you
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// close and reopen the editor, you don't get an excessively long
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// "modified X hours ago".
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  uint64_t  last_modified_seconds  =  Time : : get_singleton ( ) - > get_unix_time_from_system ( )  -  MAX ( started_timestamp ,  FileAccess : : get_modified_time ( scene - > get_scene_file_path ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  last_modified_string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( last_modified_seconds  <  120 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												last_modified_string  =  vformat ( TTRN ( " %d second ago " ,  " %d seconds ago " ,  last_modified_seconds ) ,  last_modified_seconds ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( last_modified_seconds  <  7200 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												last_modified_string  =  vformat ( TTRN ( " %d minute ago " ,  " %d minutes ago " ,  last_modified_seconds  /  60 ) ,  last_modified_seconds  /  60 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												last_modified_string  =  vformat ( TTRN ( " %d hour ago " ,  " %d hours ago " ,  last_modified_seconds  /  3600 ) ,  last_modified_seconds  /  3600 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsaved_message  =  vformat ( TTR ( " Scene  \" %s \"  has unsaved changes. \n Last saved: %s. " ) ,  scene_filename ,  last_modified_string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-05 15:45:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Check if any plugin has unsaved changes in that scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  editor_data . get_editor_plugin_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsaved_message  =  editor_data . get_editor_plugin ( i ) - > get_unsaved_status ( scene_filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! unsaved_message . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! unsaved_message . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scene_tabs - > get_current_tab ( )  ! =  p_tab )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_set_current_scene ( p_tab ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-14 20:41:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_confirmation - > set_ok_button_text ( TTR ( " Save & Close " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										save_confirmation - > set_text ( unsaved_message  +  " \n \n "  +  TTR ( " Save before closing? " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-10 17:04:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_confirmation - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										save_confirmation - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_discard_changes ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-19 14:15:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-24 23:32:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_editor_layout_delayed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-06-19 02:23:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 19:22:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _cancel_close_scene_tab ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( _is_closing_editor ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tab_closing_menu_option  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-09-13 09:46:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _toggle_distraction_free_mode ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EDITOR_GET ( " interface/editor/separate_distraction_mode " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  screen  =  editor_main_screen - > get_selected_index ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-25 17:18:35 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( screen  = =  EditorMainScreen : : EDITOR_SCRIPT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											script_distraction_free  =  ! script_distraction_free ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											set_distraction_free_mode ( script_distraction_free ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-25 17:18:35 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scene_distraction_free  =  ! scene_distraction_free ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											set_distraction_free_mode ( scene_distraction_free ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-25 17:18:35 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_distraction_free_mode ( distraction_free - > is_pressed ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-13 09:46:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : update_distraction_free_mode ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! EDITOR_GET ( " interface/editor/separate_distraction_mode " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  screen  =  editor_main_screen - > get_selected_index ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( screen  = =  EditorMainScreen : : EDITOR_SCRIPT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_distraction_free_mode ( script_distraction_free ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_distraction_free_mode ( scene_distraction_free ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-30 19:29:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : set_distraction_free_mode ( bool  p_enter )  {  
						 
					
						
							
								
									
										
										
										
											2016-09-13 09:46:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free - > set_pressed ( p_enter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-30 19:29:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_enter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( editor_dock_manager - > are_docks_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											editor_dock_manager - > set_docks_visible ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-30 19:29:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_dock_manager - > set_docks_visible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-30 19:29:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-31 19:58:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_distraction_free_mode_enabled ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-09-13 09:46:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  distraction_free - > is_pressed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-30 19:29:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-05 22:26:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Dictionary  EditorNode : : drag_resource ( const  Ref < Resource >  & p_res ,  Control  * p_from )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Control  * drag_control  =  memnew ( Control ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TextureRect  * drag_preview  =  memnew ( TextureRect ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Label  * label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 08:14:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									label - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Texture2D >  preview ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO: make proper previews
 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ImageTexture >  texture  =  theme - > get_icon ( SNAME ( " FileBigThumb " ) ,  EditorStringName ( EditorIcons ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-28 12:32:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < Image >  img  =  texture - > get_image ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-17 07:36:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										img  =  img - > duplicate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-17 13:55:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										img - > resize ( 48 ,  48 ) ;  // meh
 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-04 01:49:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										preview  =  ImageTexture : : create_from_image ( img ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drag_preview - > set_texture ( preview ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drag_control - > add_child ( drag_preview ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_res - > get_path ( ) . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										label - > set_text ( p_res - > get_path ( ) . get_file ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( ! p_res - > get_name ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										label - > set_text ( p_res - > get_name ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 23:03:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										label - > set_text ( p_res - > get_class ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drag_control - > add_child ( label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_from - > set_drag_preview ( drag_control ) ;  // Wait until it enters scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-29 11:29:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									label - > set_position ( Point2 ( ( preview - > get_width ( )  -  label - > get_minimum_size ( ) . width )  /  2 ,  preview - > get_height ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Dictionary  drag_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									drag_data [ " type " ]  =  " resource " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drag_data [ " resource " ]  =  p_res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drag_data [ " from " ]  =  p_from ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  drag_data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-05 22:26:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Dictionary  EditorNode : : drag_files_and_dirs ( const  Vector < String >  & p_paths ,  Control  * p_from )  {  
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  has_folder  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  has_file  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_paths . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  is_folder  =  p_paths [ i ] . ends_with ( " / " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										has_folder  | =  is_folder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										has_file  | =  ! is_folder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  max_rows  =  6 ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-30 13:36:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  num_rows  =  p_paths . size ( )  >  max_rows  ?  max_rows  -  1  :  p_paths . size ( ) ;  // Don't waste a row to say "1 more file" - list it instead.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VBoxContainer  * vbox  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  num_rows ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HBoxContainer  * hbox  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										TextureRect  * icon  =  memnew ( TextureRect ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Label  * label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 08:14:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										label - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_paths [ i ] . ends_with ( " / " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											label - > set_text ( p_paths [ i ] . substr ( 0 ,  p_paths [ i ] . length ( )  -  1 ) . get_file ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											icon - > set_texture ( theme - > get_icon ( SNAME ( " Folder " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											label - > set_text ( p_paths [ i ] . get_file ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											icon - > set_texture ( theme - > get_icon ( SNAME ( " File " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-30 13:36:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										icon - > set_stretch_mode ( TextureRect : : STRETCH_KEEP_CENTERED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										icon - > set_size ( Size2 ( 16 ,  16 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hbox - > add_child ( icon ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hbox - > add_child ( label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vbox - > add_child ( hbox ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_paths . size ( )  >  num_rows )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Label  * label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( has_file  & &  has_folder )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											label - > set_text ( vformat ( TTR ( " %d more files or folders " ) ,  p_paths . size ( )  -  num_rows ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( has_folder )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											label - > set_text ( vformat ( TTR ( " %d more folders " ) ,  p_paths . size ( )  -  num_rows ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											label - > set_text ( vformat ( TTR ( " %d more files " ) ,  p_paths . size ( )  -  num_rows ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vbox - > add_child ( label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_from - > set_drag_preview ( vbox ) ;  // Wait until it enters scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Dictionary  drag_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 23:09:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									drag_data [ " type " ]  =  has_folder  ?  " files_and_dirs "  :  " files " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drag_data [ " files " ]  =  p_paths ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									drag_data [ " from " ]  =  p_from ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-11 11:46:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  drag_data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 00:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : add_tool_menu_item ( const  String  & p_name ,  const  Callable  & p_callback )  {  
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  idx  =  tool_menu - > get_item_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tool_menu - > add_item ( p_name ,  TOOLS_CUSTOM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-16 00:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tool_menu - > set_item_metadata ( idx ,  p_callback ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : add_tool_submenu_item ( const  String  & p_name ,  PopupMenu  * p_submenu )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_NULL ( p_submenu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( p_submenu - > get_parent ( )  ! =  nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 17:33:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tool_menu - > add_submenu_node_item ( p_name ,  p_submenu ,  TOOLS_CUSTOM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : remove_tool_menu_item ( const  String  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  tool_menu - > get_item_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tool_menu - > get_item_id ( i )  ! =  TOOLS_CUSTOM )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( tool_menu - > get_item_text ( i )  = =  p_name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( tool_menu - > get_item_submenu ( i )  ! =  " " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node  * n  =  tool_menu - > get_node ( tool_menu - > get_item_submenu ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tool_menu - > remove_child ( n ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												memdelete ( n ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tool_menu - > remove_item ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-06 00:57:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tool_menu - > reset_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 18:11:04 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								PopupMenu  * EditorNode : : get_export_as_menu ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  export_as_menu ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-10 21:25:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _dropped_files ( const  Vector < String >  & p_files )  {  
						 
					
						
							
								
									
										
										
										
											2024-11-20 04:28:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  to_path  =  FileSystemDock : : get_singleton ( ) - > get_folder_path_at_mouse_position ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( to_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										to_path  =  FileSystemDock : : get_singleton ( ) - > get_current_directory ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									to_path  =  ProjectSettings : : get_singleton ( ) - > globalize_path ( to_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:52:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_add_dropped_files_recursive ( p_files ,  to_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileSystem : : get_singleton ( ) - > scan_changes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _add_dropped_files_recursive ( const  Vector < String >  & p_files ,  String  to_path )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-23 11:08:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < DirAccess >  dir  =  DirAccess : : create ( DirAccess : : ACCESS_FILESYSTEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-26 03:07:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( dir . is_null ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:52:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_files . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-18 17:40:56 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  String  & from  =  p_files [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  to  =  to_path . path_join ( from . get_file ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( dir - > dir_exists ( from ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector < String >  sub_files ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 11:08:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < DirAccess >  sub_dir  =  DirAccess : : open ( from ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-26 03:07:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_COND ( sub_dir . is_null ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											sub_dir - > list_dir_begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  next_file  =  sub_dir - > get_next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											while  ( ! next_file . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( next_file  = =  " . "  | |  next_file  = =  " .. " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													next_file  =  sub_dir - > get_next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-29 19:34:01 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												sub_files . push_back ( from . path_join ( next_file ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												next_file  =  sub_dir - > get_next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! sub_files . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 22:39:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dir - > make_dir ( to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_add_dropped_files_recursive ( sub_files ,  to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-17 21:52:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dir - > copy ( from ,  to ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _file_access_close_error_notify ( const  String  & p_str )  {  
						 
					
						
							
								
									
										
										
										
											2024-05-27 13:29:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									callable_mp_static ( & EditorNode : : _file_access_close_error_notify_impl ) . call_deferred ( p_str ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-19 18:45:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _file_access_close_error_notify_impl ( const  String  & p_str )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-07 21:50:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_io_error ( vformat ( TTR ( " Unable to write to file '%s', file in use, locked or lacking permissions. " ) ,  p_str ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-13 10:10:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-05-27 14:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Recursive function to inform nodes that an array of nodes have had their scene reimported.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// It will attempt to call a method named '_nodes_scene_reimported' on every node in the
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// tree so that editor scripts which create transient nodes will have the opportunity
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// to recreate them.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _notify_nodes_scene_reimported ( Node  * p_node ,  Array  p_reimported_nodes )  {  
						 
					
						
							
								
									
										
										
										
											2023-09-28 05:32:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Skeleton3D  * skel_3d  =  Object : : cast_to < Skeleton3D > ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( skel_3d )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										skel_3d - > reset_bone_poses ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										BoneAttachment3D  * attachment  =  Object : : cast_to < BoneAttachment3D > ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( attachment )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											attachment - > notify_rebind_required ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_node - > has_method ( " _nodes_scene_reimported " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_node - > call ( " _nodes_scene_reimported " ,  p_reimported_nodes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-28 05:32:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_notify_nodes_scene_reimported ( p_node - > get_child ( i ) ,  p_reimported_nodes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-28 05:32:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : reload_scene ( const  String  & p_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  scene_idx  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_data . get_edited_scene_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( editor_data . get_scene_path ( i )  = =  p_path )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scene_idx  =  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  current_tab  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scene_idx  = =  - 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( get_edited_scene ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  current_history_id  =  editor_data . get_current_edited_scene_history_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  is_unsaved  =  EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( current_history_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Scene is not open, so at it might be instantiated. We'll refresh the whole scene later.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 13:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorUndoRedoManager : : get_singleton ( ) - > clear_history ( current_history_id ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( is_unsaved )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EditorUndoRedoManager : : get_singleton ( ) - > set_history_as_unsaved ( current_history_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( current_tab  = =  scene_idx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_data . apply_changes_in_editors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_save_editor_states ( p_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Reload scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_remove_scene ( scene_idx ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 15:11:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_scene ( p_path ,  true ,  false ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Adjust index so tab is back a the previous position.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . move_edited_scene_to_index ( scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 13:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorUndoRedoManager : : get_singleton ( ) - > clear_history ( editor_data . get_scene_history_id ( scene_idx ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-04 05:36:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Recover the tab.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 18:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > set_current_tab ( current_tab ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : find_all_instances_inheriting_path_in_node ( Node  * p_root ,  Node  * p_node ,  const  String  & p_instance_path ,  HashSet < Node  * >  & p_instance_list )  {  
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  scene_file_path  =  p_node - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  valid_instance_found  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Attempt to find all the instances matching path we're going to reload.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_node - > get_scene_file_path ( )  = =  p_instance_path )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										valid_instance_found  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * current_node  =  p_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < SceneState >  inherited_state  =  current_node - > get_scene_inherited_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( inherited_state . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  inherited_path  =  inherited_state - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( inherited_path  = =  p_instance_path )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												valid_instance_found  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											inherited_state  =  inherited_state - > get_base_scene_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Instead of adding this instance directly, if its not owned by the scene, walk its ancestors
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// and find the first node still owned by the scene. This is what we will reloading instead.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( valid_instance_found )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * current_node  =  p_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( true )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( current_node - > get_owner ( )  = =  p_root  | |  current_node - > get_owner ( )  = =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_instance_list . insert ( current_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current_node  =  current_node - > get_parent ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										find_all_instances_inheriting_path_in_node ( p_root ,  p_node - > get_child ( i ) ,  p_instance_path ,  p_instance_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : preload_reimporting_with_path_in_edited_scenes ( const  List < String >  & p_scenes )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorProgress  progress ( " preload_reimporting_scene " ,  TTR ( " Preparing scenes for reload " ) ,  editor_data . get_edited_scene_count ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  original_edited_scene_idx  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Walk through each opened scene to get a global list of all instances which match
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// the current reimported scenes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  current_scene_idx  =  0 ;  current_scene_idx  <  editor_data . get_edited_scene_count ( ) ;  current_scene_idx + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										progress . step ( vformat ( TTR ( " Analyzing scene %s " ) ,  editor_data . get_scene_title ( current_scene_idx ) ) ,  current_scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * edited_scene_root  =  editor_data . get_edited_scene_root ( current_scene_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( edited_scene_root )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											SceneModificationsEntry  scene_modifications ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  String  & instance_path  :  p_scenes )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( editor_data . get_scene_path ( current_scene_idx )  = =  instance_path )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												HashSet < Node  * >  instances_to_reimport ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												find_all_instances_inheriting_path_in_node ( edited_scene_root ,  edited_scene_root ,  instance_path ,  instances_to_reimport ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( instances_to_reimport . size ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													editor_data . set_edited_scene ( current_scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													List < Node  * >  instance_list_with_children ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													for  ( Node  * original_node  :  instances_to_reimport )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														InstanceModificationsEntry  instance_modifications ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														// Fetching all the modified properties of the nodes reimported scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														get_preload_scene_modification_table ( edited_scene_root ,  original_node ,  original_node ,  instance_modifications ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														instance_modifications . original_node  =  original_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														instance_modifications . instance_path  =  instance_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														scene_modifications . instance_list . push_back ( instance_modifications ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														instance_list_with_children . push_back ( original_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														get_children_nodes ( original_node ,  instance_list_with_children ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Search the scene to find nodes that references the nodes will be recreated.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													get_preload_modifications_reference_to_nodes ( edited_scene_root ,  edited_scene_root ,  instances_to_reimport ,  instance_list_with_children ,  scene_modifications . other_instances_modifications ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( scene_modifications . instance_list . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scenes_modification_table [ current_scene_idx ]  =  scene_modifications ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_data . set_edited_scene ( original_edited_scene_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									progress . step ( TTR ( " Preparation done. " ) ,  editor_data . get_edited_scene_count ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : reload_instances_with_path_in_edited_scenes ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scenes_modification_table . size ( )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorProgress  progress ( " reloading_scene " ,  TTR ( " Scenes reloading " ) ,  editor_data . get_edited_scene_count ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									progress . step ( TTR ( " Reloading... " ) ,  0 ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Array  replaced_nodes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < String ,  Ref < PackedScene > >  local_scene_cache ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Reload the new instances.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < int ,  SceneModificationsEntry >  & scene_modifications_elem  :  scenes_modification_table )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( InstanceModificationsEntry  instance_modifications  :  scene_modifications_elem . value . instance_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! local_scene_cache . has ( instance_modifications . instance_path ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < PackedScene >  instance_scene_packed_scene  =  ResourceLoader : : load ( instance_modifications . instance_path ,  " " ,  ResourceFormatLoader : : CACHE_MODE_REPLACE ,  & err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ERR_FAIL_COND ( err  ! =  OK ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_FAIL_COND ( instance_scene_packed_scene . is_null ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												local_scene_cache [ instance_modifications . instance_path ]  =  instance_scene_packed_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Save the current scene state/selection in case of lost.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Dictionary  editor_state  =  _get_main_scene_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_data . save_edited_scene_state ( editor_selection ,  & editor_history ,  editor_state ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_selection - > clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  original_edited_scene_idx  =  editor_data . get_edited_scene ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < int ,  SceneModificationsEntry >  & scene_modifications_elem  :  scenes_modification_table )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set the current scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  current_scene_idx  =  scene_modifications_elem . key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SceneModificationsEntry  * scene_modifications  =  & scene_modifications_elem . value ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_data . set_edited_scene ( current_scene_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * current_edited_scene  =  editor_data . get_edited_scene_root ( current_scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Make sure the node is in the tree so that editor_selection can add node smoothly.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( original_edited_scene_idx  ! =  current_scene_idx )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Prevent scene roots with the same name from being in the tree at the same time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * original_edited_scene_root  =  editor_data . get_edited_scene_root ( original_edited_scene_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( original_edited_scene_root  & &  original_edited_scene_root - > get_name ( )  = =  current_edited_scene - > get_name ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scene_root - > remove_child ( original_edited_scene_root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scene_root - > add_child ( current_edited_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Restore the state so that the selection can be updated.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_state  =  editor_data . restore_edited_scene_state ( editor_selection ,  & editor_history ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  current_history_id  =  editor_data . get_current_edited_scene_history_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  is_unsaved  =  EditorUndoRedoManager : : get_singleton ( ) - > is_history_unsaved ( current_history_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Clear the history for this affected tab.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 13:33:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorUndoRedoManager : : get_singleton ( ) - > clear_history ( current_history_id ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Update the version
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_data . is_scene_changed ( current_scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( InstanceModificationsEntry  instance_modifications  :  scene_modifications - > instance_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * original_node  =  instance_modifications . original_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  original_node_file_path  =  original_node - > get_scene_file_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < PackedScene >  instance_scene_packed_scene  =  local_scene_cache [ instance_modifications . instance_path ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Load a replacement scene for the node.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < PackedScene >  current_packed_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < PackedScene >  base_packed_scene ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( original_node_file_path  = =  instance_modifications . instance_path )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// If the node file name directly matches the scene we're replacing,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// just load it since we already cached it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												current_packed_scene  =  instance_scene_packed_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Otherwise, check the inheritance chain, reloading and caching any scenes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// we require along the way.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < String >  required_load_paths ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Do we need to check if the paths are empty?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! original_node_file_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													required_load_paths . push_front ( original_node_file_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < SceneState >  inherited_state  =  original_node - > get_scene_inherited_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												while  ( inherited_state . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  inherited_path  =  inherited_state - > get_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													// Do we need to check if the paths are empty?
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! inherited_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														required_load_paths . push_front ( inherited_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													inherited_state  =  inherited_state - > get_base_scene_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Ensure the inheritance chain is loaded in the correct order so that cache can
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// be properly updated.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( String  path  :  required_load_paths )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( current_packed_scene . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														base_packed_scene  =  current_packed_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! local_scene_cache . find ( path ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-01 17:12:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														current_packed_scene  =  ResourceLoader : : load ( path ,  " " ,  ResourceFormatLoader : : CACHE_MODE_REPLACE ,  & err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														local_scene_cache [ path ]  =  current_packed_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														current_packed_scene  =  local_scene_cache [ path ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_COND ( current_packed_scene . is_null ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Instantiate early so that caches cleared on load in SceneState can be rebuilt early.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * instantiated_node  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// If we are in a inherited scene, it's easier to create a new base scene and
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// grab the node from there.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// When scene_path_to_node is '.' and we have scene_inherited_state, it's because
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// it's a multi-level inheritance scene. We should use
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											NodePath  scene_path_to_node  =  current_edited_scene - > get_path_to ( original_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < SceneState >  scene_state  =  current_edited_scene - > get_scene_inherited_state ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 20:07:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( scene_path_to_node  ! =  " . "  & &  scene_state . is_valid ( )  & &  scene_state - > get_path ( )  ! =  instance_modifications . instance_path  & &  scene_state - > find_node_by_path ( scene_path_to_node )  > =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Node  * root_node  =  scene_state - > instantiate ( SceneState : : GenEditState : : GEN_EDIT_STATE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												instantiated_node  =  root_node - > get_node ( scene_path_to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( instantiated_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( instantiated_node - > get_parent ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// Remove from the root so we can delete it from memory.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														instantiated_node - > get_parent ( ) - > remove_child ( instantiated_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// No need of the additional children that could have been added to the node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// in the base scene. That will be managed by the 'addition_list' later.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														_remove_all_not_owned_children ( instantiated_node ,  instantiated_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														memdelete ( root_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Should not happen because we checked with find_node_by_path before, just in case.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													memdelete ( root_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! instantiated_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If no base scene was found to create the node, we will use the reimported packed scene directly.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// But, when the current edited scene is the reimported scene, it's because it's an inherited scene
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// derived from the reimported scene. In that case, we will not instantiate current_packed_scene, because
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// we would reinstantiate ourself. Using the base scene is better.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( current_edited_scene  = =  original_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( base_packed_scene . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														instantiated_node  =  base_packed_scene - > instantiate ( PackedScene : : GEN_EDIT_STATE_INSTANCE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														instantiated_node  =  instance_scene_packed_scene - > instantiate ( PackedScene : : GEN_EDIT_STATE_INSTANCE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													instantiated_node  =  current_packed_scene - > instantiate ( PackedScene : : GEN_EDIT_STATE_INSTANCE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_FAIL_NULL ( instantiated_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Disconnect all relevant connections, all connections from and persistent connections to.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( const  KeyValue < NodePath ,  ModificationNodeEntry >  & modification_table_entry  :  instance_modifications . modifications )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( Connection  conn  :  modification_table_entry . value . connections_from )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													conn . signal . get_object ( ) - > disconnect ( conn . signal . get_name ( ) ,  conn . callable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( ConnectionWithNodePath  cwnp  :  modification_table_entry . value . connections_to )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Connection  conn  =  cwnp . connection ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( conn . flags  &  CONNECT_PERSIST )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														conn . signal . get_object ( ) - > disconnect ( conn . signal . get_name ( ) ,  conn . callable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Store all the paths for any selected nodes which are ancestors of the node we're replacing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < NodePath >  selected_node_paths ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Node  * selected_node  :  editor_selection - > get_selected_node_list ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( selected_node  = =  original_node  | |  original_node - > is_ancestor_of ( selected_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													selected_node_paths . push_back ( original_node - > get_path_to ( selected_node ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													editor_selection - > remove_node ( selected_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Remove all nodes which were added as additional elements (they will be restored later).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( AdditiveNodeEntry  additive_node_entry  :  instance_modifications . addition_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node  * addition_node  =  additive_node_entry . node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												addition_node - > get_parent ( ) - > remove_child ( addition_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Clear ownership of the nodes (kind of hack to workaround an issue with
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// replace_by when called on nodes in other tabs).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < Node  * >  nodes_owned_by_original_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											original_node - > get_owned_by ( original_node ,  & nodes_owned_by_original_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Node  * owned_node  :  nodes_owned_by_original_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												owned_node - > set_owner ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Replace the old nodes in the history with the new ones.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Otherwise, the history will contain old nodes, and some could still be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// instantiated if used elsewhere, causing the "current edited item" to be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// linked to a node that will be destroyed later. This caused the editor to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// crash when reimporting scenes with animations when "Editable children" was enabled.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											replace_history_reimported_nodes ( original_node ,  instantiated_node ,  original_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-02 16:50:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Reset the editable instance state.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < NodePath ,  SceneEditorDataEntry >  scene_editor_data_table ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * owner  =  original_node - > get_owner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! owner )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												owner  =  original_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											get_scene_editor_data_for_node ( owner ,  original_node ,  scene_editor_data_table ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  original_node_scene_instance_load_placeholder  =  original_node - > get_scene_instance_load_placeholder ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Delete all the remaining node children.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											while  ( original_node - > get_child_count ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node  * child  =  original_node - > get_child ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												original_node - > remove_child ( child ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												child - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Update the name to match
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											instantiated_node - > set_name ( original_node - > get_name ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Is this replacing the edited root node?
 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( current_edited_scene  = =  original_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Set the instance as un inherited scene of itself.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												instantiated_node - > set_scene_inherited_state ( instantiated_node - > get_scene_instance_state ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												instantiated_node - > set_scene_instance_state ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												instantiated_node - > set_scene_file_path ( original_node_file_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												current_edited_scene  =  instantiated_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												editor_data . set_edited_scene_root ( current_edited_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( original_edited_scene_idx  = =  current_scene_idx )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// How that the editor executes a redraw while destroying or progressing the EditorProgress,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// it crashes when the root scene has been replaced because the edited scene
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// was freed and no longer in the scene tree.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													SceneTreeDock : : get_singleton ( ) - > set_edited_scene ( current_edited_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( get_tree ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														get_tree ( ) - > set_edited_scene_root ( current_edited_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Replace the original node with the instantiated version.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											original_node - > replace_by ( instantiated_node ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Mark the old node for deletion.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											original_node - > queue_free ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Restore the placeholder state from the original node.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											instantiated_node - > set_scene_instance_load_placeholder ( original_node_scene_instance_load_placeholder ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Attempt to re-add all the additional nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( AdditiveNodeEntry  additive_node_entry  :  instance_modifications . addition_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node  * parent_node  =  instantiated_node - > get_node_or_null ( additive_node_entry . parent ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! parent_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													parent_node  =  current_edited_scene ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												parent_node - > add_child ( additive_node_entry . node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												parent_node - > move_child ( additive_node_entry . node ,  additive_node_entry . index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If the additive node's owner was the node which got replaced, update it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( additive_node_entry . owner  = =  original_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													additive_node_entry . owner  =  instantiated_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												additive_node_entry . node - > set_owner ( additive_node_entry . owner ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// If the parent node was lost, attempt to restore the original global transform.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Node2D  * node_2d  =  Object : : cast_to < Node2D > ( additive_node_entry . node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( node_2d )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														node_2d - > set_transform ( additive_node_entry . transform_2d ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Node3D  * node_3d  =  Object : : cast_to < Node3D > ( additive_node_entry . node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( node_3d )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														node_3d - > set_transform ( additive_node_entry . transform_3d ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 05:26:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Restore the scene's editable instance and folded states.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( HashMap < NodePath ,  SceneEditorDataEntry > : : Iterator  I  =  scene_editor_data_table . begin ( ) ;  I ;  + + I )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node  * node  =  owner - > get_node_or_null ( I - > key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( owner  ! =  node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														owner - > set_editable_instance ( node ,  I - > value . is_editable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													node - > set_display_folded ( I - > value . is_display_folded ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Restore the selection.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( selected_node_paths . size ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( NodePath  selected_node_path  :  selected_node_paths )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Node  * selected_node  =  instantiated_node - > get_node_or_null ( selected_node_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( selected_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														editor_selection - > add_node ( selected_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												editor_selection - > update ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Attempt to restore the modified properties and signals for the instantitated node and all its owned children.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( KeyValue < NodePath ,  ModificationNodeEntry >  & E  :  instance_modifications . modifications )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 11:07:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												NodePath  new_current_path  =  E . key ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Node  * modifiable_node  =  instantiated_node - > get_node_or_null ( new_current_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												update_node_from_node_modification_entry ( modifiable_node ,  E . value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Add the newly instantiated node to the edited scene's replaced node list.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											replaced_nodes . push_back ( instantiated_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-28 05:32:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Attempt to restore the modified properties and signals for the instantitated node and all its owned children.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( KeyValue < NodePath ,  ModificationNodeEntry >  & E  :  scene_modifications - > other_instances_modifications )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NodePath  new_current_path  =  E . key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * modifiable_node  =  current_edited_scene - > get_node_or_null ( new_current_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( modifiable_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												update_node_from_node_modification_entry ( modifiable_node ,  E . value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( is_unsaved )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorUndoRedoManager : : get_singleton ( ) - > set_history_as_unsaved ( current_history_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Save the current handled scene state.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_data . save_edited_scene_state ( editor_selection ,  & editor_history ,  editor_state ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_selection - > clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Cleanup the history of the changes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_history . cleanup_history ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( original_edited_scene_idx  ! =  current_scene_idx )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scene_root - > remove_child ( current_edited_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Ensure the current edited scene is re-added if removed earlier because it has the same name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// as the reimported scene. The editor could crash when reloading SceneTreeDock if the current
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// edited scene is not in the scene tree.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * original_edited_scene_root  =  editor_data . get_edited_scene_root ( original_edited_scene_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( original_edited_scene_root  & &  ! original_edited_scene_root - > get_parent ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scene_root - > add_child ( original_edited_scene_root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// For the whole editor, call the _notify_nodes_scene_reimported with a list of replaced nodes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// To inform anything that depends on them that they should update as appropriate.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_notify_nodes_scene_reimported ( this ,  replaced_nodes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . set_edited_scene ( original_edited_scene_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 07:46:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . restore_edited_scene_state ( editor_selection ,  & editor_history ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-06 17:59:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									progress . step ( TTR ( " Reloading done. " ) ,  editor_data . get_edited_scene_count ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _remove_all_not_owned_children ( Node  * p_node ,  Node  * p_owner )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < Node  * >  nodes_to_remove ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_node  ! =  p_owner  & &  p_node - > get_owner ( )  ! =  p_owner )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nodes_to_remove . push_back ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * child_node  =  p_node - > get_child ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_remove_all_not_owned_children ( child_node ,  p_owner ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Node  * node  :  nodes_to_remove )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										node - > get_parent ( ) - > remove_child ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										node - > queue_free ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 21:31:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  EditorNode : : plugin_init_callback_count  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : add_plugin_init_callback ( EditorPluginInitializeCallback  p_callback )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( plugin_init_callback_count  = =  MAX_INIT_CALLBACKS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									plugin_init_callbacks [ plugin_init_callback_count + + ]  =  p_callback ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EditorPluginInitializeCallback  EditorNode : : plugin_init_callbacks [ EditorNode : : MAX_INIT_CALLBACKS ] ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  EditorNode : : build_callback_count  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:37:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : add_build_callback ( EditorBuildCallback  p_callback )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( build_callback_count  = =  MAX_INIT_CALLBACKS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:37:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									build_callbacks [ build_callback_count + + ]  =  p_callback ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:37:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 23:59:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EditorBuildCallback  EditorNode : : build_callbacks [ EditorNode : : MAX_BUILD_CALLBACKS ] ;  
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:37:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-14 10:23:04 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : call_build ( )  {  
						 
					
						
							
								
									
										
										
										
											2018-01-08 09:55:22 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  builds_successful  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  build_callback_count  & &  builds_successful ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! build_callbacks [ i ] ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_PRINT ( " A Godot Engine build callback failed. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											builds_successful  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:44:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 23:59:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-08 09:55:22 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( builds_successful  & &  ! editor_data . call_build ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ERR_PRINT ( " An EditorPlugin build callback failed. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										builds_successful  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  builds_successful ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:44:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-09-14 19:37:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _inherit_imported ( const  String  & p_action )  {  
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									open_imported - > hide ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_scene ( open_import_request ,  true ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _open_imported ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-09-14 15:11:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_scene ( open_import_request ,  true ,  false ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-28 20:58:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : dim_editor ( bool  p_dimming )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dimmed  =  p_dimming ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > set_modulate ( p_dimming  ?  Color ( 0.5 ,  0.5 ,  0.5 )  :  Color ( 1 ,  1 ,  1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-06 20:11:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-10-31 16:58:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorNode : : is_editor_dimmed ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  dimmed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-20 23:31:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : open_export_template_manager ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									export_template_manager - > popup_manager ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 09:20:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : add_resource_conversion_plugin ( const  Ref < EditorResourceConversionPlugin >  & p_plugin )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resource_conversion_plugins . push_back ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : remove_resource_conversion_plugin ( const  Ref < EditorResourceConversionPlugin >  & p_plugin )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resource_conversion_plugins . erase ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 19:39:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector < Ref < EditorResourceConversionPlugin > >  EditorNode : : find_resource_conversion_plugin_for_resource ( const  Ref < Resource >  & p_for_resource )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_for_resource . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  Vector < Ref < EditorResourceConversionPlugin > > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < Ref < EditorResourceConversionPlugin > >  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Ref < EditorResourceConversionPlugin >  resource_conversion_plugin  :  resource_conversion_plugins )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( resource_conversion_plugin . is_valid ( )  & &  resource_conversion_plugin - > handles ( p_for_resource ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ret . push_back ( resource_conversion_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Vector < Ref < EditorResourceConversionPlugin > >  EditorNode : : find_resource_conversion_plugin_for_type_name ( const  String  & p_type )  {  
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < Ref < EditorResourceConversionPlugin > >  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 09:20:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-09 19:39:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ClassDB : : can_instantiate ( p_type ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < Resource >  temp  =  Object : : cast_to < Resource > ( ClassDB : : instantiate ( p_type ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( temp . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Ref < EditorResourceConversionPlugin >  resource_conversion_plugin  :  resource_conversion_plugins )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( resource_conversion_plugin . is_valid ( )  & &  resource_conversion_plugin - > handles ( temp ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ret . push_back ( resource_conversion_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 09:20:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _update_renderer_color ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:12:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  rendering_method  =  renderer - > get_selected_metadata ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rendering_method  = =  " forward_plus " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:57:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										renderer - > add_theme_color_override ( SceneStringName ( font_color ) ,  theme - > get_color ( SNAME ( " forward_plus_color " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 19:04:36 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( rendering_method  = =  " mobile " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:57:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										renderer - > add_theme_color_override ( SceneStringName ( font_color ) ,  theme - > get_color ( SNAME ( " mobile_color " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 19:04:36 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( rendering_method  = =  " gl_compatibility " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:57:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										renderer - > add_theme_color_override ( SceneStringName ( font_color ) ,  theme - > get_color ( SNAME ( " gl_compatibility_color " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-28 16:40:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _renderer_selected ( int  p_which )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  rendering_method  =  renderer - > get_item_metadata ( p_which ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  current_renderer  =  GLOBAL_GET ( " rendering/renderer/rendering_method " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rendering_method  = =  current_renderer )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer_request  =  rendering_method ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 17:28:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									video_restart_dialog - > set_text ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vformat ( TTR ( " Changing the renderer requires restarting the editor. \n \n Choosing Save & Restart will change the rendering method to: \n - Desktop platforms: %s \n - Mobile platforms: %s \n - Web platform: gl_compatibility " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													renderer_request ,  renderer_request . replace ( " forward_plus " ,  " mobile " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									video_restart_dialog - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > select ( renderer_current ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_renderer_color ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-14 11:38:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _add_renderer_entry ( const  String  & p_renderer_name ,  bool  p_mark_overridden )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  item_text ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_renderer_name  = =  " forward_plus " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										item_text  =  TTR ( " Forward+ " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_renderer_name  = =  " mobile " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										item_text  =  TTR ( " Mobile " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_renderer_name  = =  " gl_compatibility " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										item_text  =  TTR ( " Compatibility " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_mark_overridden )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										item_text  + =  "   "  +  TTR ( " (Overridden) " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									renderer - > add_item ( item_text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _resource_saved ( Ref < Resource >  p_resource ,  const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:46:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( singleton - > saving_resources_in_path . has ( p_resource ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This is going to be handled by save_resource_in_path when the time is right.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 16:36:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EditorFileSystem : : get_singleton ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorFileSystem : : get_singleton ( ) - > update_file ( p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton - > editor_folding . save_resource_folding ( p_resource ,  p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _resource_loaded ( Ref < Resource >  p_resource ,  const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2018-10-29 16:36:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton - > editor_folding . load_resource_folding ( p_resource ,  p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _feature_profile_changed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < EditorFeatureProfile >  profile  =  feature_profile_manager - > get_current_profile ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( profile . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-05 17:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( NodeDock : : get_singleton ( ) ,  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_NODE_DOCK ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-08 15:51:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// The Import dock is useless without the FileSystem dock. Ensure the configuration is valid.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  fs_dock_disabled  =  profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_FILESYSTEM_DOCK ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-05 17:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( FileSystemDock : : get_singleton ( ) ,  ! fs_dock_disabled ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( ImportDock : : get_singleton ( ) ,  ! fs_dock_disabled  & &  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_IMPORT_DOCK ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( history_dock ,  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_HISTORY_DOCK ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_3D ,  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_3D ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_SCRIPT ,  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_SCRIPT ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:07:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_GAME ,  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_GAME ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-29 19:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( AssetLibraryEditorPlugin : : is_available ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_ASSETLIB ,  ! profile - > is_feature_disabled ( EditorFeatureProfile : : FEATURE_ASSET_LIB ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-05 17:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( ImportDock : : get_singleton ( ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( NodeDock : : get_singleton ( ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( FileSystemDock : : get_singleton ( ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > set_dock_enabled ( history_dock ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_3D ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_SCRIPT ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:07:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_GAME ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-29 19:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( AssetLibraryEditorPlugin : : is_available ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											editor_main_screen - > set_button_enabled ( EditorMainScreen : : EDITOR_ASSETLIB ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-17 20:03:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _bind_methods ( )  {  
						 
					
						
							
								
									
										
										
										
											2018-12-31 11:52:09 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " push_item " ,  " object " ,  " property " ,  " inspector_only " ) ,  & EditorNode : : push_item ,  DEFVAL ( " " ) ,  DEFVAL ( false ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " set_edited_scene " ,  & EditorNode : : set_edited_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " stop_child_process " ,  & EditorNode : : stop_child_process ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:26:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " request_help_search " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " script_add_function_request " ,  PropertyInfo ( Variant : : OBJECT ,  " obj " ) ,  PropertyInfo ( Variant : : STRING ,  " function " ) ,  PropertyInfo ( Variant : : PACKED_STRING_ARRAY ,  " args " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " resource_saved " ,  PropertyInfo ( Variant : : OBJECT ,  " obj " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-06 02:15:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " scene_saved " ,  PropertyInfo ( Variant : : STRING ,  " path " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-27 13:52:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " scene_changed " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-09 20:43:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " scene_closed " ,  PropertyInfo ( Variant : : STRING ,  " path " ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-17 20:03:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  Node  * _resource_get_edited_scene ( )  {  
						 
					
						
							
								
									
										
										
										
											2017-01-10 01:04:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  EditorNode : : get_singleton ( ) - > get_edited_scene ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 08:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : _print_handler ( void  * p_this ,  const  String  & p_string ,  bool  p_error ,  bool  p_rich )  {  
						 
					
						
							
								
									
										
										
										
											2024-05-27 13:29:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									callable_mp_static ( & EditorNode : : _print_handler_impl ) . call_deferred ( p_string ,  p_error ,  p_rich ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-19 18:45:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorNode : : _print_handler_impl ( const  String  & p_string ,  bool  p_error ,  bool  p_rich )  {  
						 
					
						
							
								
									
										
										
										
											2023-08-02 11:43:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! singleton )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 08:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-19 18:45:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > log - > add_message ( p_string ,  EditorLog : : MSG_TYPE_ERROR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 08:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( p_rich )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-19 18:45:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > log - > add_message ( p_string ,  EditorLog : : MSG_TYPE_STD_RICH ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 08:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-19 18:45:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										singleton - > log - > add_message ( p_string ,  EditorLog : : MSG_TYPE_STD ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 08:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-14 20:02:31 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  _execute_thread ( void  * p_ud )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorNode : : ExecuteThreadArgs  * eta  =  ( EditorNode : : ExecuteThreadArgs  * ) p_ud ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 18:49:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err  =  OS : : get_singleton ( ) - > execute ( eta - > path ,  eta - > args ,  & eta - > output ,  & eta - > exitcode ,  true ,  & eta - > execute_output_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									print_verbose ( " Thread exit status:  "  +  itos ( eta - > exitcode ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										eta - > exitcode  =  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 19:22:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									eta - > done . set ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-11 17:20:04 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  EditorNode : : execute_and_show_output ( const  String  & p_title ,  const  String  & p_path ,  const  List < String >  & p_arguments ,  bool  p_close_on_ok ,  bool  p_close_on_errors ,  String  * r_output )  {  
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( execute_output_dialog )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										execute_output_dialog - > set_title ( p_title ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										execute_output_dialog - > get_ok_button ( ) - > set_disabled ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										execute_outputs - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										execute_outputs - > set_scroll_follow ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorInterface : : get_singleton ( ) - > popup_dialog_centered_ratio ( execute_output_dialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ExecuteThreadArgs  eta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									eta . path  =  p_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									eta . args  =  p_arguments ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									eta . exitcode  =  255 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  prev_len  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-19 13:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									eta . execute_output_thread . start ( _execute_thread ,  & eta ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 19:22:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( ! eta . done . is_set ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MutexLock  lock ( eta . execute_output_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( prev_len  ! =  eta . output . length ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  to_add  =  eta . output . substr ( prev_len ,  eta . output . length ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												prev_len  =  eta . output . length ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												execute_outputs - > add_text ( to_add ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												DisplayServer : : get_singleton ( ) - > process_events ( ) ;  // Get rid of pending events.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Main : : iteration ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OS : : get_singleton ( ) - > delay_usec ( 1000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-19 13:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									eta . execute_output_thread . wait_to_finish ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_outputs - > add_text ( " \n Exit Code:  "  +  itos ( eta . exitcode ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( execute_output_dialog )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_close_on_errors  & &  eta . exitcode  ! =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											execute_output_dialog - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_close_on_ok  & &  eta . exitcode  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											execute_output_dialog - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-15 16:35:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										execute_output_dialog - > get_ok_button ( ) - > set_disabled ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-11 17:20:04 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_output )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* r_output  =  eta . output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  eta . exitcode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 16:57:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorNode : : set_unfocused_low_processor_usage_mode_enabled ( bool  p_enabled )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unfocused_low_processor_usage_mode_enabled  =  p_enabled ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EditorNode : : EditorNode ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DEV_ASSERT ( ! singleton ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-03 18:25:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-16 22:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_translation_domain ( " godot.editor " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Resource : : _get_local_scene_func  =  _resource_get_edited_scene ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-10 01:04:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PortableCompressedTexture2D : : set_keep_all_compressed_buffers ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RenderingServer : : get_singleton ( ) - > set_debug_generate_wireframes ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-23 00:37:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										AudioServer : : get_singleton ( ) - > set_enable_tagging_used_audio_streams ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-21 01:00:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// No navigation by default if in editor.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( NavigationServer3D : : get_singleton ( ) - > get_debug_enabled ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NavigationServer3D : : get_singleton ( ) - > set_active ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NavigationServer3D : : get_singleton ( ) - > set_active ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// No physics by default if in editor.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PhysicsServer3D : : get_singleton ( ) - > set_active ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PhysicsServer2D : : get_singleton ( ) - > set_active ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-10 12:22:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// No scripting by default if in editor (except for tool).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ScriptServer : : set_scripting_enabled ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! DisplayServer : : get_singleton ( ) - > is_touchscreen_available ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Only if no touchscreen ui hint, disable emulation just in case.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Input : : get_singleton ( ) - > set_emulate_touch_from_mouse ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-02 13:56:19 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( DisplayServer : : get_singleton ( ) - > has_feature ( DisplayServer : : FEATURE_CUSTOM_CURSOR_SHAPE ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DisplayServer : : get_singleton ( ) - > cursor_set_custom_image ( Ref < Resource > ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-20 21:55:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-16 19:11:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SceneState : : set_disable_placeholders ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceLoader : : clear_translation_remaps ( ) ;  // Using no remaps if in editor.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-14 15:33:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceLoader : : clear_path_remaps ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-28 22:49:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceLoader : : set_create_missing_resources_if_class_unavailable ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-20 17:54:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorPropertyNameProcessor  * epnp  =  memnew ( EditorPropertyNameProcessor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( epnp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-25 17:18:35 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 23:53:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorUndoRedoManager : : get_singleton ( ) - > connect ( " version_changed " ,  callable_mp ( this ,  & EditorNode : : _update_undo_redo_allowed ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorUndoRedoManager : : get_singleton ( ) - > connect ( " history_changed " ,  callable_mp ( this ,  & EditorNode : : _update_undo_redo_allowed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-09 17:52:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ProjectSettings : : get_singleton ( ) - > connect ( " settings_changed " ,  callable_mp ( this ,  & EditorNode : : _update_from_settings ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-04 20:34:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDExtensionManager : : get_singleton ( ) - > connect ( " extensions_reloaded " ,  callable_mp ( this ,  & EditorNode : : _gdextensions_reloaded ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-08 18:35:15 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									TranslationServer : : get_singleton ( ) - > set_enabled ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Load settings.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! EditorSettings : : get_singleton ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										EditorSettings : : create ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-13 11:20:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/lock_selected_nodes " ,  TTRC ( " Lock Selected Node(s) " ) ,  KeyModifierMask : : CMD_OR_CTRL  |  Key : : L ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/unlock_selected_nodes " ,  TTRC ( " Unlock Selected Node(s) " ) ,  KeyModifierMask : : CMD_OR_CTRL  |  KeyModifierMask : : SHIFT  |  Key : : L ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/group_selected_nodes " ,  TTRC ( " Group Selected Node(s) " ) ,  KeyModifierMask : : CMD_OR_CTRL  |  Key : : G ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/ungroup_selected_nodes " ,  TTRC ( " Ungroup Selected Node(s) " ) ,  KeyModifierMask : : CMD_OR_CTRL  |  KeyModifierMask : : SHIFT  |  Key : : G ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 22:11:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-12 17:18:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									FileAccess : : set_backup_save ( EDITOR_GET ( " filesystem/on_save/safe_save_on_backup_then_rename " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-02 01:18:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_vsync_mode ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-30 15:34:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Warm up the surface upgrade tool as early as possible.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									surface_upgrade_tool  =  memnew ( SurfaceUpgradeTool ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									run_surface_upgrade_tool  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " surface_upgrade_tool " ,  " run_on_restart " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( run_surface_upgrade_tool )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SurfaceUpgradeTool : : get_singleton ( ) - > begin_upgrade ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-07 14:16:29 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  agile_input_event_flushing  =  EDITOR_GET ( " input/buffering/agile_event_flushing " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  use_accumulated_input  =  EDITOR_GET ( " input/buffering/use_accumulated_input " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Input : : get_singleton ( ) - > set_agile_input_event_flushing ( agile_input_event_flushing ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Input : : get_singleton ( ) - > set_use_accumulated_input ( use_accumulated_input ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-05 18:43:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  display_scale  =  EDITOR_GET ( " interface/editor/display_scale " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-22 20:20:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( display_scale )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-16 14:36:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  0 : 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Try applying a suitable display scale automatically.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( EditorSettings : : get_singleton ( ) - > get_auto_display_scale ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-16 14:36:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  1 : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( 0.75 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  2 : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( 1.0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  3 : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( 1.25 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  4 : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( 1.5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  5 : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( 1.75 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  6 : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( 2.0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default : 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-17 16:22:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												EditorScale : : set_scale ( EDITOR_GET ( " interface/editor/custom_display_scale " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 16:01:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-05 18:43:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Define a minimum window size to prevent UI elements from overlapping or being cut off.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-03 09:25:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Window  * w  =  Object : : cast_to < Window > ( SceneTree : : get_singleton ( ) - > get_root ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( w )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 13:19:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  Size2  minimum_size  =  Size2 ( 1024 ,  600 )  *  EDSCALE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										w - > set_min_size ( minimum_size ) ;  // Calling it this early doesn't sync the property with DS.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DisplayServer : : get_singleton ( ) - > window_set_min_size ( minimum_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-03 09:25:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-17 21:56:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileDialog : : set_default_show_hidden_files ( EDITOR_GET ( " filesystem/file_dialog/show_hidden_files " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileDialog : : set_default_display_mode ( ( EditorFileDialog : : DisplayMode ) EDITOR_GET ( " filesystem/file_dialog/display_mode " ) . operator  int ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-21 10:55:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  swap_cancel_ok  =  EDITOR_GET ( " interface/editor/accept_dialog_cancel_ok_buttons " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( swap_cancel_ok  ! =  0 )  {  // 0 is auto, set in register_scene based on DisplayServer.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Swap on means OK first.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										AcceptDialog : : set_swap_cancel_ok ( swap_cancel_ok  = =  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-17 08:54:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  ed_root_dir  =  EDITOR_GET ( " interface/editor/ui_layout_direction " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Control : : set_root_layout_direction ( ed_root_dir ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Window : : set_root_layout_direction ( ed_root_dir ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-21 10:55:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceLoader : : set_abort_on_missing_resources ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-17 14:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceLoader : : set_error_notify_func ( & EditorNode : : add_io_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ResourceLoader : : set_dependency_error_notify_func ( & EditorNode : : _dependency_error_report ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-07 13:44:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SceneState : : set_instantiation_warning_notify_func ( [ ] ( const  String  & p_warning )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										add_io_warning ( p_warning ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										callable_mp ( EditorInterface : : get_singleton ( ) ,  & EditorInterface : : mark_scene_as_unsaved ) . call_deferred ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Register importers at the beginning, so dialogs are created with the right extensions.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-07 17:00:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterTexture >  import_texture  =  memnew ( ResourceImporterTexture ( true ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_texture ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 20:41:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 09:34:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterLayeredTexture >  import_cubemap ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_cubemap . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_cubemap - > set_mode ( ResourceImporterLayeredTexture : : MODE_CUBEMAP ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_cubemap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-06 14:56:06 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < ResourceImporterLayeredTexture >  import_array ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_array . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_array - > set_mode ( ResourceImporterLayeredTexture : : MODE_2D_ARRAY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-06 14:56:06 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_array ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterLayeredTexture >  import_cubemap_array ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_cubemap_array . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_cubemap_array - > set_mode ( ResourceImporterLayeredTexture : : MODE_CUBEMAP_ARRAY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_cubemap_array ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 09:34:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-07 17:00:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterLayeredTexture >  import_3d  =  memnew ( ResourceImporterLayeredTexture ( true ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 09:34:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_3d - > set_mode ( ResourceImporterLayeredTexture : : MODE_3D ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-09 12:40:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_3d ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 09:34:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-29 16:45:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterImage >  import_image ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_image . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-29 16:45:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_image ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-19 15:54:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterTextureAtlas >  import_texture_atlas ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_texture_atlas . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-19 15:54:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_texture_atlas ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-27 15:30:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterDynamicFont >  import_font_data_dynamic ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										import_font_data_dynamic . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_font_data_dynamic ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < ResourceImporterBMFont >  import_font_data_bmfont ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										import_font_data_bmfont . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_font_data_bmfont ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < ResourceImporterImageFont >  import_font_data_image ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										import_font_data_image . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_font_data_image ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 20:41:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterCSVTranslation >  import_csv_translation ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_csv_translation . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 20:41:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_csv_translation ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 22:51:26 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterWAV >  import_wav ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_wav . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 22:51:26 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_wav ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-29 20:38:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterOBJ >  import_obj ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_obj . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-29 20:38:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_obj ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-19 23:19:21 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterShaderFile >  import_shader_file ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_shader_file . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-19 23:19:21 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_shader_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-06 00:17:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterScene >  import_scene  =  memnew ( ResourceImporterScene ( " PackedScene " ,  true ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 09:48:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_scene ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-06 00:17:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ResourceImporterScene >  import_animation  =  memnew ( ResourceImporterScene ( " AnimationLibrary " ,  true ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 16:07:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_animation ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 09:48:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 14:34:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < EditorSceneFormatImporterCollada >  import_collada ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											import_collada . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-08 00:48:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceImporterScene : : add_scene_importer ( import_collada ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-17 21:05:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-02-12 21:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < EditorOBJImporter >  import_obj2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											import_obj2 . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-08 00:48:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceImporterScene : : add_scene_importer ( import_obj2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-02 15:34:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 14:34:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < EditorSceneFormatImporterESCN >  import_escn ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											import_escn . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-08 00:48:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ResourceImporterScene : : add_scene_importer ( import_escn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 09:48:04 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-06 16:36:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < ResourceImporterBitMap >  import_bitmap ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										import_bitmap . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-06 16:36:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ResourceFormatImporter : : get_singleton ( ) - > add_importer ( import_bitmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < EditorInspectorDefaultPlugin >  eidp ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										eidp . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorInspector : : add_inspector_plugin ( eidp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 19:05:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < EditorInspectorRootMotionPlugin >  rmp ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rmp . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-26 19:05:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorInspector : : add_inspector_plugin ( rmp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-14 18:15:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 14:39:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < EditorInspectorVisualShaderModePlugin >  smp ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										smp . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-14 18:15:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorInspector : : add_inspector_plugin ( smp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:48:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < EditorInspectorParticleProcessMaterialPlugin >  ppm ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ppm . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorInspector : : add_inspector_plugin ( ppm ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_selection  =  memnew ( EditorSelection ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileSystem  * efs  =  memnew ( EditorFileSystem ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									add_child ( efs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-03 23:07:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorContextMenuPluginManager : : create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Used for previews.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									FileDialog : : get_icon_func  =  _file_dialog_get_icon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FileDialog : : register_func  =  _file_dialog_register ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FileDialog : : unregister_func  =  _file_dialog_unregister ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileDialog : : get_icon_func  =  _file_dialog_get_icon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileDialog : : register_func  =  _editor_file_dialog_register ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileDialog : : unregister_func  =  _editor_file_dialog_unregister ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_export  =  memnew ( EditorExport ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-19 23:19:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( editor_export ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Exporters might need the theme.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 13:14:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorThemeManager : : initialize ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									theme  =  EditorThemeManager : : generate_theme ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-13 02:33:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DisplayServer : : set_early_window_clear_color_override ( true ,  theme - > get_color ( SNAME ( " background " ) ,  EditorStringName ( Editor ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-11 13:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									register_exporters ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " canvas_item_editor/pan_view " ,  TTRC ( " Pan View " ) ,  Key : : SPACE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-17 18:02:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 16:43:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  Vector < String >  textfile_ext  =  ( ( String ) ( EDITOR_GET ( " docks/filesystem/textfile_extensions " ) ) ) . split ( " , " ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  textfile_ext )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										textfile_extensions . insert ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-05 12:12:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  Vector < String >  other_file_ext  =  ( ( String ) ( EDITOR_GET ( " docks/filesystem/other_file_extensions " ) ) ) . split ( " , " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  String  & E  :  other_file_ext )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										other_file_extensions . insert ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 22:09:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview  =  memnew ( EditorResourcePreview ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( resource_preview ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									progress_dialog  =  memnew ( ProgressDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 17:00:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									progress_dialog - > set_unparent_when_invisible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-10 19:07:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									progress_dialog - > connect ( SceneStringName ( visibility_changed ) ,  callable_mp ( this ,  & EditorNode : : _progress_dialog_visibility_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base  =  memnew ( Panel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( gui_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Take up all screen.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > set_anchors_and_offsets_preset ( Control : : PRESET_FULL_RECT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-22 16:24:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > set_anchor ( SIDE_RIGHT ,  Control : : ANCHOR_END ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > set_anchor ( SIDE_BOTTOM ,  Control : : ANCHOR_END ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > set_end ( Point2 ( 0 ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_vbox  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( main_vbox ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar  =  memnew ( EditorTitleBar ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_vbox - > add_child ( title_bar ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_l_hsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_l_hsplit - > set_name ( " DockHSplitLeftL " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_vbox - > add_child ( left_l_hsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_l_hsplit - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_l_vsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_l_vsplit - > set_name ( " DockVSplitLeftL " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_l_vsplit - > set_vertical ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_l_hsplit - > add_child ( left_l_vsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TabContainer  * dock_slot [ EditorDockManager : : DOCK_SLOT_MAX ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_UL ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_UL ] - > set_name ( " DockSlotLeftUL " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_l_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_UL ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_BL ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_BL ] - > set_name ( " DockSlotLeftBL " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_l_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_BL ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_r_hsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_r_hsplit - > set_name ( " DockHSplitLeftR " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_l_hsplit - > add_child ( left_r_hsplit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_r_vsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_r_vsplit - > set_name ( " DockVSplitLeftR " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_r_vsplit - > set_vertical ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_r_hsplit - > add_child ( left_r_vsplit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_UR ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_UR ] - > set_name ( " DockSlotLeftUR " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_r_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_UR ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_BR ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_BR ] - > set_name ( " DockSlotLeftBR " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									left_r_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_LEFT_BR ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_hsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_hsplit - > set_name ( " DockHSplitMain " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_r_hsplit - > add_child ( main_hsplit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VBoxContainer  * center_vb  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_hsplit - > add_child ( center_vb ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									center_split - > set_name ( " DockVSplitCenter " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									center_split - > set_vertical ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split - > set_collapsed ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_vb - > add_child ( center_split ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_hsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_hsplit - > set_name ( " DockHSplitRight " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_hsplit - > add_child ( right_hsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_l_vsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_l_vsplit - > set_name ( " DockVSplitRightL " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_l_vsplit - > set_vertical ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_hsplit - > add_child ( right_l_vsplit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_UL ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_UL ] - > set_name ( " DockSlotRightUL " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_l_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_UL ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_BL ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_BL ] - > set_name ( " DockSlotRightBL " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_l_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_BL ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_r_vsplit  =  memnew ( DockSplitContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_r_vsplit - > set_name ( " DockVSplitRightR " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_r_vsplit - > set_vertical ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_hsplit - > add_child ( right_r_vsplit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_UR ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_UR ] - > set_name ( " DockSlotRightUR " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_r_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_UR ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_BR ]  =  memnew ( TabContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_BR ] - > set_name ( " DockSlotRightBR " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_r_vsplit - > add_child ( dock_slot [ EditorDockManager : : DOCK_SLOT_RIGHT_BR ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager  =  memnew ( EditorDockManager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Save the splits for easier access.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_vsplit ( left_l_vsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_vsplit ( left_r_vsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_vsplit ( right_l_vsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_vsplit ( right_r_vsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_hsplit ( left_l_hsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_hsplit ( left_r_hsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_hsplit ( main_hsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_dock_manager - > add_hsplit ( right_hsplit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  EditorDockManager : : DOCK_SLOT_MAX ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										editor_dock_manager - > register_dock_slot ( ( EditorDockManager : : DockSlot ) i ,  dock_slot [ i ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layout_save_delay_timer  =  memnew ( Timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( editor_layout_save_delay_timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_layout_save_delay_timer - > set_wait_time ( 0.5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_layout_save_delay_timer - > set_one_shot ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_layout_save_delay_timer - > connect ( " timeout " ,  callable_mp ( this ,  & EditorNode : : _save_editor_layout ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-12 07:24:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scan_changes_timer  =  memnew ( Timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scan_changes_timer - > set_wait_time ( 0.5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scan_changes_timer - > set_autostart ( EDITOR_GET ( " interface/editor/import_resources_when_unfocused " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scan_changes_timer - > connect ( " timeout " ,  callable_mp ( EditorFileSystem : : get_singleton ( ) ,  & EditorFileSystem : : scan_changes ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( scan_changes_timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									top_split  =  memnew ( VSplitContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split - > add_child ( top_split ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									top_split - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									top_split - > set_collapsed ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VBoxContainer  * srt  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									srt - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-08 10:14:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									srt - > add_theme_constant_override ( " separation " ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									top_split - > add_child ( srt ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs  =  memnew ( EditorSceneTabs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									srt - > add_child ( scene_tabs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_tabs - > connect ( " tab_changed " ,  callable_mp ( this ,  & EditorNode : : _set_current_scene ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scene_tabs - > connect ( " tab_closed " ,  callable_mp ( this ,  & EditorNode : : _scene_tab_closed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-23 12:42:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-19 20:49:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 19:52:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free - > set_theme_type_variation ( " FlatMenuButton " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/distraction_free_mode " ,  TTRC ( " Distraction Free Mode " ) ,  KeyModifierMask : : CTRL  |  KeyModifierMask : : SHIFT  |  Key : : F11 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-30 22:01:12 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/distraction_free_mode " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : SHIFT  |  Key : : D ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/toggle_last_opened_bottom_panel " ,  TTRC ( " Toggle Last Opened Bottom Panel " ) ,  KeyModifierMask : : CMD_OR_CTRL  |  Key : : J ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free - > set_shortcut ( ED_GET_SHORTCUT ( " editor/distraction_free_mode " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free - > set_tooltip_text ( TTRC ( " Toggle distraction-free mode. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-24 11:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free - > set_toggle_mode ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > add_extra_button ( distraction_free ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 09:40:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									distraction_free - > connect ( SceneStringName ( pressed ) ,  callable_mp ( this ,  & EditorNode : : _toggle_distraction_free_mode ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 17:57:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_main_screen  =  memnew ( EditorMainScreen ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_main_screen - > set_custom_minimum_size ( Size2 ( 0 ,  80 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_main_screen - > set_draw_behind_parent ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									srt - > add_child ( editor_main_screen ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_main_screen - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-03 22:51:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root  =  memnew ( SubViewport ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-13 16:18:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_embedding_subwindows ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 13:36:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_disable_3d ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 22:41:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_root - > set_disable_input ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									scene_root - > set_as_audio_listener_2d ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-19 19:41:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  global_menu  =  ! bool ( EDITOR_GET ( " interface/editor/use_embedded_menu " ) )  & &  NativeMenu : : get_singleton ( ) - > has_feature ( NativeMenu : : FEATURE_GLOBAL_MENU ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  can_expand  =  bool ( EDITOR_GET ( " interface/editor/expand_to_title " ) )  & &  DisplayServer : : get_singleton ( ) - > has_feature ( DisplayServer : : FEATURE_EXTEND_TO_TITLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( can_expand )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Add spacer to avoid other controls under window minimize/maximize/close buttons (left side).
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										left_menu_spacer  =  memnew ( Control ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										left_menu_spacer - > set_mouse_filter ( Control : : MOUSE_FILTER_PASS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										title_bar - > add_child ( left_menu_spacer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_menu  =  memnew ( MenuBar ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 10:48:42 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_menu - > set_mouse_filter ( Control : : MOUSE_FILTER_STOP ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar - > add_child ( main_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-05 05:27:34 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_menu - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-06 22:00:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_menu - > set_theme_type_variation ( " MainMenuBar " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_menu - > set_start_index ( 0 ) ;  // Main menu, add to the start of global menu.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > set_prefer_global_menu ( global_menu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > set_switch_on_hover ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > set_name ( TTR ( " Scene " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > add_child ( file_menu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > set_menu_tooltip ( 0 ,  TTR ( " Operations with scene files. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									accept  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 11:42:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									accept - > set_autowrap ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									accept - > set_min_size ( Vector2i ( 600 ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									accept - > set_unparent_when_invisible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_accept  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									save_accept - > set_unparent_when_invisible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_accept - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) . bind ( ( int ) MenuOptions : : FILE_SAVE_AS_SCENE ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 01:35:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_export  =  memnew ( ProjectExportDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( project_export ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dependency_error  =  memnew ( DependencyErrorDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( dependency_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dependency_fixer  =  memnew ( DependencyEditor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( dependency_fixer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_settings_dialog  =  memnew ( EditorSettingsDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( editor_settings_dialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-01 00:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_settings_editor  =  memnew ( ProjectSettingsEditor ( & editor_data ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( project_settings_editor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-06 02:00:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_import_settings  =  memnew ( SceneImportSettingsDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-19 09:57:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( scene_import_settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-06 02:00:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									audio_stream_import_settings  =  memnew ( AudioStreamImportSettingsDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-21 01:00:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( audio_stream_import_settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-06 02:00:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									fontdata_import_settings  =  memnew ( DynamicFontImportSettingsDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-27 15:30:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( fontdata_import_settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_template_manager  =  memnew ( ExportTemplateManager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( export_template_manager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-08 19:18:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									feature_profile_manager  =  memnew ( EditorFeatureProfileManager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( feature_profile_manager ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 14:18:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									build_profile_manager  =  memnew ( EditorBuildProfileManager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( build_profile_manager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									about  =  memnew ( EditorAbout ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( about ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									feature_profile_manager - > connect ( " current_feature_profile_changed " ,  callable_mp ( this ,  & EditorNode : : _feature_profile_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-02 13:43:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if !defined(ANDROID_ENABLED) && !defined(WEB_ENABLED) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fbx_importer_manager  =  memnew ( FBXImporterManager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( fbx_importer_manager ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									warning  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									warning - > set_unparent_when_invisible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-09 21:11:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									warning - > add_button ( TTR ( " Copy Text " ) ,  true ,  " copy " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									warning - > connect ( " custom_action " ,  callable_mp ( this ,  & EditorNode : : _copy_warning ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-30 13:59:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/next_tab " ,  TTRC ( " Next Scene Tab " ) ,  KeyModifierMask : : CTRL  +  Key : : TAB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/prev_tab " ,  TTRC ( " Previous Scene Tab " ) ,  KeyModifierMask : : CTRL  +  KeyModifierMask : : SHIFT  +  Key : : TAB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " editor/filter_files " ,  TTRC ( " Focus FileSystem Filter " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : ALT  +  Key : : P ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-29 18:58:16 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									command_palette  =  EditorCommandPalette : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									command_palette - > set_title ( TTR ( " Command Palette " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( command_palette ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/new_scene " ,  TTRC ( " New Scene " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  Key : : N ) ,  FILE_NEW_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/new_inherited_scene " ,  TTRC ( " New Inherited Scene... " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : SHIFT  +  Key : : N ) ,  FILE_NEW_INHERITED_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/open_scene " ,  TTRC ( " Open Scene... " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  Key : : O ) ,  FILE_OPEN_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/reopen_closed_scene " ,  TTRC ( " Reopen Closed Scene " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : SHIFT  +  Key : : T ) ,  FILE_OPEN_PREV ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 17:33:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									recent_scenes  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_submenu_node_item ( TTR ( " Open Recent " ) ,  recent_scenes ,  FILE_OPEN_RECENT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									recent_scenes - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _open_recent_scene ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-10 17:21:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/save_scene " ,  TTRC ( " Save Scene " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  Key : : S ) ,  FILE_SAVE_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/save_scene_as " ,  TTRC ( " Save Scene As... " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : SHIFT  +  Key : : S ) ,  FILE_SAVE_AS_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/save_all_scenes " ,  TTRC ( " Save All Scenes " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : SHIFT  +  KeyModifierMask : : ALT  +  Key : : S ) ,  FILE_SAVE_ALL_SCENES ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-12 09:37:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-12 22:23:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_ARRAY_AND_COMMAND ( " editor/quick_open " ,  TTRC ( " Quick Open... " ) ,  {  int32_t ( KeyModifierMask : : SHIFT  +  KeyModifierMask : : ALT  +  Key : : O ) ,  int32_t ( KeyModifierMask : : CMD_OR_CTRL  +  Key : : P )  } ) ,  FILE_QUICK_OPEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-16 15:32:37 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE_ARRAY ( " editor/quick_open " ,  " macos " ,  {  int32_t ( KeyModifierMask : : META  +  KeyModifierMask : : CTRL  +  Key : : O ) ,  int32_t ( KeyModifierMask : : CMD_OR_CTRL  +  Key : : P )  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/quick_open_scene " ,  TTRC ( " Quick Open Scene... " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : SHIFT  +  Key : : O ) ,  FILE_QUICK_OPEN_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/quick_open_script " ,  TTRC ( " Quick Open Script... " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : ALT  +  Key : : O ) ,  FILE_QUICK_OPEN_SCRIPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-12 22:23:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 18:11:04 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_as_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 17:33:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_submenu_node_item ( TTR ( " Export As... " ) ,  export_as_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_as_menu - > add_shortcut ( ED_SHORTCUT ( " editor/export_as_mesh_library " ,  TTRC ( " MeshLibrary... " ) ) ,  FILE_EXPORT_MESH_LIBRARY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 18:11:04 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									export_as_menu - > connect ( " index_pressed " ,  callable_mp ( this ,  & EditorNode : : _export_as_menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 22:09:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_GET_SHORTCUT ( " ui_undo " ) ,  EDIT_UNDO ,  false ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_GET_SHORTCUT ( " ui_redo " ) ,  EDIT_REDO ,  false ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-12 22:23:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/reload_saved_scene " ,  TTRC ( " Reload Saved Scene " ) ) ,  EDIT_RELOAD_SAVED_SCENE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/close_scene " ,  TTRC ( " Close Scene " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  KeyModifierMask : : SHIFT  +  Key : : W ) ,  FILE_CLOSE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-27 14:18:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/close_scene " ,  " macos " ,  KeyModifierMask : : CMD_OR_CTRL  +  Key : : W ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! global_menu  | |  ! OS : : get_singleton ( ) - > has_feature ( " macos " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// On macOS  "Quit" and "About" options are in the "app" menu.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										file_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/file_quit " ,  TTRC ( " Quit " ) ,  KeyModifierMask : : CMD_OR_CTRL  +  Key : : Q ) ,  FILE_QUIT ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-22 18:04:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_settings " ,  TTRC ( " Editor Settings... " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-15 20:52:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_settings " ,  " macos " ,  KeyModifierMask : : META  +  Key : : COMMA ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef MACOS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2024-03-15 13:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( global_menu  & &  NativeMenu : : get_singleton ( ) - > has_system_menu ( NativeMenu : : APPLICATION_MENU_ID ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-15 20:52:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										apple_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-19 19:41:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										apple_menu - > set_system_menu ( NativeMenu : : APPLICATION_MENU_ID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-15 20:52:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										main_menu - > add_child ( apple_menu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										apple_menu - > add_shortcut ( ED_GET_SHORTCUT ( " editor/editor_settings " ) ,  SETTINGS_PREFERENCES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										apple_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										apple_menu - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-15 20:52:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									project_menu - > set_name ( TTR ( " Project " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > add_child ( project_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-12 09:37:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/project_settings " ,  TTRC ( " Project Settings... " ) ,  Key : : NONE ,  TTRC ( " Project Settings " ) ) ,  RUN_SETTINGS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-12 22:23:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 20:59:34 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_item ( TTR ( " Version Control " ) ,  VCS_MENU ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-03 20:12:08 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/export " ,  TTRC ( " Export... " ) ,  Key : : NONE ,  TTRC ( " Export " ) ) ,  FILE_EXPORT_PROJECT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-13 20:48:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef ANDROID_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_item ( TTR ( " Install Android Build Template... " ) ,  FILE_INSTALL_ANDROID_SOURCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									project_menu - > add_item ( TTR ( " Open User Data Folder " ) ,  RUN_USER_DATA_FOLDER ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-13 20:48:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-06-22 18:04:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 14:18:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-16 21:50:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tool_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tool_menu - > connect ( " index_pressed " ,  callable_mp ( this ,  & EditorNode : : _tool_menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 17:33:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_submenu_node_item ( TTR ( " Tools " ) ,  tool_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tool_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/orphan_resource_explorer " ,  TTRC ( " Orphan Resource Explorer... " ) ) ,  TOOLS_ORPHAN_RESOURCES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tool_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/engine_compilation_configuration_editor " ,  TTRC ( " Engine Compilation Configuration Editor... " ) ) ,  TOOLS_BUILD_PROFILE_MANAGER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tool_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/upgrade_mesh_surfaces " ,  TTRC ( " Upgrade Mesh Surfaces... " ) ) ,  TOOLS_SURFACE_UPGRADE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_shortcut ( ED_SHORTCUT ( " editor/reload_current_project " ,  TTRC ( " Reload Current Project " ) ) ,  RELOAD_CURRENT_PROJECT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/quit_to_project_list " ,  TTRC ( " Quit to Project List " ) ,  KeyModifierMask : : CTRL  +  KeyModifierMask : : SHIFT  +  Key : : Q ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-16 11:28:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/quit_to_project_list " ,  " macos " ,  KeyModifierMask : : META  +  KeyModifierMask : : CTRL  +  KeyModifierMask : : ALT  +  Key : : Q ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > add_shortcut ( ED_GET_SHORTCUT ( " editor/quit_to_project_list " ) ,  RUN_PROJECT_MANAGER ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Spacer to center 2D / 3D / Script buttons.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HBoxContainer  * left_spacer  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_spacer - > set_mouse_filter ( Control : : MOUSE_FILTER_PASS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_spacer - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar - > add_child ( left_spacer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( can_expand  & &  global_menu )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_title  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 15:57:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										project_title - > add_theme_font_override ( SceneStringName ( font ) ,  theme - > get_font ( SNAME ( " bold " ) ,  EditorStringName ( EditorFonts ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_title - > add_theme_font_size_override ( SceneStringName ( font_size ) ,  theme - > get_font_size ( SNAME ( " bold_size " ) ,  EditorStringName ( EditorFonts ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										project_title - > set_focus_mode ( Control : : FOCUS_NONE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_title - > set_text_overrun_behavior ( TextServer : : OVERRUN_TRIM_ELLIPSIS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_title - > set_vertical_alignment ( VERTICAL_ALIGNMENT_CENTER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										project_title - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-20 12:47:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										project_title - > set_mouse_filter ( Control : : MOUSE_FILTER_PASS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										left_spacer - > add_child ( project_title ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-11 02:18:54 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HBoxContainer  * main_editor_button_hb  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 10:48:42 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_editor_button_hb - > set_mouse_filter ( Control : : MOUSE_FILTER_STOP ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:08:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_main_screen - > set_button_container ( main_editor_button_hb ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar - > add_child ( main_editor_button_hb ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-13 09:46:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Options are added and handled by DebuggerEditorPlugin.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									debug_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									debug_menu - > set_name ( TTR ( " Debug " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > add_child ( debug_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-12 09:37:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									settings_menu - > set_name ( TTR ( " Editor " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_menu - > add_child ( settings_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-15 20:52:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef MACOS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! global_menu )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										settings_menu - > add_shortcut ( ED_GET_SHORTCUT ( " editor/editor_settings " ) ,  SETTINGS_PREFERENCES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_shortcut ( ED_GET_SHORTCUT ( " editor/editor_settings " ) ,  SETTINGS_PREFERENCES ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-15 20:52:56 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_shortcut ( ED_SHORTCUT ( " editor/command_palette " ,  TTRC ( " Command Palette... " ) ,  KeyModifierMask : : CMD_OR_CTRL  |  KeyModifierMask : : SHIFT  |  Key : : P ) ,  HELP_COMMAND_PALETTE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-28 10:13:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_submenu_node_item ( TTR ( " Editor Docks " ) ,  editor_dock_manager - > get_docks_menu ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-24 11:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-23 18:29:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 17:33:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_submenu_node_item ( TTR ( " Editor Layout " ) ,  editor_layouts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_layouts - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _layout_menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/take_screenshot " ,  TTRC ( " Take Screenshot " ) ,  KeyModifierMask : : CTRL  |  Key : : F12 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 12:37:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/take_screenshot " ,  " macos " ,  KeyModifierMask : : META  |  Key : : F12 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_shortcut ( ED_GET_SHORTCUT ( " editor/take_screenshot " ) ,  EDITOR_SCREENSHOT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 14:13:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > set_item_tooltip ( - 1 ,  TTR ( " Screenshots are stored in the user data folder ( \" user:// \" ). " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/fullscreen_mode " ,  TTRC ( " Toggle Fullscreen " ) ,  KeyModifierMask : : SHIFT  |  Key : : F11 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 12:37:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/fullscreen_mode " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : CTRL  |  Key : : F ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_shortcut ( ED_GET_SHORTCUT ( " editor/fullscreen_mode " ) ,  SETTINGS_TOGGLE_FULLSCREEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									settings_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-13 20:48:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef ANDROID_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( OS : : get_singleton ( ) - > get_data_path ( )  = =  OS : : get_singleton ( ) - > get_config_path ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-12 16:48:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Configuration and data folders are located in the same place (Windows/macOS).
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										settings_menu - > add_item ( TTR ( " Open Editor Data/Settings Folder " ) ,  SETTINGS_EDITOR_DATA_FOLDER ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Separate configuration and data folders (Linux).
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										settings_menu - > add_item ( TTR ( " Open Editor Data Folder " ) ,  SETTINGS_EDITOR_DATA_FOLDER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										settings_menu - > add_item ( TTR ( " Open Editor Settings Folder " ) ,  SETTINGS_EDITOR_CONFIG_FOLDER ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-13 20:48:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2018-07-25 19:53:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > add_item ( TTR ( " Manage Editor Features... " ) ,  SETTINGS_MANAGE_FEATURE_PROFILES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									settings_menu - > add_item ( TTR ( " Manage Export Templates... " ) ,  SETTINGS_MANAGE_EXPORT_TEMPLATES ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-02 13:43:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if !defined(ANDROID_ENABLED) && !defined(WEB_ENABLED) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									settings_menu - > add_item ( TTR ( " Configure FBX Importer... " ) ,  SETTINGS_MANAGE_FBX_IMPORTER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-05-26 15:34:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									help_menu - > set_name ( TTR ( " Help " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-15 13:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( global_menu  & &  NativeMenu : : get_singleton ( ) - > has_system_menu ( NativeMenu : : HELP_MENU_ID ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										help_menu - > set_system_menu ( NativeMenu : : HELP_MENU_ID ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									main_menu - > add_child ( help_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 03:25:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_help " ,  TTRC ( " Search Help... " ) ,  Key : : F1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-13 16:31:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_help " ,  " macos " ,  KeyModifierMask : : ALT  |  Key : : SPACE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-06 16:11:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_icon_shortcut ( theme - > get_icon ( SNAME ( " HelpSearch " ) ,  EditorStringName ( EditorIcons ) ) ,  ED_GET_SHORTCUT ( " editor/editor_help " ) ,  HELP_SEARCH ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/online_docs " ,  TTRC ( " Online Documentation " ) ) ,  HELP_DOCS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									help_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/forum " ,  TTRC ( " Forum " ) ) ,  HELP_FORUM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									help_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/community " ,  TTRC ( " Community " ) ) ,  HELP_COMMUNITY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-07 16:01:33 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_icon_shortcut ( theme - > get_icon ( SNAME ( " ActionCopy " ) ,  EditorStringName ( EditorIcons ) ) ,  ED_SHORTCUT_AND_COMMAND ( " editor/copy_system_info " ,  TTRC ( " Copy System Info " ) ) ,  HELP_COPY_SYSTEM_INFO ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-29 22:20:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > set_item_tooltip ( - 1 ,  TTR ( " Copies the system info as a single-line text into the clipboard. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/report_a_bug " ,  TTRC ( " Report a Bug " ) ) ,  HELP_REPORT_A_BUG ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									help_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/suggest_a_feature " ,  TTRC ( " Suggest a Feature " ) ) ,  HELP_SUGGEST_A_FEATURE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									help_menu - > add_shortcut ( ED_SHORTCUT_AND_COMMAND ( " editor/send_docs_feedback " ,  TTRC ( " Send Docs Feedback " ) ) ,  HELP_SEND_DOCS_FEEDBACK ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_separator ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! global_menu  | |  ! OS : : get_singleton ( ) - > has_feature ( " macos " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// On macOS  "Quit" and "About" options are in the "app" menu.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										help_menu - > add_icon_shortcut ( theme - > get_icon ( SNAME ( " Godot " ) ,  EditorStringName ( EditorIcons ) ) ,  ED_SHORTCUT_AND_COMMAND ( " editor/about " ,  TTRC ( " About Godot... " ) ) ,  HELP_ABOUT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									help_menu - > add_icon_shortcut ( theme - > get_icon ( SNAME ( " Heart " ) ,  EditorStringName ( EditorIcons ) ) ,  ED_SHORTCUT_AND_COMMAND ( " editor/support_development " ,  TTRC ( " Support Godot Development " ) ) ,  HELP_SUPPORT_GODOT_DEVELOPMENT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Spacer to center 2D / 3D / Script buttons.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Control  * right_spacer  =  memnew ( Control ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_spacer - > set_mouse_filter ( Control : : MOUSE_FILTER_PASS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_spacer - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar - > add_child ( right_spacer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									project_run_bar  =  memnew ( EditorRunBar ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 10:48:42 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_run_bar - > set_mouse_filter ( Control : : MOUSE_FILTER_STOP ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar - > add_child ( project_run_bar ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									project_run_bar - > connect ( " play_pressed " ,  callable_mp ( this ,  & EditorNode : : _project_run_started ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									project_run_bar - > connect ( " stop_pressed " ,  callable_mp ( this ,  & EditorNode : : _project_run_stopped ) ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												Implement Running Godot as Movie Writer
* Allows running the game in "movie writer" mode.
* It ensures entirely stable framerate, so your run can be saved stable and with proper sound (which is impossible if your CPU/GPU can't sustain doing this in real-time).
* If disabling vsync, it can save movies faster than the game is run, but if you want to control the interaction it can get difficult.
* Implements a simple, default MJPEG writer.
This new features has two main use cases, which have high demand:
* Saving game videos in high quality and ensuring the frame rate is *completely* stable, always.
* Using Godot as a tool to make movies and animations (which is ideal if you want interaction, or creating them procedurally. No other software is as good for this).
**Note**: This feature **IS NOT** for capturing real-time footage. Use something like OBS, SimpleScreenRecorder or FRAPS to achieve that, as they do a much better job at intercepting the compositor than Godot can probably do using Vulkan or OpenGL natively. If your game runs near real-time when capturing, you can still use this feature but it will play no sound (sound will be saved directly).
Usage:
$ godot --write-movie movie.avi [scene_file.tscn]
Missing:
* Options for configuring video writing via GLOBAL_DEF
* UI Menu for launching with this mode from the editor.
* Add to list of command line options.
* Add a feature tag to override configurations when movie writing (fantastic for saving videos with highest quality settings).
											 
										 
										
											2022-06-17 00:55:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-09 16:10:07 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HBoxContainer  * right_menu_hb  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 10:48:42 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_menu_hb - > set_mouse_filter ( Control : : MOUSE_FILTER_STOP ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									title_bar - > add_child ( right_menu_hb ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-09 16:10:07 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer  =  memnew ( OptionButton ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 22:54:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > set_visible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > set_flat ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-18 15:45:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > set_theme_type_variation ( " TopBarOptionButton " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-23 22:54:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > set_fit_to_longest_item ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > set_focus_mode ( Control : : FOCUS_NONE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 17:28:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									renderer - > set_tooltip_text ( TTR ( " Choose a rendering method. \n \n Notes: \n - On mobile platforms, the Mobile rendering method is used if Forward+ is selected here. \n - On the web platform, the Compatibility rendering method is always used. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-18 18:11:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_menu_hb - > add_child ( renderer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-18 18:11:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( can_expand )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Add spacer to avoid other controls under the window minimize/maximize/close buttons (right side).
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-22 12:06:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										right_menu_spacer  =  memnew ( Control ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										right_menu_spacer - > set_mouse_filter ( Control : : MOUSE_FILTER_PASS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										title_bar - > add_child ( right_menu_spacer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-14 11:38:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  current_renderer_ps  =  GLOBAL_GET ( " rendering/renderer/rendering_method " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current_renderer_ps  =  current_renderer_ps . to_lower ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  current_renderer_os  =  OS : : get_singleton ( ) - > get_current_rendering_method ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-18 18:11:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-14 11:38:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Add the renderers name to the UI.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( current_renderer_ps  = =  current_renderer_os )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:21:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										renderer - > connect ( SceneStringName ( item_selected ) ,  callable_mp ( this ,  & EditorNode : : _renderer_selected ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-14 11:38:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// As we are doing string comparisons, keep in standard case to prevent problems with capitals
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// "vulkan" in particular uses lowercase "v" in the code, and uppercase in the UI.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PackedStringArray  renderers  =  ProjectSettings : : get_singleton ( ) - > get_custom_property_info ( ) . get ( StringName ( " rendering/renderer/rendering_method " ) ) . hint_string . split ( " , " ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  renderers . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  rendering_method  =  renderers [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_add_renderer_entry ( rendering_method ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											renderer - > set_item_metadata ( i ,  rendering_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Lowercase for standard comparison.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rendering_method  =  rendering_method . to_lower ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( current_renderer_ps  = =  rendering_method )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												renderer - > select ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												renderer_current  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-14 11:38:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// It's an CLI-overridden rendering method.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_add_renderer_entry ( current_renderer_os ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										renderer - > set_item_metadata ( 0 ,  current_renderer_os ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										renderer - > select ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										renderer_current  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-07 17:44:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_renderer_color ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-18 18:11:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									video_restart_dialog  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									video_restart_dialog - > set_ok_button_text ( TTR ( " Save & Restart " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									video_restart_dialog - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) . bind ( SET_RENDERER_NAME_SAVE_AND_RESTART ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-20 18:14:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( video_restart_dialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-19 18:58:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									progress_hb  =  memnew ( BackgroundProgress ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 20:16:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									layout_dialog  =  memnew ( EditorLayoutsDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( layout_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									layout_dialog - > set_hide_on_ok ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 20:16:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									layout_dialog - > set_size ( Size2 ( 225 ,  270 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									layout_dialog - > connect ( " name_confirmed " ,  callable_mp ( this ,  & EditorNode : : _dialog_action ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									update_spinner  =  memnew ( MenuButton ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									right_menu_hb - > add_child ( update_spinner ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-09 15:21:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									update_spinner - > set_button_icon ( theme - > get_icon ( SNAME ( " Progress1 " ) ,  EditorStringName ( EditorIcons ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									update_spinner - > get_popup ( ) - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PopupMenu  * p  =  update_spinner - > get_popup ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p - > add_radio_check_item ( TTR ( " Update Continuously " ) ,  SETTINGS_UPDATE_CONTINUOUSLY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p - > add_radio_check_item ( TTR ( " Update When Changed " ) ,  SETTINGS_UPDATE_WHEN_CHANGED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p - > add_item ( TTR ( " Hide Update Spinner " ) ,  SETTINGS_UPDATE_SPINNER_HIDE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_update_spinner ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Instantiate and place editor docks.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-27 10:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memnew ( SceneTreeDock ( scene_root ,  editor_selection ,  editor_data ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memnew ( InspectorDock ( editor_data ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memnew ( ImportDock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memnew ( NodeDock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-27 10:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									FileSystemDock  * filesystem_dock  =  memnew ( FileSystemDock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									filesystem_dock - > connect ( " inherit " ,  callable_mp ( this ,  & EditorNode : : _inherit_request ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-16 00:13:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									filesystem_dock - > connect ( " instantiate " ,  callable_mp ( this ,  & EditorNode : : _instantiate_request ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 04:17:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									filesystem_dock - > connect ( " display_mode_changed " ,  callable_mp ( this ,  & EditorNode : : _save_editor_layout ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 18:52:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									get_project_settings ( ) - > connect_filesystem_dock_signals ( filesystem_dock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-01 00:49:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-06 20:53:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									history_dock  =  memnew ( HistoryDock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-27 13:52:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Scene: Top left.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > add_dock ( SceneTreeDock : : get_singleton ( ) ,  TTR ( " Scene " ) ,  EditorDockManager : : DOCK_SLOT_LEFT_UR ,  nullptr ,  " PackedScene " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 16:56:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Import: Top left, behind Scene.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > add_dock ( ImportDock : : get_singleton ( ) ,  TTR ( " Import " ) ,  EditorDockManager : : DOCK_SLOT_LEFT_UR ,  nullptr ,  " FileAccess " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 16:56:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// FileSystem: Bottom left.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > add_dock ( FileSystemDock : : get_singleton ( ) ,  TTR ( " FileSystem " ) ,  EditorDockManager : : DOCK_SLOT_LEFT_BR ,  ED_SHORTCUT_AND_COMMAND ( " bottom_panels/toggle_filesystem_bottom_panel " ,  TTRC ( " Toggle FileSystem Bottom Panel " ) ,  KeyModifierMask : : ALT  |  Key : : F ) ,  " Folder " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 09:45:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Inspector: Full height right.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > add_dock ( InspectorDock : : get_singleton ( ) ,  TTR ( " Inspector " ) ,  EditorDockManager : : DOCK_SLOT_RIGHT_UL ,  nullptr ,  " AnimationTrackList " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-24 17:39:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Node: Full height right, behind Inspector.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > add_dock ( NodeDock : : get_singleton ( ) ,  TTR ( " Node " ) ,  EditorDockManager : : DOCK_SLOT_RIGHT_UL ,  nullptr ,  " Object " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-03 21:03:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-27 13:52:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// History: Full height right, behind Node.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-20 12:43:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_dock_manager - > add_dock ( history_dock ,  TTR ( " History " ) ,  EditorDockManager : : DOCK_SLOT_RIGHT_UL ,  nullptr ,  " History " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-13 11:20:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Add some offsets to left_r and main hsplits to make LEFT_R and RIGHT_L docks wider than minsize.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-18 16:49:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_r_hsplit - > set_split_offset ( 270  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									main_hsplit - > set_split_offset ( - 270  *  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 17:07:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Define corresponding default layout.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  String  docks_section  =  " docks " ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_layout . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Dock numbers are based on DockSlot enum value + 1.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 17:07:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_3 " ,  " Scene,Import " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_4 " ,  " FileSystem " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 18:30:20 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_5 " ,  " Inspector,Node,History " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// There are 4 vsplits and 4 hsplits.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  editor_dock_manager - > get_vsplit_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										default_layout - > set_value ( docks_section ,  " dock_split_ "  +  itos ( i  +  1 ) ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 17:07:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_hsplit_1 " ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 22:00:36 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_hsplit_2 " ,  270 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_hsplit_3 " ,  - 270 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 17:07:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_layout - > set_value ( docks_section ,  " dock_hsplit_4 " ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-11-22 19:11:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_layouts_menu ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Bottom panels.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-14 16:56:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:22:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bottom_panel  =  memnew ( EditorBottomPanel ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-17 20:03:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split - > add_child ( bottom_panel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									center_split - > set_dragger_visibility ( SplitContainer : : DRAGGER_HIDDEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-18 04:47:41 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									log  =  memnew ( EditorLog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Button  * output_button  =  bottom_panel - > add_item ( TTR ( " Output " ) ,  log ,  ED_SHORTCUT_AND_COMMAND ( " bottom_panels/toggle_output_bottom_panel " ,  TTRC ( " Toggle Output Bottom Panel " ) ,  KeyModifierMask : : ALT  |  Key : : O ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-11 14:20:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									log - > set_tool_button ( output_button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 16:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									center_split - > connect ( SceneStringName ( resized ) ,  callable_mp ( this ,  & EditorNode : : _vp_resized ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-05 20:01:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									native_shader_source_visualizer  =  memnew ( EditorNativeShaderSourceVisualizer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( native_shader_source_visualizer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									orphan_resources  =  memnew ( OrphanResourcesDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-11-29 01:08:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( orphan_resources ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-20 14:44:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									surface_upgrade_dialog  =  memnew ( SurfaceUpgradeDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( surface_upgrade_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									confirmation  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( confirmation ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									confirmation - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_confirm_current ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_confirmation  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-08 18:02:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_confirmation - > add_button ( TTR ( " Don't Save " ) ,  DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) ,  " discard " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( save_confirmation ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-10 17:04:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_confirmation - > set_min_size ( Vector2 ( 450.0  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_confirmation - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_confirm_current ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_confirmation - > connect ( " custom_action " ,  callable_mp ( this ,  & EditorNode : : _discard_changes ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 19:22:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									save_confirmation - > connect ( " canceled " ,  callable_mp ( this ,  & EditorNode : : _cancel_close_scene_tab ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-21 11:15:39 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-01 15:17:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gradle_build_manage_templates  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gradle_build_manage_templates - > set_text ( TTR ( " Android build template is missing, please install relevant templates. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gradle_build_manage_templates - > set_ok_button_text ( TTR ( " Manage Templates " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 09:40:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gradle_build_manage_templates - > add_button ( TTR ( " Install from file " ) ) - > connect ( SceneStringName ( pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) . bind ( SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gradle_build_manage_templates - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) . bind ( SETTINGS_MANAGE_EXPORT_TEMPLATES ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-01 15:17:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( gradle_build_manage_templates ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 10:12:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_android_build_source  =  memnew ( EditorFileDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 12:20:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_android_build_source - > set_title ( TTR ( " Select Android sources file " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 10:12:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_android_build_source - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_android_build_source - > set_file_mode ( EditorFileDialog : : FILE_MODE_OPEN_FILE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_android_build_source - > add_filter ( " *.zip " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_android_build_source - > connect ( " file_selected " ,  callable_mp ( this ,  & EditorNode : : _android_build_source_selected ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( file_android_build_source ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										VBoxContainer  * vbox  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										install_android_build_template_message  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										install_android_build_template_message - > set_autowrap_mode ( TextServer : : AUTOWRAP_WORD_SMART ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										install_android_build_template_message - > set_custom_minimum_size ( Size2 ( 300  *  EDSCALE ,  1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vbox - > add_child ( install_android_build_template_message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										choose_android_export_profile  =  memnew ( OptionButton ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:21:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										choose_android_export_profile - > connect ( SceneStringName ( item_selected ) ,  callable_mp ( this ,  & EditorNode : : _android_export_preset_selected ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vbox - > add_child ( choose_android_export_profile ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										install_android_build_template  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										install_android_build_template - > set_ok_button_text ( TTR ( " Install " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										install_android_build_template - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_confirm_current ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-13 14:20:23 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										install_android_build_template - > add_child ( vbox ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										install_android_build_template - > set_min_size ( Vector2 ( 500.0  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										gui_base - > add_child ( install_android_build_template ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									remove_android_build_template  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									remove_android_build_template - > set_ok_button_text ( TTR ( " Show in File Manager " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									remove_android_build_template - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) . bind ( FILE_EXPLORE_ANDROID_BUILD_TEMPLATES ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( remove_android_build_template ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-10 16:45:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_templates  =  memnew ( EditorFileDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-19 00:08:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_templates - > set_title ( TTR ( " Import Templates From ZIP File " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( file_templates ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_templates - > set_file_mode ( EditorFileDialog : : FILE_MODE_OPEN_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-10 16:45:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_templates - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									file_templates - > clear_filters ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-04 16:26:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_templates - > add_filter ( " *.tpz " ,  TTR ( " Template Package " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file  =  memnew ( EditorFileDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file - > set_current_dir ( " res:// " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-22 17:50:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file - > set_transient_to_focused ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-10 16:45:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_export_lib  =  memnew ( EditorFileDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_export_lib - > set_title ( TTR ( " Export Library " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_export_lib - > set_file_mode ( EditorFileDialog : : FILE_MODE_SAVE_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_export_lib - > connect ( " file_selected " ,  callable_mp ( this ,  & EditorNode : : _dialog_action ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 10:42:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_export_lib - > add_option ( TTR ( " Merge With Existing " ) ,  Vector < String > ( ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_export_lib - > add_option ( TTR ( " Apply MeshInstance Transforms " ) ,  Vector < String > ( ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( file_export_lib ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-10 16:45:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_script  =  memnew ( EditorFileDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_script - > set_title ( TTR ( " Open & Run a Script " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-10 16:45:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_script - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 14:00:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_script - > set_file_mode ( EditorFileDialog : : FILE_MODE_OPEN_FILE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 23:01:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < String >  sexts ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceLoader : : get_recognized_extensions_for_type ( " Script " ,  & sexts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  sexts )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file_script - > add_filter ( " *. "  +  E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 23:01:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( file_script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_script - > connect ( " file_selected " ,  callable_mp ( this ,  & EditorNode : : _dialog_action ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-20 23:01:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-12 09:37:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > connect ( " about_to_popup " ,  callable_mp ( this ,  & EditorNode : : _update_file_menu_opened ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file_menu - > connect ( " popup_hide " ,  callable_mp ( this ,  & EditorNode : : _update_file_menu_closed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:13:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									settings_menu - > connect ( SceneStringName ( id_pressed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									file - > connect ( " file_selected " ,  callable_mp ( this ,  & EditorNode : : _dialog_action ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_templates - > connect ( " file_selected " ,  callable_mp ( this ,  & EditorNode : : _dialog_action ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-17 20:03:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									audio_preview_gen  =  memnew ( AudioStreamPreviewGenerator ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( audio_preview_gen ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-27 10:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( DebuggerEditorPlugin ( debug_menu ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									disk_changed  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 22:42:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										disk_changed - > set_title ( TTR ( " Files have been modified outside Godot " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-14 07:29:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										VBoxContainer  * vbc  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										disk_changed - > add_child ( vbc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Label  * dl  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 22:42:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dl - > set_text ( TTR ( " The following files are newer on disk: " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vbc - > add_child ( dl ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										disk_changed_list  =  memnew ( Tree ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vbc - > add_child ( disk_changed_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										disk_changed_list - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 22:42:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Label  * what_action_label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										what_action_label - > set_text ( TTR ( " What action should be taken? " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vbc - > add_child ( what_action_label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										disk_changed - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _reload_modified_scenes ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										disk_changed - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _reload_project_settings ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 22:42:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										disk_changed - > set_ok_button_text ( TTR ( " Reload from disk " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 22:42:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										disk_changed - > add_button ( TTR ( " Ignore external changes " ) ,  ! DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) ,  " resave " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 19:42:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										disk_changed - > connect ( " custom_action " ,  callable_mp ( this ,  & EditorNode : : _resave_scenes ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( disk_changed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-27 10:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( AnimationPlayerEditorPlugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-08 21:38:01 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( AnimationTrackKeyEditEditorPlugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-31 15:57:34 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( AnimationMarkerKeyEditEditorPlugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-27 10:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( CanvasItemEditorPlugin ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( Node3DEditorPlugin ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( ScriptEditorPlugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:07:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( GameViewPlugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 19:00:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-25 14:30:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorAudioBuses  * audio_bus_editor  =  EditorAudioBuses : : register_editor ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-21 19:00:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ScriptTextEditor : : register_editor ( ) ;  // Register one for text scripts.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TextEditor : : register_editor ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-29 19:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( AssetLibraryEditorPlugin : : is_available ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-27 10:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										add_editor_plugin ( memnew ( AssetLibraryEditorPlugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-09 22:47:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-08 15:25:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										print_verbose ( " Asset Library not available (due to using Web editor, or SSL support disabled). " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-09 22:47:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 10:32:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-30 20:12:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// More visually meaningful to have this later.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-30 17:22:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bottom_panel - > move_item_to_end ( AnimationPlayerEditor : : get_singleton ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-17 20:03:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-03 20:12:08 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( VersionControlEditorPlugin : : get_singleton ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 20:59:34 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vcs_actions_menu  =  VersionControlEditorPlugin : : get_singleton ( ) - > get_version_control_actions_panel ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vcs_actions_menu - > connect ( " index_pressed " ,  callable_mp ( this ,  & EditorNode : : _version_control_menu_option ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 12:31:15 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vcs_actions_menu - > add_item ( TTR ( " Create/Override Version Control Metadata... " ) ,  RUN_VCS_METADATA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-09 08:25:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vcs_actions_menu - > add_item ( TTR ( " Version Control Settings... " ) ,  RUN_VCS_SETTINGS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 17:33:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									project_menu - > set_item_submenu_node ( project_menu - > get_item_index ( VCS_MENU ) ,  vcs_actions_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 20:59:34 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-16 13:22:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_editor_plugin ( memnew ( AudioBusesEditorPlugin ( audio_bus_editor ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 17:46:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  EditorPlugins : : get_plugin_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 07:11:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										add_editor_plugin ( EditorPlugins : : create ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 16:46:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  StringName  & extension_class_name  :  GDExtensionEditorPlugins : : get_extension_classes ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										add_extension_editor_plugin ( extension_class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDExtensionEditorPlugins : : editor_node_add_plugin  =  & EditorNode : : add_extension_editor_plugin ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDExtensionEditorPlugins : : editor_node_remove_plugin  =  & EditorNode : : remove_extension_editor_plugin ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugin_init_callback_count ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugin_init_callbacks [ i ] ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-31 01:59:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-09 00:23:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorTexturePreviewPlugin > ( memnew ( EditorTexturePreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 22:03:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorImagePreviewPlugin > ( memnew ( EditorImagePreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-09 00:23:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorPackedScenePreviewPlugin > ( memnew ( EditorPackedScenePreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorMaterialPreviewPlugin > ( memnew ( EditorMaterialPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorScriptPreviewPlugin > ( memnew ( EditorScriptPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-07 12:46:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorAudioStreamPreviewPlugin > ( memnew ( EditorAudioStreamPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-09 00:23:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorMeshPreviewPlugin > ( memnew ( EditorMeshPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorBitmapPreviewPlugin > ( memnew ( EditorBitmapPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-15 22:00:56 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorFontPreviewPlugin > ( memnew ( EditorFontPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-21 00:08:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									resource_preview - > add_preview_generator ( Ref < EditorGradientPreviewPlugin > ( memnew ( EditorGradientPreviewPlugin ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 09:20:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-15 01:01:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < StandardMaterial3DConversionPlugin >  spatial_mat_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spatial_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 09:20:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( spatial_mat_convert ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-12 20:12:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-29 17:49:12 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ORMMaterial3DConversionPlugin >  orm_mat_convert ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										orm_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( orm_mat_convert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-14 15:44:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < CanvasItemMaterialConversionPlugin >  canvas_item_mat_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										canvas_item_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-14 15:44:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( canvas_item_mat_convert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-18 11:09:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ParticleProcessMaterialConversionPlugin >  particles_mat_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										particles_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-12 20:12:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( particles_mat_convert ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-28 14:51:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 17:32:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < ProceduralSkyMaterialConversionPlugin >  procedural_sky_mat_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										procedural_sky_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 17:32:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( procedural_sky_mat_convert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < PanoramaSkyMaterialConversionPlugin >  panorama_sky_mat_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										panorama_sky_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 17:32:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( panorama_sky_mat_convert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < PhysicalSkyMaterialConversionPlugin >  physical_sky_mat_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										physical_sky_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 17:32:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( physical_sky_mat_convert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 04:28:55 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < FogMaterialConversionPlugin >  fog_mat_convert ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										fog_mat_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( fog_mat_convert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-28 14:51:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualShaderConversionPlugin >  vshader_convert ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vshader_convert . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-28 14:51:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										resource_conversion_plugins . push_back ( vshader_convert ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 09:20:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 14:18:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-11 16:52:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									update_spinner_step_msec  =  OS : : get_singleton ( ) - > get_ticks_msec ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									update_spinner_step_frame  =  Engine : : get_singleton ( ) - > get_frames_drawn ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_plugins_over  =  memnew ( EditorPluginList ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-29 20:32:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_plugins_force_over  =  memnew ( EditorPluginList ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-08 19:57:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_plugins_force_input_forwarding  =  memnew ( EditorPluginList ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-10 09:48:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < GDExtensionExportPlugin >  gdextension_export_plugin ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gdextension_export_plugin . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorExport : : get_singleton ( ) - > add_export_plugin ( gdextension_export_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-20 15:49:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < DedicatedServerExportPlugin >  dedicated_server_export_plugin ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dedicated_server_export_plugin . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorExport : : get_singleton ( ) - > add_export_plugin ( dedicated_server_export_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-23 13:48:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < PackedSceneEditorTranslationParserPlugin >  packed_scene_translation_parser_plugin ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									packed_scene_translation_parser_plugin . instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-23 13:48:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorTranslationParser : : get_singleton ( ) - > add_parser ( packed_scene_translation_parser_plugin ,  EditorTranslationParser : : STANDARD ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									_edit_current ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-18 15:17:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									saving_resource  =  Ref < Resource > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_process ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									open_imported  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									open_imported - > set_ok_button_text ( TTR ( " Open Anyway " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-08 18:02:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									new_inherited_button  =  open_imported - > add_button ( TTR ( " New Inherited " ) ,  ! DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) ,  " inherit " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									open_imported - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _open_imported ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									open_imported - > connect ( " custom_action " ,  callable_mp ( this ,  & EditorNode : : _inherit_imported ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 20:31:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( open_imported ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-02 21:33:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									quick_open_dialog  =  memnew ( EditorQuickOpenDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( quick_open_dialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 10:45:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									quick_open_color_palette  =  memnew ( EditorQuickOpenDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gui_base - > add_child ( quick_open_color_palette ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									_update_recent_scenes ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-11 15:59:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_process_shortcut_input ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_errors  =  memnew ( RichTextLabel ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_error_dialog  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									load_error_dialog - > set_unparent_when_invisible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									load_error_dialog - > add_child ( load_errors ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-03 22:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_error_dialog - > set_title ( TTR ( " Load Errors " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-14 15:11:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									load_error_dialog - > connect ( SceneStringName ( visibility_changed ) ,  callable_mp ( this ,  & EditorNode : : _load_error_dialog_visibility_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_outputs  =  memnew ( RichTextLabel ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-04 14:38:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_outputs - > set_selection_enabled ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-28 16:19:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_outputs - > set_context_menu_enabled ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-20 15:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_output_dialog  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									execute_output_dialog - > set_unparent_when_invisible ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_output_dialog - > add_child ( execute_outputs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-16 21:57:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									execute_output_dialog - > set_title ( " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-07 15:46:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileSystem : : get_singleton ( ) - > connect ( " sources_changed " ,  callable_mp ( this ,  & EditorNode : : _sources_changed ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileSystem : : get_singleton ( ) - > connect ( " filesystem_changed " ,  callable_mp ( this ,  & EditorNode : : _fs_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-08 14:28:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileSystem : : get_singleton ( ) - > connect ( " resources_reimporting " ,  callable_mp ( this ,  & EditorNode : : _resources_reimporting ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorFileSystem : : get_singleton ( ) - > connect ( " resources_reimported " ,  callable_mp ( this ,  & EditorNode : : _resources_reimported ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileSystem : : get_singleton ( ) - > connect ( " resources_reload " ,  callable_mp ( this ,  & EditorNode : : _resources_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-25 23:04:16 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_build_icon_type_cache ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pick_main_scene  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 19:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gui_base - > add_child ( pick_main_scene ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-07 19:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pick_main_scene - > set_ok_button_text ( TTR ( " Select " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-14 14:28:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pick_main_scene - > connect ( SceneStringName ( confirmed ) ,  callable_mp ( this ,  & EditorNode : : _menu_option ) . bind ( SETTINGS_PICK_MAIN_SCENE ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-07 00:10:07 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_current_scene_button  =  pick_main_scene - > add_button ( TTR ( " Select Current " ) ,  true ,  " select_current " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pick_main_scene - > connect ( " custom_action " ,  callable_mp ( this ,  & EditorNode : : _pick_main_scene_custom_action ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-13 22:12:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  _init_callbacks . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-25 09:31:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_init_callbacks [ i ] ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editor_data . add_edited_scene ( - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_data . set_edited_scene ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:24:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scene_tabs - > update_scene_tabs ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 21:08:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ImportDock : : get_singleton ( ) - > initialize_import_options ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-23 21:44:42 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-13 10:10:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									FileAccess : : set_file_close_fail_notify_callback ( _file_access_close_error_notify ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-22 00:03:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-14 20:02:31 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									print_handler . printfunc  =  _print_handler ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									print_handler . userdata  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_print_handler ( & print_handler ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 16:36:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceSaver : : set_save_callback ( _resource_saved ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ResourceLoader : : set_load_callback ( _resource_loaded ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-25 15:04:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Use the Ctrl modifier so F2 can be used to rename nodes in the scene tree dock.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_2d " ,  TTRC ( " Open 2D Editor " ) ,  KeyModifierMask : : CTRL  |  Key : : F1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_3d " ,  TTRC ( " Open 3D Editor " ) ,  KeyModifierMask : : CTRL  |  Key : : F2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_script " ,  TTRC ( " Open Script Editor " ) ,  KeyModifierMask : : CTRL  |  Key : : F3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_game " ,  TTRC ( " Open Game View " ) ,  KeyModifierMask : : CTRL  |  Key : : F4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_assetlib " ,  TTRC ( " Open Asset Library " ) ,  KeyModifierMask : : CTRL  |  Key : : F5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-13 16:31:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-16 11:28:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_2d " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : CTRL  |  Key : : KEY_1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_3d " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : CTRL  |  Key : : KEY_2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_script " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : CTRL  |  Key : : KEY_3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:07:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_game " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : CTRL  |  Key : : KEY_4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_OVERRIDE ( " editor/editor_assetlib " ,  " macos " ,  KeyModifierMask : : META  |  KeyModifierMask : : CTRL  |  Key : : KEY_5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-08 13:52:00 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-18 19:07:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_next " ,  TTRC ( " Open the next Editor " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT_AND_COMMAND ( " editor/editor_prev " ,  TTRC ( " Open the previous Editor " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-24 15:40:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Apply setting presets in case the editor_settings file is missing values.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorSettingsDialog : : update_navigation_preset ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									screenshot_timer  =  memnew ( Timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									screenshot_timer - > set_one_shot ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									screenshot_timer - > set_wait_time ( settings_menu - > get_submenu_popup_delay ( )  +  0.1f ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 18:28:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									screenshot_timer - > connect ( " timeout " ,  callable_mp ( this ,  & EditorNode : : _request_screenshot ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-29 06:53:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( screenshot_timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									screenshot_timer - > set_owner ( get_owner ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-12 13:59:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Adjust spacers to center 2D / 3D / Script buttons.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  max_w  =  MAX ( project_run_bar - > get_minimum_size ( ) . x  +  right_menu_hb - > get_minimum_size ( ) . x ,  main_menu - > get_minimum_size ( ) . x ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									left_spacer - > set_custom_minimum_size ( Size2 ( MAX ( 0 ,  max_w  -  main_menu - > get_minimum_size ( ) . x ) ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									right_spacer - > set_custom_minimum_size ( Size2 ( MAX ( 0 ,  max_w  -  project_run_bar - > get_minimum_size ( ) . x  -  right_menu_hb - > get_minimum_size ( ) . x ) ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Extend menu bar to window title.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( can_expand )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-15 09:33:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										DisplayServer : : get_singleton ( ) - > process_events ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										DisplayServer : : get_singleton ( ) - > window_set_flag ( DisplayServer : : WINDOW_FLAG_EXTEND_TO_TITLE ,  true ,  DisplayServer : : MAIN_WINDOW_ID ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 21:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										title_bar - > set_can_move_window ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-23 13:40:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-01 12:28:16 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 15:57:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  String  exec  =  OS : : get_singleton ( ) - > get_executable_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  String  old_exec  =  EditorSettings : : get_singleton ( ) - > get_project_metadata ( " editor_metadata " ,  " executable_path " ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Save editor executable path for third-party tools.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( exec  ! =  old_exec )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EditorSettings : : get_singleton ( ) - > set_project_metadata ( " editor_metadata " ,  " executable_path " ,  exec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-14 15:13:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									follow_system_theme  =  EDITOR_GET ( " interface/theme/follow_system_theme " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									use_system_accent_color  =  EDITOR_GET ( " interface/theme/use_system_accent_color " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									system_theme_timer  =  memnew ( Timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									system_theme_timer - > set_wait_time ( 1.0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									system_theme_timer - > connect ( " timeout " ,  callable_mp ( this ,  & EditorNode : : _check_system_theme_changed ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( system_theme_timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									system_theme_timer - > set_owner ( get_owner ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									system_theme_timer - > set_autostart ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EditorNode : : ~ EditorNode ( )  {  
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorInspector : : cleanup_plugins ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-27 16:58:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorTranslationParser : : get_singleton ( ) - > clean_parsers ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 16:07:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ResourceImporterScene : : clean_up_importer_plugins ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-03 23:07:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorContextMenuPluginManager : : cleanup ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-14 20:02:31 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									remove_print_handler ( & print_handler ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-25 14:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorHelp : : cleanup_doc ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-08 22:16:55 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if defined(MODULE_GDSCRIPT_ENABLED) || defined(MODULE_MONO_ENABLED) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorHelpHighlighter : : free_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									memdelete ( editor_selection ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( editor_plugins_over ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-29 20:32:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( editor_plugins_force_over ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-08 19:57:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( editor_plugins_force_input_forwarding ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 12:51:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( progress_hb ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-19 13:31:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( surface_upgrade_tool ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-27 15:55:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( editor_dock_manager ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 11:30:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									EditorSettings : : destroy ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 13:14:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorThemeManager : : finalize ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-14 17:48:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDExtensionEditorPlugins : : editor_node_add_plugin  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDExtensionEditorPlugins : : editor_node_remove_plugin  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-02 11:43:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-01 13:01:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									FileDialog : : get_icon_func  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FileDialog : : register_func  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FileDialog : : unregister_func  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileDialog : : get_icon_func  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileDialog : : register_func  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EditorFileDialog : : unregister_func  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									file_dialogs . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editor_file_dialogs . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-02 11:43:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  EDITOR  PLUGIN  LIST 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorPluginList : : make_visible ( bool  p_visible )  {  
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										plugins_list [ i ] - > make_visible ( p_visible ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : edit ( Object  * p_object )  {  
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										plugins_list [ i ] - > edit ( p_object ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-10-15 22:33:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorPluginList : : forward_gui_input ( const  Ref < InputEvent >  & p_event )  {  
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  discard  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-15 22:33:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( plugins_list [ i ] - > forward_canvas_gui_input ( p_event ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											discard  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  discard ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 18:38:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EditorPlugin : : AfterGUIInput  EditorPluginList : : forward_3d_gui_input ( Camera3D  * p_camera ,  const  Ref < InputEvent >  & p_event ,  bool  serve_when_force_input_enabled )  {  
						 
					
						
							
								
									
										
										
										
											2021-02-04 17:20:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorPlugin : : AfterGUIInput  after  =  EditorPlugin : : AFTER_GUI_INPUT_PASS ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-08 19:57:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( ! serve_when_force_input_enabled )  & &  plugins_list [ i ] - > is_input_event_forwarding_always_enabled ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 18:38:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorPlugin : : AfterGUIInput  current_after  =  plugins_list [ i ] - > forward_3d_gui_input ( p_camera ,  p_event ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 17:20:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( current_after  = =  EditorPlugin : : AFTER_GUI_INPUT_STOP )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											after  =  EditorPlugin : : AFTER_GUI_INPUT_STOP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-16 03:04:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( after  ! =  EditorPlugin : : AFTER_GUI_INPUT_STOP  & &  current_after  = =  EditorPlugin : : AFTER_GUI_INPUT_CUSTOM )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											after  =  EditorPlugin : : AFTER_GUI_INPUT_CUSTOM ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-04 17:20:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  after ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : forward_canvas_draw_over_viewport ( Control  * p_overlay )  {  
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins_list [ i ] - > forward_canvas_draw_over_viewport ( p_overlay ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-29 20:32:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : forward_canvas_force_draw_over_viewport ( Control  * p_overlay )  {  
						 
					
						
							
								
									
										
										
										
											2017-10-29 20:32:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins_list [ i ] - > forward_canvas_force_draw_over_viewport ( p_overlay ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 18:38:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : forward_3d_draw_over_viewport ( Control  * p_overlay )  {  
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 18:38:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins_list [ i ] - > forward_3d_draw_over_viewport ( p_overlay ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 18:38:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : forward_3d_force_draw_over_viewport ( Control  * p_overlay )  {  
						 
					
						
							
								
									
										
										
										
											2018-09-18 20:00:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  plugins_list . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 18:38:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										plugins_list [ i ] - > forward_3d_force_draw_over_viewport ( p_overlay ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-10 16:44:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-08 19:57:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : add_plugin ( EditorPlugin  * p_plugin )  {  
						 
					
						
							
								
									
										
										
										
											2023-02-17 17:55:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( plugins_list . has ( p_plugin ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-08 19:57:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									plugins_list . push_back ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-02-25 16:49:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  EditorPluginList : : remove_plugin ( EditorPlugin  * p_plugin )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									plugins_list . erase ( p_plugin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  EditorPluginList : : is_empty ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  plugins_list . is_empty ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 20:02:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  EditorPluginList : : clear ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									plugins_list . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EditorPluginList : : EditorPluginList ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EditorPluginList : : ~ EditorPluginList ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}