2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* editor_node.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
2017-01-01 22:01:57 +01:00
/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
2014-02-10 02:10:30 +01:00
/* */
/* 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. */
/*************************************************************************/
# include "version.h"
# include "editor_node.h"
# include "print_string.h"
2016-06-18 07:32:03 +02:00
# include "editor_themes.h"
2014-02-10 02:10:30 +01:00
# include "editor_help.h"
# include "core/io/resource_saver.h"
# include "core/io/resource_loader.h"
# include "servers/physics_2d_server.h"
# include "scene/resources/packed_scene.h"
# include "editor_settings.h"
# include "io_plugins/editor_import_collada.h"
2014-08-02 03:10:38 +02:00
# include "io_plugins/editor_scene_importer_fbxconv.h"
2014-02-10 02:10:30 +01:00
# include "globals.h"
# include <stdio.h>
# include "object_type_db.h"
# include "os/keyboard.h"
# include "os/os.h"
# include "os/file_access.h"
# include "message_queue.h"
# include "path_remap.h"
# include "translation.h"
# include "pvrtc_compress.h"
# include "editor_file_system.h"
# include "register_exporters.h"
# include "bind/core_bind.h"
# include "io/zip_io.h"
2015-06-14 03:12:53 +02:00
# include "io/config_file.h"
2016-01-18 00:03:57 +01:00
# include "animation_editor.h"
2016-06-10 03:47:43 +02:00
# include "io/stream_peer_ssl.h"
2014-02-10 02:10:30 +01:00
// plugins
# include "plugins/sprite_frames_editor_plugin.h"
2016-06-03 22:04:44 +02:00
# include "plugins/texture_region_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "plugins/canvas_item_editor_plugin.h"
2016-06-07 20:29:15 +02:00
# include "asset_library_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "plugins/spatial_editor_plugin.h"
# include "plugins/sample_editor_plugin.h"
2016-05-23 22:10:26 +02:00
# include "plugins/texture_editor_plugin.h"
# include "plugins/material_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "plugins/sample_library_editor_plugin.h"
# include "plugins/sample_player_editor_plugin.h"
# include "plugins/camera_editor_plugin.h"
# include "plugins/style_box_editor_plugin.h"
# include "plugins/resource_preloader_editor_plugin.h"
# include "plugins/item_list_editor_plugin.h"
# include "plugins/stream_editor_plugin.h"
# include "plugins/multimesh_editor_plugin.h"
2016-05-23 22:10:26 +02:00
# include "plugins/mesh_instance_editor_plugin.h"
2014-10-12 07:13:22 +02:00
# include "plugins/mesh_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "plugins/theme_editor_plugin.h"
# include "plugins/tile_map_editor_plugin.h"
# include "plugins/cube_grid_theme_editor_plugin.h"
# include "plugins/shader_editor_plugin.h"
2015-01-03 20:52:37 +01:00
# include "plugins/shader_graph_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "plugins/path_editor_plugin.h"
# include "plugins/rich_text_editor_plugin.h"
# include "plugins/collision_polygon_editor_plugin.h"
2014-09-17 02:19:54 +02:00
# include "plugins/collision_polygon_2d_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "plugins/script_editor_plugin.h"
# include "plugins/path_2d_editor_plugin.h"
# include "plugins/particles_editor_plugin.h"
# include "plugins/particles_2d_editor_plugin.h"
# include "plugins/animation_tree_editor_plugin.h"
# include "plugins/tile_set_editor_plugin.h"
# include "plugins/animation_player_editor_plugin.h"
2014-05-14 06:22:15 +02:00
# include "plugins/baked_light_editor_plugin.h"
2014-07-07 22:44:21 +02:00
# include "plugins/polygon_2d_editor_plugin.h"
2015-02-14 16:09:52 +01:00
# include "plugins/navigation_polygon_editor_plugin.h"
2015-03-02 04:54:10 +01:00
# include "plugins/light_occluder_2d_editor_plugin.h"
2015-05-24 20:18:52 +02:00
# include "plugins/color_ramp_editor_plugin.h"
2015-06-23 17:20:34 +02:00
# include "plugins/collision_shape_2d_editor_plugin.h"
2015-09-24 23:06:15 +02:00
# include "main/input_default.h"
2014-02-10 02:10:30 +01:00
// end
# include "tools/editor/io_plugins/editor_texture_import_plugin.h"
# include "tools/editor/io_plugins/editor_scene_import_plugin.h"
# include "tools/editor/io_plugins/editor_font_import_plugin.h"
# include "tools/editor/io_plugins/editor_sample_import_plugin.h"
# include "tools/editor/io_plugins/editor_translation_import_plugin.h"
2016-06-05 20:11:57 +02:00
# include "tools/editor/io_plugins/editor_bitmask_import_plugin.h"
2014-05-14 06:22:15 +02:00
# include "tools/editor/io_plugins/editor_mesh_import_plugin.h"
2015-12-04 14:18:28 +01:00
# include "tools/editor/io_plugins/editor_export_scene.h"
2014-05-14 06:22:15 +02:00
2015-05-31 06:59:42 +02:00
# include "plugins/editor_preview_plugins.h"
2016-03-12 14:44:12 +01:00
# include "editor_initialize_ssl.h"
2015-08-02 17:29:37 +02:00
# include "script_editor_debugger.h"
2014-02-18 05:21:06 +01:00
2014-02-10 02:10:30 +01:00
EditorNode * EditorNode : : singleton = NULL ;
2015-06-22 05:03:19 +02:00
void EditorNode : : _update_scene_tabs ( ) {
2015-11-18 08:47:41 +01:00
bool show_rb = EditorSettings : : get_singleton ( ) - > get ( " global/show_script_in_scene_tabs " ) ;
2015-06-22 05:03:19 +02:00
scene_tabs - > clear_tabs ( ) ;
2015-07-26 15:44:10 +02:00
Ref < Texture > script_icon = gui_base - > get_icon ( " Script " , " EditorIcons " ) ;
2015-06-22 05:03:19 +02:00
for ( int i = 0 ; i < editor_data . get_edited_scene_count ( ) ; i + + ) {
2015-07-24 19:18:02 +02:00
String type = editor_data . get_scene_type ( i ) ;
Ref < Texture > icon ;
if ( type ! = String ( ) ) {
if ( ! gui_base - > has_icon ( type , " EditorIcons " ) ) {
type = " Node " ;
}
icon = gui_base - > get_icon ( type , " EditorIcons " ) ;
}
2015-07-26 15:44:10 +02:00
2015-06-22 05:03:19 +02:00
int current = editor_data . get_edited_scene ( ) ;
bool unsaved = ( i = = current ) ? saved_version ! = editor_data . get_undo_redo ( ) . get_version ( ) : editor_data . get_scene_version ( i ) ! = 0 ;
2015-07-24 19:18:02 +02:00
scene_tabs - > add_tab ( editor_data . get_scene_title ( i ) + ( unsaved ? " (*) " : " " ) , icon ) ;
2015-11-18 08:47:41 +01:00
if ( show_rb & & editor_data . get_scene_root_script ( i ) . is_valid ( ) ) {
2015-07-26 15:44:10 +02:00
scene_tabs - > set_tab_right_button ( i , script_icon ) ;
}
2015-06-22 05:03:19 +02:00
}
scene_tabs - > set_current_tab ( editor_data . get_edited_scene ( ) ) ;
2016-01-13 11:39:31 +01:00
scene_tabs - > ensure_tab_visible ( editor_data . get_edited_scene ( ) ) ;
2015-06-22 05:03:19 +02:00
}
2014-02-10 02:10:30 +01:00
void EditorNode : : _update_title ( ) {
2014-04-10 04:50:30 +02:00
String appname = Globals : : get_singleton ( ) - > get ( " application/name " ) ;
String title = appname . empty ( ) ? String ( VERSION_FULL_NAME ) : String ( _MKSTR ( VERSION_NAME ) + String ( " - " ) + appname ) ;
2015-06-22 05:03:19 +02:00
String edited = editor_data . get_edited_scene_root ( ) ? editor_data . get_edited_scene_root ( ) - > get_filename ( ) : String ( ) ;
2014-04-10 04:50:30 +02:00
if ( ! edited . empty ( ) )
title + = " - " + String ( edited . get_file ( ) ) ;
2014-02-10 02:10:30 +01:00
if ( unsaved_cache )
title + = " (*) " ;
OS : : get_singleton ( ) - > set_window_title ( title ) ;
}
void EditorNode : : _unhandled_input ( const InputEvent & p_event ) {
2016-06-28 01:14:59 +02:00
if ( Node : : get_viewport ( ) - > get_modal_stack_top ( ) )
return ; //ignore because of modal window
2016-01-21 23:51:06 +01:00
if ( p_event . type = = InputEvent : : KEY & & p_event . key . pressed & & ! p_event . key . echo & & ! gui_base - > get_viewport ( ) - > gui_has_modal_stack ( ) ) {
2014-02-10 02:10:30 +01:00
2016-06-15 18:25:17 +02:00
if ( ED_IS_SHORTCUT ( " editor/fullscreen_mode " , p_event ) ) {
if ( distraction_free_mode ) {
distraction_free_mode = false ;
_update_top_menu_visibility ( ) ;
} else {
set_docks_visible ( ! get_docks_visible ( ) ) ;
}
}
if ( ED_IS_SHORTCUT ( " editor/distraction_free_mode " , p_event ) ) {
set_distraction_free_mode ( ! get_distraction_free_mode ( ) ) ;
}
2016-06-25 06:42:09 +02:00
if ( ED_IS_SHORTCUT ( " editor/next_tab " , p_event ) ) {
int next_tab = editor_data . get_edited_scene ( ) + 1 ;
next_tab % = editor_data . get_edited_scene_count ( ) ;
_scene_tab_changed ( next_tab ) ;
}
if ( ED_IS_SHORTCUT ( " editor/prev_tab " , p_event ) ) {
int next_tab = editor_data . get_edited_scene ( ) - 1 ;
next_tab = next_tab > = 0 ? next_tab : editor_data . get_edited_scene_count ( ) - 1 ;
_scene_tab_changed ( next_tab ) ;
}
2017-01-21 13:07:29 +01:00
if ( ED_IS_SHORTCUT ( " editor/filter_files " , p_event ) ) {
filesystem_dock - > focus_on_filter ( ) ;
}
2016-06-15 18:25:17 +02:00
2014-02-10 02:10:30 +01:00
switch ( p_event . key . scancode ) {
2015-11-17 13:46:08 +01:00
/*case KEY_F1:
2014-05-06 11:38:00 +02:00
if ( ! p_event . key . mod . shift & & ! p_event . key . mod . command )
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_SCRIPT ) ;
2015-11-17 13:46:08 +01:00
break ; */
2015-11-25 00:07:32 +01:00
case KEY_F1 :
if ( ! p_event . key . mod . shift & & ! p_event . key . mod . command )
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_2D ) ;
2015-11-25 00:07:32 +01:00
break ;
case KEY_F2 :
if ( ! p_event . key . mod . shift & & ! p_event . key . mod . command )
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_3D ) ;
2015-11-25 00:07:32 +01:00
break ;
case KEY_F3 :
if ( ! p_event . key . mod . shift & & ! p_event . key . mod . command )
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_SCRIPT ) ;
2015-11-25 00:07:32 +01:00
break ;
2016-06-05 02:31:29 +02:00
/* case KEY_F5: _menu_option_confirm((p_event.key.mod.control&&p_event.key.mod.shift)?RUN_PLAY_CUSTOM_SCENE:RUN_PLAY,true); break;
2014-02-10 02:10:30 +01:00
case KEY_F6 : _menu_option_confirm ( RUN_PLAY_SCENE , true ) ; break ;
2016-05-22 02:18:16 +02:00
//case KEY_F7: _menu_option_confirm(RUN_PAUSE,true); break;
2016-06-05 02:31:29 +02:00
case KEY_F8 : _menu_option_confirm ( RUN_STOP , true ) ; break ; */
2016-06-25 06:42:09 +02:00
2014-02-10 02:10:30 +01:00
}
}
}
void EditorNode : : _notification ( int p_what ) {
2014-11-06 01:20:42 +01:00
if ( p_what = = NOTIFICATION_EXIT_TREE ) {
2015-04-21 00:38:02 +02:00
2014-02-10 02:10:30 +01:00
editor_data . save_editor_external_data ( ) ;
2016-06-13 15:10:50 +02:00
FileAccess : : set_file_close_fail_notify_callback ( NULL ) ;
2014-02-10 02:10:30 +01:00
log - > deinit ( ) ; // do not get messages anymore
}
if ( p_what = = NOTIFICATION_PROCESS ) {
2016-03-09 00:00:52 +01:00
//force the whole tree viewport
2014-02-10 02:10:30 +01:00
#if 0
{
Rect2 grect = scene_root_base - > get_global_rect ( ) ;
Rect2 grectsrp = scene_root_parent - > get_global_rect ( ) ;
if ( grect ! = grectsrp ) {
scene_root_parent - > set_pos ( grect . pos ) ;
scene_root_parent - > set_size ( grect . size ) ;
}
}
# endif
if ( opening_prev & & confirmation - > is_hidden ( ) )
opening_prev = false ;
if ( unsaved_cache ! = ( saved_version ! = editor_data . get_undo_redo ( ) . get_version ( ) ) ) {
unsaved_cache = ( saved_version ! = editor_data . get_undo_redo ( ) . get_version ( ) ) ;
_update_title ( ) ;
}
2015-06-22 05:03:19 +02:00
if ( last_checked_version ! = editor_data . get_undo_redo ( ) . get_version ( ) ) {
_update_scene_tabs ( ) ;
last_checked_version = editor_data . get_undo_redo ( ) . get_version ( ) ;
}
2014-02-10 02:10:30 +01:00
//get_root_node()->set_rect(viewport->get_global_rect());
//update the circle
uint64_t frame = OS : : get_singleton ( ) - > get_frames_drawn ( ) ;
uint32_t tick = OS : : get_singleton ( ) - > get_ticks_msec ( ) ;
if ( frame ! = circle_step_frame & & ( tick - circle_step_msec ) > ( 1000 / 8 ) ) {
circle_step + + ;
if ( circle_step > = 8 )
circle_step = 0 ;
circle_step_msec = tick ;
2016-10-01 16:15:07 +02:00
circle_step_frame = frame + 1 ;
2014-02-10 02:10:30 +01:00
2016-10-01 16:15:07 +02:00
// update the circle itself only when its enabled
if ( ! update_menu - > get_popup ( ) - > is_item_checked ( 3 ) ) {
update_menu - > set_icon ( gui_base - > get_icon ( " Progress " + itos ( circle_step + 1 ) , " EditorIcons " ) ) ;
}
2014-02-10 02:10:30 +01:00
}
scene_root - > set_size_override ( true , Size2 ( Globals : : get_singleton ( ) - > get ( " display/width " ) , Globals : : get_singleton ( ) - > get ( " display/height " ) ) ) ;
editor_selection - > update ( ) ;
{
uint32_t p32 = AudioServer : : get_singleton ( ) - > read_output_peak ( ) > > 8 ;
float peak = p32 = = 0 ? - 80 : Math : : linear2db ( p32 / 65535.0 ) ;
if ( peak < - 80 )
peak = - 80 ;
float vu = audio_vu - > get_val ( ) ;
if ( peak > vu ) {
audio_vu - > set_val ( peak ) ;
} else {
float new_vu = vu - get_process_delta_time ( ) * 70.0 ;
if ( new_vu < - 80 )
new_vu = - 80 ;
if ( new_vu ! = - 80 & & vu ! = - 80 )
audio_vu - > set_val ( new_vu ) ;
}
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
}
2014-11-06 01:20:42 +01:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
2014-02-10 02:10:30 +01:00
2015-03-16 04:47:37 +01:00
2014-02-10 02:10:30 +01:00
//MessageQueue::get_singleton()->push_call(this,"_get_scene_metadata");
2016-03-09 00:00:52 +01:00
get_tree ( ) - > set_editor_hint ( true ) ;
2014-11-06 01:20:42 +01:00
get_tree ( ) - > get_root ( ) - > set_as_audio_listener ( false ) ;
get_tree ( ) - > get_root ( ) - > set_as_audio_listener_2d ( false ) ;
get_tree ( ) - > set_auto_accept_quit ( false ) ;
2016-05-27 19:18:40 +02:00
get_tree ( ) - > connect ( " files_dropped " , this , " _dropped_files " ) ;
2014-02-10 02:10:30 +01:00
//VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport(),false);
//import_monitor->scan_changes();
}
2015-06-22 05:03:19 +02:00
if ( p_what = = NOTIFICATION_EXIT_TREE ) {
editor_data . clear_edited_scenes ( ) ;
}
2014-02-10 02:10:30 +01:00
if ( p_what = = NOTIFICATION_READY ) {
VisualServer : : get_singleton ( ) - > viewport_set_hide_scenario ( get_scene_root ( ) - > get_viewport ( ) , true ) ;
VisualServer : : get_singleton ( ) - > viewport_set_hide_canvas ( get_scene_root ( ) - > get_viewport ( ) , true ) ;
2015-03-16 04:47:37 +01:00
VisualServer : : get_singleton ( ) - > viewport_set_disable_environment ( get_viewport ( ) - > get_viewport_rid ( ) , true ) ;
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_3D ) ;
2014-02-10 02:10:30 +01:00
if ( defer_load_scene ! = " " ) {
load_scene ( defer_load_scene ) ;
defer_load_scene = " " ;
}
if ( defer_translatable ! = " " ) {
Error ok = save_translatable_strings ( defer_translatable ) ;
if ( ok ! = OK )
OS : : get_singleton ( ) - > set_exit_code ( 255 ) ;
defer_translatable = " " ;
2014-11-06 01:20:42 +01:00
get_tree ( ) - > quit ( ) ;
2014-02-10 02:10:30 +01:00
}
/*
if ( defer_optimize ! = " " ) {
Error ok = save_optimized_copy ( defer_optimize , defer_optimize_preset ) ;
defer_optimize_preset = " " ;
if ( ok ! = OK )
OS : : get_singleton ( ) - > set_exit_code ( 255 ) ;
get_scene ( ) - > quit ( ) ;
}
*/
2016-02-10 07:41:48 +01:00
/* // moved to "_sources_changed"
2014-02-10 02:10:30 +01:00
if ( export_defer . platform ! = " " ) {
project_export_settings - > export_platform ( export_defer . platform , export_defer . path , export_defer . debug , export_defer . password , true ) ;
export_defer . platform = " " ;
}
2016-02-10 07:41:48 +01:00
*/
2014-02-10 02:10:30 +01:00
}
if ( p_what = = MainLoop : : NOTIFICATION_WM_FOCUS_IN ) {
/*
List < Ref < Resource > > cached ;
ResourceCache : : get_cached_resources ( & cached ) ;
bool changes = false ;
for ( List < Ref < Resource > > : : Element * E = cached . front ( ) ; E ; E = E - > next ( ) ) {
if ( ! E - > get ( ) - > can_reload_from_file ( ) )
continue ;
if ( E - > get ( ) - > get_path ( ) . find ( " :: " ) ! = - 1 )
continue ;
uint64_t mt = FileAccess : : get_modified_time ( E - > get ( ) - > get_path ( ) ) ;
if ( mt ! = E - > get ( ) - > get_last_modified_time ( ) ) {
changes = true ;
break ;
}
}
sources_button - > get_popup ( ) - > set_item_disabled ( sources_button - > get_popup ( ) - > get_item_index ( DEPENDENCY_UPDATE_LOCAL ) , ! changes ) ;
if ( changes & & sources_button - > get_popup ( ) - > is_item_disabled ( sources_button - > get_popup ( ) - > get_item_index ( DEPENDENCY_UPDATE_IMPORTED ) ) ) {
sources_button - > set_icon ( gui_base - > get_icon ( " DependencyLocalChanged " , " EditorIcons " ) ) ;
}
*/
2014-05-05 03:50:23 +02:00
if ( bool ( EDITOR_DEF ( " resources/auto_reload_modified_images " , true ) ) ) {
_menu_option_confirm ( DEPENDENCY_LOAD_CHANGED_IMAGES , true ) ;
}
2014-02-10 02:10:30 +01:00
2016-05-27 19:18:40 +02:00
waiting_for_sources_changed = true ;
2014-02-10 02:10:30 +01:00
EditorFileSystem : : get_singleton ( ) - > scan_sources ( ) ;
}
if ( p_what = = MainLoop : : NOTIFICATION_WM_QUIT_REQUEST ) {
_menu_option_confirm ( FILE_QUIT , false ) ;
} ;
2016-02-20 02:41:29 +01:00
if ( p_what = = EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED ) {
scene_tabs - > set_tab_close_display_policy ( ( bool ( EDITOR_DEF ( " global/always_show_close_button_in_scene_tabs " , false ) ) ? Tabs : : CLOSE_BUTTON_SHOW_ALWAYS : Tabs : : CLOSE_BUTTON_SHOW_ACTIVE_ONLY ) ) ;
}
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _fs_changed ( ) {
for ( Set < FileDialog * > : : Element * E = file_dialogs . front ( ) ; E ; E = E - > next ( ) ) {
E - > get ( ) - > invalidate ( ) ;
}
2015-05-31 06:59:42 +02:00
for ( Set < EditorFileDialog * > : : Element * E = editor_file_dialogs . front ( ) ; E ; E = E - > next ( ) ) {
E - > get ( ) - > invalidate ( ) ;
}
2016-02-10 07:41:48 +01:00
if ( export_defer . platform ! = " " ) {
project_export_settings - > export_platform ( export_defer . platform , export_defer . path , export_defer . debug , export_defer . password , true ) ;
export_defer . platform = " " ;
}
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _sources_changed ( bool p_exist ) {
2016-05-27 19:18:40 +02:00
if ( p_exist & & bool ( EditorSettings : : get_singleton ( ) - > get ( " import/automatic_reimport_on_sources_changed " ) ) ) {
p_exist = false ;
List < String > changed_sources ;
EditorFileSystem : : get_singleton ( ) - > get_changed_sources ( & changed_sources ) ;
EditorProgress ep ( " reimport " , TTR ( " Re-Importing " ) , changed_sources . size ( ) ) ;
int step_idx = 0 ;
for ( List < String > : : Element * E = changed_sources . front ( ) ; E ; E = E - > next ( ) ) {
ep . step ( TTR ( " Importing: " ) + " " + E - > get ( ) , step_idx + + ) ;
Ref < ResourceImportMetadata > rimd = ResourceLoader : : load_import_metadata ( E - > get ( ) ) ;
ERR_CONTINUE ( rimd . is_null ( ) ) ;
String editor = rimd - > get_editor ( ) ;
if ( editor . begins_with ( " texture_ " ) ) {
editor = " texture " ; //compatibility fix for old versions
}
Ref < EditorImportPlugin > eip = EditorImportExport : : get_singleton ( ) - > get_import_plugin_by_name ( editor ) ;
ERR_CONTINUE ( eip . is_null ( ) ) ;
Error err = eip - > import ( E - > get ( ) , rimd ) ;
if ( err ! = OK ) {
EditorNode : : add_io_error ( " Error Re Importing: \n " + E - > get ( ) ) ;
}
}
EditorFileSystem : : get_singleton ( ) - > scan_sources ( ) ;
waiting_for_sources_changed = false ;
return ;
}
2014-02-10 02:10:30 +01:00
if ( p_exist ) {
sources_button - > set_icon ( gui_base - > get_icon ( " DependencyChanged " , " EditorIcons " ) ) ;
sources_button - > set_disabled ( false ) ;
} else {
sources_button - > set_icon ( gui_base - > get_icon ( " DependencyOk " , " EditorIcons " ) ) ;
sources_button - > set_disabled ( true ) ;
}
2016-02-10 07:41:48 +01:00
2016-05-27 19:18:40 +02:00
waiting_for_sources_changed = false ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _vp_resized ( ) {
}
2015-02-10 07:36:16 +01:00
void EditorNode : : _rebuild_import_menu ( )
{
PopupMenu * p = import_menu - > get_popup ( ) ;
p - > clear ( ) ;
2016-05-27 19:18:40 +02:00
//p->add_item(TTR("Node From Scene"), FILE_IMPORT_SUBSCENE);
//p->add_separator();
2015-02-10 07:36:16 +01:00
for ( int i = 0 ; i < editor_import_export - > get_import_plugin_count ( ) ; i + + ) {
p - > add_item ( editor_import_export - > get_import_plugin ( i ) - > get_visible_name ( ) , IMPORT_PLUGIN_BASE + i ) ;
}
}
2014-02-10 02:10:30 +01:00
void EditorNode : : _node_renamed ( ) {
if ( property_editor )
property_editor - > update_tree ( ) ;
}
Error EditorNode : : load_resource ( const String & p_scene ) {
RES res = ResourceLoader : : load ( p_scene ) ;
ERR_FAIL_COND_V ( ! res . is_valid ( ) , ERR_CANT_OPEN ) ;
edit_resource ( res ) ;
return OK ;
}
void EditorNode : : edit_resource ( const Ref < Resource > & p_resource ) {
_resource_selected ( p_resource , " " ) ;
}
void EditorNode : : edit_node ( Node * p_node ) {
push_item ( p_node ) ;
}
void EditorNode : : open_resource ( const String & p_type ) {
2015-05-31 06:59:42 +02:00
file - > set_mode ( EditorFileDialog : : MODE_OPEN_FILE ) ;
2014-02-10 02:10:30 +01:00
List < String > extensions ;
ResourceLoader : : get_recognized_extensions_for_type ( p_type , & extensions ) ;
file - > clear_filters ( ) ;
for ( int i = 0 ; i < extensions . size ( ) ; i + + ) {
file - > add_filter ( " *. " + extensions [ i ] + " ; " + extensions [ i ] . to_upper ( ) ) ;
}
//file->set_current_path(current_path);
file - > popup_centered_ratio ( ) ;
current_option = RESOURCE_LOAD ;
}
2015-09-01 05:49:47 +02:00
void EditorNode : : save_resource_in_path ( const Ref < Resource > & p_resource , const String & p_path ) {
editor_data . apply_changes_in_editors ( ) ;
int flg = 0 ;
if ( EditorSettings : : get_singleton ( ) - > get ( " on_save/compress_binary_resources " ) )
flg | = ResourceSaver : : FLAG_COMPRESS ;
2016-07-22 15:39:46 +02:00
//if (EditorSettings::get_singleton()->get("on_save/save_paths_as_relative"))
// flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
2015-09-01 05:49:47 +02:00
String path = Globals : : get_singleton ( ) - > localize_path ( p_path ) ;
Error err = ResourceSaver : : save ( path , p_resource , flg | ResourceSaver : : FLAG_REPLACE_SUBRESOURCE_PATHS ) ;
if ( err ! = OK ) {
2016-05-04 03:25:37 +02:00
accept - > set_text ( TTR ( " Error saving resource! " ) ) ;
2015-09-01 05:49:47 +02:00
accept - > popup_centered_minsize ( ) ;
return ;
}
// EditorFileSystem::get_singleton()->update_file(path,p_resource->get_type());
( ( Resource * ) p_resource . ptr ( ) ) - > set_path ( path ) ;
emit_signal ( " resource_saved " , p_resource ) ;
}
void EditorNode : : save_resource ( const Ref < Resource > & p_resource ) {
2014-02-10 02:10:30 +01:00
2015-09-01 05:49:47 +02:00
if ( p_resource - > get_path ( ) . is_resource_file ( ) ) {
save_resource_in_path ( p_resource , p_resource - > get_path ( ) ) ;
} else {
save_resource_as ( p_resource ) ;
}
2014-02-10 02:10:30 +01:00
}
2016-05-11 16:46:08 +02:00
void EditorNode : : save_resource_as ( const Ref < Resource > & p_resource , const String & p_at_path ) {
2014-02-10 02:10:30 +01:00
2015-09-01 05:49:47 +02:00
file - > set_mode ( EditorFileDialog : : MODE_SAVE_FILE ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 17:12:27 +01:00
current_option = RESOURCE_SAVE_AS ;
2015-09-01 05:49:47 +02:00
List < String > extensions ;
Ref < PackedScene > sd = memnew ( PackedScene ) ;
ResourceSaver : : get_recognized_extensions ( p_resource , & extensions ) ;
file - > clear_filters ( ) ;
2015-12-31 17:12:27 +01:00
List < String > preferred ;
2015-09-01 05:49:47 +02:00
for ( int i = 0 ; i < extensions . size ( ) ; i + + ) {
2016-01-10 19:38:47 +01:00
if ( p_resource - > is_type ( " Script " ) & & ( extensions [ i ] = = " tres " | | extensions [ i ] = = " res " | | extensions [ i ] = = " xml " ) ) {
2015-12-31 17:12:27 +01:00
//this serves no purpose and confused people
continue ;
}
2015-09-01 05:49:47 +02:00
file - > add_filter ( " *. " + extensions [ i ] + " ; " + extensions [ i ] . to_upper ( ) ) ;
2015-12-31 17:12:27 +01:00
preferred . push_back ( extensions [ i ] ) ;
2015-09-01 05:49:47 +02:00
}
//file->set_current_path(current_path);
2016-05-11 16:46:08 +02:00
if ( p_at_path ! = String ( ) ) {
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 {
if ( extensions . size ( ) ) {
file - > set_current_file ( " new_ " + p_resource - > get_type ( ) . to_lower ( ) + " . " + preferred . front ( ) - > get ( ) . to_lower ( ) ) ;
} else {
file - > set_current_file ( String ( ) ) ;
}
}
} else if ( p_resource - > get_path ( ) ! = " " ) {
2015-09-01 05:49:47 +02:00
file - > set_current_path ( p_resource - > get_path ( ) ) ;
if ( extensions . size ( ) ) {
String ext = p_resource - > get_path ( ) . extension ( ) . to_lower ( ) ;
if ( extensions . find ( ext ) = = NULL ) {
file - > set_current_path ( p_resource - > get_path ( ) . replacen ( " . " + ext , " . " + extensions . front ( ) - > get ( ) ) ) ;
}
}
2015-12-31 17:12:27 +01:00
} else if ( preferred . size ( ) ) {
2015-09-01 05:49:47 +02:00
String existing ;
if ( extensions . size ( ) ) {
2015-12-31 17:12:27 +01:00
existing = " new_ " + p_resource - > get_type ( ) . to_lower ( ) + " . " + preferred . front ( ) - > get ( ) . to_lower ( ) ;
2015-09-01 05:49:47 +02:00
}
file - > set_current_path ( existing ) ;
}
file - > popup_centered_ratio ( ) ;
2016-05-04 03:25:37 +02:00
file - > set_title ( TTR ( " Save Resource As.. " ) ) ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _menu_option ( int p_option ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
_menu_option_confirm ( p_option , false ) ;
}
void EditorNode : : _menu_confirm_current ( ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
_menu_option_confirm ( current_option , true ) ;
}
void EditorNode : : _dialog_display_file_error ( String p_file , Error p_error ) {
if ( p_error ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
current_option = - 1 ;
//accept->"()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
switch ( p_error ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
case ERR_FILE_CANT_WRITE : {
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Can't open file for writing: " ) + " " + p_file . extension ( ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case ERR_FILE_UNRECOGNIZED : {
2016-03-09 00:00:52 +01:00
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Requested file format unknown: " ) + " " + p_file . extension ( ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
default : {
2016-03-09 00:00:52 +01:00
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Error while saving. " ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
}
2016-03-09 00:00:52 +01:00
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
}
}
2015-12-31 04:31:00 +01:00
void EditorNode : : _get_scene_metadata ( const String & p_file ) {
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( ! scene )
return ;
2015-12-31 04:31:00 +01:00
String path = EditorSettings : : get_singleton ( ) - > get_project_settings_path ( ) . plus_file ( p_file . get_file ( ) + " -editstate- " + p_file . md5_text ( ) + " .cfg " ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
Ref < ConfigFile > cf ;
cf . instance ( ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
Error err = cf - > load ( path ) ;
2016-07-17 21:59:15 +02:00
if ( err ! = OK | | ! cf - > has_section ( " editor_states " ) )
2015-12-31 04:31:00 +01:00
return ; //must not exist
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
List < String > esl ;
cf - > get_section_keys ( " editor_states " , & esl ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
Dictionary md ;
for ( List < String > : : Element * E = esl . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
Variant st = cf - > get_value ( " editor_states " , E - > get ( ) ) ;
if ( st . get_type ( ) ) {
md [ E - > get ( ) ] = st ;
}
2014-02-10 02:10:30 +01:00
}
2015-12-31 04:31:00 +01:00
editor_data . set_editor_states ( md ) ;
2014-02-10 02:10:30 +01:00
}
2016-06-26 05:54:17 +02:00
void EditorNode : : _set_scene_metadata ( const String & p_file , int p_idx ) {
2014-02-10 02:10:30 +01:00
2016-06-26 05:54:17 +02:00
Node * scene = editor_data . get_edited_scene_root ( p_idx ) ;
2014-02-10 02:10:30 +01:00
if ( ! scene )
return ;
2015-12-31 04:31:00 +01:00
scene - > set_meta ( " __editor_run_settings__ " , Variant ( ) ) ; //clear it (no point in keeping it)
scene - > set_meta ( " __editor_plugin_states__ " , Variant ( ) ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
String path = EditorSettings : : get_singleton ( ) - > get_project_settings_path ( ) . plus_file ( p_file . get_file ( ) + " -editstate- " + p_file . md5_text ( ) + " .cfg " ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
Ref < ConfigFile > cf ;
cf . instance ( ) ;
2014-02-10 02:10:30 +01:00
2016-07-17 21:59:15 +02:00
Dictionary md ;
if ( p_idx < 0 | | editor_data . get_edited_scene ( ) = = p_idx ) {
md = editor_data . get_editor_states ( ) ;
} else {
md = editor_data . get_scene_editor_states ( p_idx ) ;
}
2015-12-31 04:31:00 +01:00
List < Variant > keys ;
md . get_key_list ( & keys ) ;
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
for ( List < Variant > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
cf - > set_value ( " editor_states " , E - > get ( ) , md [ E - > get ( ) ] ) ;
}
2014-02-10 02:10:30 +01:00
2015-12-31 04:31:00 +01:00
Error err = cf - > save ( path ) ;
ERR_FAIL_COND ( err ! = OK ) ;
2014-02-10 02:10:30 +01:00
}
2015-05-17 18:11:55 +02:00
bool EditorNode : : _find_and_save_resource ( RES res , Map < RES , bool > & processed , int32_t flags ) {
if ( res . is_null ( ) )
return false ;
if ( processed . has ( res ) ) {
return processed [ res ] ;
}
bool changed = res - > is_edited ( ) ;
res - > set_edited ( false ) ;
bool subchanged = _find_and_save_edited_subresources ( res . ptr ( ) , processed , flags ) ;
// print_line("checking if edited: "+res->get_type()+" :: "+res->get_name()+" :: "+res->get_path()+" :: "+itos(changed)+" :: SR "+itos(subchanged));
if ( res - > get_path ( ) . is_resource_file ( ) ) {
if ( changed | | subchanged ) {
//save
2016-05-04 15:28:37 +02:00
print_line ( " Also saving modified external resource: " + res - > get_path ( ) ) ;
2015-05-17 18:11:55 +02:00
Error err = ResourceSaver : : save ( res - > get_path ( ) , res , flags ) ;
}
processed [ res ] = false ; //because it's a file
return false ;
} else {
processed [ res ] = changed ;
return changed ;
}
}
bool EditorNode : : _find_and_save_edited_subresources ( Object * obj , Map < RES , bool > & processed , int32_t flags ) {
2014-02-10 02:10:30 +01:00
bool ret_changed = false ;
List < PropertyInfo > pi ;
obj - > get_property_list ( & pi ) ;
for ( List < PropertyInfo > : : Element * E = pi . front ( ) ; E ; E = E - > next ( ) ) {
if ( ! ( E - > get ( ) . usage & PROPERTY_USAGE_STORAGE ) )
continue ;
2015-05-17 18:11:55 +02:00
2014-02-10 02:10:30 +01:00
switch ( E - > get ( ) . type ) {
case Variant : : OBJECT : {
RES res = obj - > get ( E - > get ( ) . name ) ;
2015-05-17 18:11:55 +02:00
if ( _find_and_save_resource ( res , processed , flags ) )
2014-02-10 02:10:30 +01:00
ret_changed = true ;
} break ;
case Variant : : ARRAY : {
2015-05-17 18:11:55 +02:00
Array varray = obj - > get ( E - > get ( ) . name ) ;
2014-02-10 02:10:30 +01:00
int len = varray . size ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
Variant v = varray . get ( i ) ;
2015-05-17 18:11:55 +02:00
RES res = v ;
if ( _find_and_save_resource ( res , processed , flags ) )
ret_changed = true ;
//_find_resources(v);
}
2014-02-10 02:10:30 +01:00
} break ;
case Variant : : DICTIONARY : {
2015-05-17 18:11:55 +02:00
Dictionary d = obj - > get ( E - > get ( ) . name ) ; ;
2014-02-10 02:10:30 +01:00
List < Variant > keys ;
d . get_key_list ( & keys ) ;
for ( List < Variant > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
Variant v = d [ E - > get ( ) ] ;
2015-05-17 18:11:55 +02:00
RES res = v ;
if ( _find_and_save_resource ( res , processed , flags ) )
ret_changed = true ;
}
2014-02-10 02:10:30 +01:00
} break ;
default : { }
}
}
return ret_changed ;
}
2015-05-17 18:11:55 +02:00
void EditorNode : : _save_edited_subresources ( Node * scene , Map < RES , bool > & processed , int32_t flags ) {
2014-02-10 02:10:30 +01:00
_find_and_save_edited_subresources ( scene , processed , flags ) ;
for ( int i = 0 ; i < scene - > get_child_count ( ) ; i + + ) {
Node * n = scene - > get_child ( i ) ;
2015-06-22 05:03:19 +02:00
if ( n - > get_owner ( ) ! = editor_data . get_edited_scene_root ( ) )
2014-02-10 02:10:30 +01:00
continue ;
_save_edited_subresources ( n , processed , flags ) ;
}
}
2015-05-31 06:59:42 +02:00
void EditorNode : : _find_node_types ( Node * p_node , int & count_2d , int & count_3d ) {
2015-06-22 05:03:19 +02:00
if ( p_node - > is_type ( " Viewport " ) | | ( p_node ! = editor_data . get_edited_scene_root ( ) & & p_node - > get_owner ( ) ! = editor_data . get_edited_scene_root ( ) ) )
2015-05-31 06:59:42 +02:00
return ;
if ( p_node - > is_type ( " CanvasItem " ) )
count_2d + + ;
else if ( p_node - > is_type ( " Spatial " ) )
count_3d + + ;
for ( int i = 0 ; i < p_node - > get_child_count ( ) ; i + + )
_find_node_types ( p_node - > get_child ( i ) , count_2d , count_3d ) ;
}
void EditorNode : : _save_scene_with_preview ( String p_file ) {
int c2d = 0 ;
int c3d = 0 ;
2016-05-04 03:25:37 +02:00
EditorProgress save ( " save " , TTR ( " Saving Scene " ) , 4 ) ;
save . step ( TTR ( " Analyzing " ) , 0 ) ;
2015-06-22 05:03:19 +02:00
_find_node_types ( editor_data . get_edited_scene_root ( ) , c2d , c3d ) ;
2015-05-31 06:59:42 +02:00
RID viewport ;
bool is2d ;
if ( c3d < c2d ) {
viewport = scene_root - > get_viewport ( ) ;
is2d = true ;
} else {
viewport = SpatialEditor : : get_singleton ( ) - > get_editor_viewport ( 0 ) - > get_viewport_node ( ) - > get_viewport ( ) ;
is2d = false ;
}
2016-05-04 03:25:37 +02:00
save . step ( TTR ( " Creating Thumbnail " ) , 1 ) ;
2015-05-31 06:59:42 +02:00
//current view?
int screen = - 1 ;
for ( int i = 0 ; i < editor_table . size ( ) ; i + + ) {
if ( editor_plugin_screen = = editor_table [ i ] ) {
screen = i ;
break ;
}
}
2015-11-25 00:46:44 +01:00
_editor_select ( is2d ? EDITOR_2D : EDITOR_3D ) ;
2015-05-31 06:59:42 +02:00
VS : : get_singleton ( ) - > viewport_queue_screen_capture ( viewport ) ;
2016-05-04 03:25:37 +02:00
save . step ( TTR ( " Creating Thumbnail " ) , 2 ) ;
save . step ( TTR ( " Creating Thumbnail " ) , 3 ) ;
2015-05-31 06:59:42 +02:00
Image img = VS : : get_singleton ( ) - > viewport_get_screen_capture ( viewport ) ;
int preview_size = EditorSettings : : get_singleton ( ) - > get ( " file_dialog/thumbnail_size " ) ; ;
2016-05-30 05:28:29 +02:00
preview_size * = EDSCALE ;
2015-05-31 06:59:42 +02:00
int width , height ;
if ( img . get_width ( ) > preview_size & & img . get_width ( ) > = img . get_height ( ) ) {
width = preview_size ;
height = img . get_height ( ) * preview_size / img . get_width ( ) ;
} else if ( img . get_height ( ) > preview_size & & img . get_height ( ) > = img . get_width ( ) ) {
height = preview_size ;
width = img . get_width ( ) * preview_size / img . get_height ( ) ;
} else {
width = img . get_width ( ) ;
height = img . get_height ( ) ;
}
img . convert ( Image : : FORMAT_RGB ) ;
img . resize ( width , height ) ;
String pfile = EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " tmp/last_scene_preview.png " ) ;
img . save_png ( pfile ) ;
Vector < uint8_t > imgdata = FileAccess : : get_file_as_array ( pfile ) ;
2015-06-22 05:03:19 +02:00
//print_line("img data is "+itos(imgdata.size()));
2015-05-31 06:59:42 +02:00
2015-06-22 05:03:19 +02:00
if ( editor_data . get_edited_scene_import_metadata ( ) . is_null ( ) )
editor_data . set_edited_scene_import_metadata ( Ref < ResourceImportMetadata > ( memnew ( ResourceImportMetadata ) ) ) ;
editor_data . get_edited_scene_import_metadata ( ) - > set_option ( " thumbnail " , imgdata ) ;
2015-05-31 06:59:42 +02:00
//tamanio tel thumbnail
if ( screen ! = - 1 ) {
_editor_select ( screen ) ;
}
2016-05-04 03:25:37 +02:00
save . step ( TTR ( " Saving Scene " ) , 4 ) ;
2015-05-31 06:59:42 +02:00
_save_scene ( p_file ) ;
}
2016-06-26 05:54:17 +02:00
void EditorNode : : _save_scene ( String p_file , int idx ) {
2014-02-10 02:10:30 +01:00
2016-06-26 05:54:17 +02:00
Node * scene = editor_data . get_edited_scene_root ( idx ) ;
2014-02-10 02:10:30 +01:00
if ( ! scene ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a tree root. " ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
editor_data . apply_changes_in_editors ( ) ;
2016-07-08 18:36:57 +02:00
_set_scene_metadata ( p_file , idx ) ;
2015-12-14 00:39:01 +01:00
Ref < PackedScene > sdata ;
if ( ResourceCache : : has ( p_file ) ) {
// 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 instanced or inherited scenes
sdata = Ref < PackedScene > ( ResourceCache : : get ( p_file ) - > cast_to < PackedScene > ( ) ) ;
if ( sdata . is_valid ( ) )
sdata - > recreate_state ( ) ;
else
sdata . instance ( ) ;
} else {
sdata . instance ( ) ;
}
2014-02-10 02:10:30 +01:00
Error err = sdata - > pack ( scene ) ;
if ( err ! = OK ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
accept - > set_text ( TTR ( " Couldn't save scene. Likely dependencies (instances) couldn't be satisfied. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
2016-06-26 05:54:17 +02:00
sdata - > set_import_metadata ( editor_data . get_edited_scene_import_metadata ( idx ) ) ;
2014-02-10 02:10:30 +01:00
int flg = 0 ;
if ( EditorSettings : : get_singleton ( ) - > get ( " on_save/compress_binary_resources " ) )
flg | = ResourceSaver : : FLAG_COMPRESS ;
2016-07-22 15:39:46 +02:00
//if (EditorSettings::get_singleton()->get("on_save/save_paths_as_relative"))
// flg|=ResourceSaver::FLAG_RELATIVE_PATHS;
2014-06-28 04:21:45 +02:00
flg | = ResourceSaver : : FLAG_REPLACE_SUBRESOURCE_PATHS ;
2014-02-10 02:10:30 +01:00
err = ResourceSaver : : save ( p_file , sdata , flg ) ;
2015-05-17 18:11:55 +02:00
Map < RES , bool > processed ;
2014-02-10 02:10:30 +01:00
_save_edited_subresources ( scene , processed , flg ) ;
editor_data . save_editor_external_data ( ) ;
if ( err = = OK ) {
scene - > set_filename ( Globals : : get_singleton ( ) - > localize_path ( p_file ) ) ;
//EditorFileSystem::get_singleton()->update_file(p_file,sdata->get_type());
2016-06-26 05:54:17 +02:00
if ( idx < 0 | | idx = = editor_data . get_edited_scene ( ) )
set_current_version ( editor_data . get_undo_redo ( ) . get_version ( ) ) ;
else
editor_data . set_edited_scene_version ( 0 , idx ) ;
2014-02-10 02:10:30 +01:00
_update_title ( ) ;
2015-08-12 22:35:37 +02:00
_update_scene_tabs ( ) ;
2014-02-10 02:10:30 +01:00
} else {
_dialog_display_file_error ( p_file , err ) ;
}
} ;
void EditorNode : : _import_action ( const String & p_action ) {
#if 0
import_confirmation - > hide ( ) ;
if ( p_action = = " re-import " ) {
_import ( _tmp_import_path ) ;
}
if ( p_action = = " update " ) {
Node * src = EditorImport : : import_scene ( _tmp_import_path ) ;
if ( ! src ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-21 01:18:35 +02:00
accept - > get_ok ( ) - > set_text ( " Ugh " ) ;
accept - > set_text ( " Error importing scene. " ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ;
}
//as soon as the scene is imported, version hashes must be generated for comparison against saved scene
EditorImport : : generate_version_hashes ( src ) ;
Node * dst = SceneLoader : : load ( editor_data . get_imported_scene ( Globals : : get_singleton ( ) - > localize_path ( _tmp_import_path ) ) ) ;
if ( ! dst ) {
memdelete ( src ) ;
//accept->get_cancel()->hide();
2016-05-21 01:18:35 +02:00
accept - > get_ok ( ) - > set_text ( " Ugh " ) ;
accept - > set_text ( " Error load scene to update. " ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ;
}
List < EditorImport : : Conflict > conflicts ;
EditorImport : : check_conflicts ( src , dst , & conflicts ) ;
bool conflicted = false ;
for ( List < EditorImport : : Conflict > : : Element * E = conflicts . front ( ) ; E ; E = E - > next ( ) ) {
if ( E - > get ( ) . status = = EditorImport : : Conflict : : STATUS_CONFLICT ) {
conflicted = true ;
break ;
}
}
if ( conflicted ) {
import_conflicts_dialog - > popup ( src , dst , conflicts ) ;
return ;
}
_import_with_conflicts ( src , dst , conflicts ) ;
//not conflicted, just reimport!
}
# endif
}
void EditorNode : : _import ( const String & p_file ) {
#if 0
Node * new_scene = EditorImport : : import_scene ( p_file ) ;
if ( ! new_scene ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-21 01:18:35 +02:00
accept - > get_ok ( ) - > set_text ( " Ugh " ) ;
accept - > set_text ( " Error importing scene. " ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ;
}
//as soon as the scene is imported, version hashes must be generated for comparison against saved scene
EditorImport : : generate_version_hashes ( new_scene ) ;
Node * old_scene = edited_scene ;
_hide_top_editors ( ) ;
set_edited_scene ( NULL ) ;
editor_data . clear_editor_states ( ) ;
if ( old_scene ) {
memdelete ( old_scene ) ;
}
set_edited_scene ( new_scene ) ;
scene_tree_dock - > set_selected ( new_scene ) ;
//_get_scene_metadata();
editor_data . get_undo_redo ( ) . clear_history ( ) ;
saved_version = editor_data . get_undo_redo ( ) . get_version ( ) ;
_update_title ( ) ;
# endif
}
void EditorNode : : _dialog_action ( String p_file ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
switch ( current_option ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
case RESOURCE_LOAD : {
RES res = ResourceLoader : : load ( p_file ) ;
if ( res . is_null ( ) ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
accept - > get_ok ( ) - > set_text ( " ok :( " ) ;
2016-05-04 03:25:37 +02:00
accept - > set_text ( TTR ( " Failed to load resource. " ) ) ;
2014-02-10 02:10:30 +01:00
return ;
} ;
push_item ( res . operator - > ( ) ) ;
2016-03-09 00:00:52 +01:00
} break ;
2015-10-10 14:09:09 +02:00
case FILE_NEW_INHERITED_SCENE : {
load_scene ( p_file , false , true ) ;
} break ;
2014-02-10 02:10:30 +01:00
case FILE_OPEN_SCENE : {
load_scene ( p_file ) ;
} break ;
2016-06-28 00:59:33 +02:00
case SETTINGS_PICK_MAIN_SCENE : {
2014-02-10 02:10:30 +01:00
2016-06-28 00:59:33 +02:00
Globals : : get_singleton ( ) - > set ( " application/main_scene " , p_file ) ;
2016-07-19 21:35:14 +02:00
Globals : : get_singleton ( ) - > set_persisting ( " application/main_scene " , true ) ;
Globals : : get_singleton ( ) - > save ( ) ;
2016-06-28 00:59:33 +02:00
//would be nice to show the project manager opened with the hilighted field..
} break ;
2014-02-10 02:10:30 +01:00
case FILE_SAVE_OPTIMIZED : {
} break ;
2014-02-21 03:01:44 +01:00
case FILE_RUN_SCRIPT : {
2014-02-10 02:10:30 +01:00
2014-02-21 03:01:44 +01:00
Ref < Script > scr = ResourceLoader : : load ( p_file , " Script " , true ) ;
if ( scr . is_null ( ) ) {
add_io_error ( " Script Failed to Load: \n " + p_file ) ;
return ;
}
if ( ! scr - > is_tool ( ) ) {
add_io_error ( " Script is not tool, will not be able to run: \n " + p_file ) ;
return ;
}
Ref < EditorScript > es = memnew ( EditorScript ) ;
es - > set_script ( scr . get_ref_ptr ( ) ) ;
es - > set_editor ( this ) ;
es - > _run ( ) ;
get_undo_redo ( ) - > clear_history ( ) ;
} break ;
2014-02-10 02:10:30 +01:00
case FILE_DUMP_STRINGS : {
save_translatable_strings ( p_file ) ;
} break ;
case FILE_SAVE_SCENE :
case FILE_SAVE_AS_SCENE : {
2016-07-25 15:31:57 +02:00
if ( file - > get_mode ( ) = = EditorFileDialog : : MODE_SAVE_FILE ) {
2014-02-10 02:10:30 +01:00
2015-05-31 06:59:42 +02:00
//_save_scene(p_file);
_save_scene_with_preview ( p_file ) ;
2014-02-10 02:10:30 +01:00
}
} break ;
2015-01-06 23:28:25 +01:00
case FILE_SAVE_AND_RUN : {
2016-07-25 15:31:57 +02:00
if ( file - > get_mode ( ) = = EditorFileDialog : : MODE_SAVE_FILE ) {
2015-01-06 23:28:25 +01:00
2015-05-31 06:59:42 +02:00
//_save_scene(p_file);
_save_scene_with_preview ( p_file ) ;
2015-01-06 23:28:25 +01:00
_run ( false ) ;
}
} break ;
2014-02-10 02:10:30 +01:00
case FILE_EXPORT_MESH_LIBRARY : {
Ref < MeshLibrary > ml ;
if ( file_export_lib_merge - > is_pressed ( ) & & FileAccess : : exists ( p_file ) ) {
ml = ResourceLoader : : load ( p_file , " MeshLibrary " ) ;
if ( ml . is_null ( ) ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Can't load MeshLibrary for merging! " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
}
if ( ml . is_null ( ) ) {
ml = Ref < MeshLibrary > ( memnew ( MeshLibrary ) ) ;
}
2015-06-22 05:03:19 +02:00
MeshLibraryEditor : : update_library_file ( editor_data . get_edited_scene_root ( ) , ml , true ) ;
2014-02-10 02:10:30 +01:00
Error err = ResourceSaver : : save ( p_file , ml ) ;
if ( err ) {
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Error saving MeshLibrary! " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
} break ;
case FILE_EXPORT_TILESET : {
Ref < TileSet > ml ;
2016-01-08 17:54:13 +01:00
if ( FileAccess : : exists ( p_file ) ) {
2014-02-10 02:10:30 +01:00
ml = ResourceLoader : : load ( p_file , " TileSet " ) ;
2016-03-11 01:20:01 +01:00
if ( ml . is_null ( ) ) {
if ( file_export_lib_merge - > is_pressed ( ) ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Can't load TileSet for merging! " ) ) ;
2016-03-11 01:20:01 +01:00
accept - > popup_centered_minsize ( ) ;
return ;
}
} else if ( ! file_export_lib_merge - > is_pressed ( ) ) {
2016-01-08 17:54:13 +01:00
ml - > clear ( ) ;
}
2016-03-11 01:20:01 +01:00
} else {
2014-02-10 02:10:30 +01:00
ml = Ref < TileSet > ( memnew ( TileSet ) ) ;
}
2015-06-22 05:03:19 +02:00
TileSetEditor : : update_library_file ( editor_data . get_edited_scene_root ( ) , ml , true ) ;
2014-02-10 02:10:30 +01:00
Error err = ResourceSaver : : save ( p_file , ml ) ;
if ( err ) {
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Error saving TileSet! " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
} break ;
case SETTINGS_LOAD_EXPORT_TEMPLATES : {
FileAccess * fa = NULL ;
zlib_filefunc_def io = zipio_create_io_from_file ( & fa ) ;
unzFile pkg = unzOpen2 ( p_file . utf8 ( ) . get_data ( ) , & io ) ;
if ( ! pkg ) {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
accept - > set_text ( TTR ( " Can't open export templates zip. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
int ret = unzGoToFirstFile ( pkg ) ;
2016-05-19 00:08:12 +02:00
int fc = 0 ; //count them
2014-02-10 02:10:30 +01:00
2014-02-13 22:03:28 +01:00
while ( ret = = UNZ_OK ) {
fc + + ;
ret = unzGoToNextFile ( pkg ) ;
}
ret = unzGoToFirstFile ( pkg ) ;
2016-05-04 03:25:37 +02:00
EditorProgress p ( " ltask " , TTR ( " Loading Export Templates " ) , fc ) ;
2014-02-10 02:10:30 +01:00
2014-02-13 22:03:28 +01:00
fc = 0 ;
2014-02-10 02:10:30 +01:00
while ( ret = = UNZ_OK ) {
//get filename
unz_file_info info ;
char fname [ 16384 ] ;
ret = unzGetCurrentFileInfo ( pkg , & info , fname , 16384 , NULL , 0 , NULL , 0 ) ;
2014-02-13 22:03:28 +01:00
2014-02-10 02:10:30 +01:00
String file = fname ;
Vector < uint8_t > data ;
data . resize ( info . uncompressed_size ) ;
//read
2014-02-13 22:03:28 +01:00
ret = unzOpenCurrentFile ( pkg ) ;
ret = unzReadCurrentFile ( pkg , data . ptr ( ) , data . size ( ) ) ;
2014-02-10 02:10:30 +01:00
unzCloseCurrentFile ( pkg ) ;
2014-02-13 22:03:28 +01:00
print_line ( fname ) ;
//for(int i=0;i<512;i++) {
// print_line(itos(data[i]));
//}
2014-02-10 02:10:30 +01:00
file = file . get_file ( ) ;
2016-05-19 00:08:12 +02:00
p . step ( TTR ( " Importing: " ) + " " + file , fc ) ;
2014-02-10 02:10:30 +01:00
FileAccess * f = FileAccess : : open ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) + " /templates/ " + file , FileAccess : : WRITE ) ;
ERR_CONTINUE ( ! f ) ;
f - > store_buffer ( data . ptr ( ) , data . size ( ) ) ;
memdelete ( f ) ;
ret = unzGoToNextFile ( pkg ) ;
2014-02-13 22:03:28 +01:00
fc + + ;
2014-02-10 02:10:30 +01:00
}
unzClose ( pkg ) ;
} break ;
2015-09-01 05:49:47 +02:00
case RESOURCE_SAVE :
case RESOURCE_SAVE_AS : {
uint32_t current = editor_history . get_current ( ) ;
Object * current_obj = current > 0 ? ObjectDB : : get_instance ( current ) : NULL ;
ERR_FAIL_COND ( ! current_obj - > cast_to < Resource > ( ) )
2014-02-10 02:10:30 +01:00
2015-09-01 05:49:47 +02:00
RES current_res = RES ( current_obj - > cast_to < Resource > ( ) ) ;
save_resource_in_path ( current_res , p_file ) ;
2015-11-22 19:11:17 +01:00
} break ;
case SETTINGS_LAYOUT_SAVE : {
if ( p_file . empty ( ) )
return ;
Ref < ConfigFile > config ;
config . instance ( ) ;
Error err = config - > load ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " editor_layouts.cfg " ) ) ;
2016-01-01 18:48:14 +01:00
if ( err = = ERR_CANT_OPEN ) {
config . instance ( ) ; // new config
} else if ( err ! = OK ) {
2016-05-04 03:25:37 +02:00
show_warning ( TTR ( " Error trying to save layout! " ) ) ;
2016-01-01 18:48:14 +01:00
return ;
2015-11-22 19:11:17 +01:00
}
_save_docks_to_config ( config , p_file ) ;
config - > save ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " editor_layouts.cfg " ) ) ;
layout_dialog - > hide ( ) ;
_update_layouts_menu ( ) ;
2016-01-11 22:23:45 +01:00
if ( p_file = = " Default " ) {
2016-05-04 03:25:37 +02:00
show_warning ( TTR ( " Default editor layout overridden. " ) ) ;
2016-01-11 22:23:45 +01:00
}
2015-11-22 19:11:17 +01:00
} break ;
case SETTINGS_LAYOUT_DELETE : {
if ( p_file . empty ( ) )
return ;
Ref < ConfigFile > config ;
config . instance ( ) ;
Error err = config - > load ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " editor_layouts.cfg " ) ) ;
2016-01-01 18:48:14 +01:00
if ( err ! = OK | | ! config - > has_section ( p_file ) ) {
2016-05-04 03:25:37 +02:00
show_warning ( TTR ( " Layout name not found! " ) ) ;
2015-11-22 19:11:17 +01:00
return ;
}
// erase
List < String > keys ;
config - > get_section_keys ( p_file , & keys ) ;
for ( List < String > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
config - > set_value ( p_file , E - > get ( ) , Variant ( ) ) ;
}
config - > save ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " editor_layouts.cfg " ) ) ;
layout_dialog - > hide ( ) ;
_update_layouts_menu ( ) ;
2016-01-11 22:23:45 +01:00
if ( p_file = = " Default " ) {
2016-05-19 00:08:12 +02:00
show_warning ( TTR ( " Restored default layout to base settings. " ) ) ;
2016-01-11 22:23:45 +01:00
}
2015-09-01 05:49:47 +02:00
} break ;
2014-02-10 02:10:30 +01:00
default : { //save scene?
2016-03-09 00:00:52 +01:00
2016-07-25 15:31:57 +02:00
if ( file - > get_mode ( ) = = EditorFileDialog : : MODE_SAVE_FILE ) {
2014-02-10 02:10:30 +01:00
2015-05-31 06:59:42 +02:00
//_save_scene(p_file);
_save_scene_with_preview ( p_file ) ;
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
}
}
void EditorNode : : push_item ( Object * p_object , const String & p_property ) {
if ( ! p_object ) {
property_editor - > edit ( NULL ) ;
2016-06-04 18:17:56 +02:00
node_dock - > set_node ( NULL ) ;
2014-02-10 02:10:30 +01:00
scene_tree_dock - > set_selected ( NULL ) ;
return ;
}
uint32_t id = p_object - > get_instance_ID ( ) ;
if ( id ! = editor_history . get_current ( ) ) {
if ( p_property = = " " )
editor_history . add_object ( id ) ;
else
editor_history . add_object ( id , p_property ) ;
}
_edit_current ( ) ;
}
2015-09-01 05:49:47 +02:00
void EditorNode : : _select_history ( int p_idx ) {
//push it to the top, it is not correct, but it's more useful
ObjectID id = editor_history . get_history_obj ( p_idx ) ;
Object * obj = ObjectDB : : get_instance ( id ) ;
if ( ! obj )
return ;
push_item ( obj ) ;
}
void EditorNode : : _prepare_history ( ) {
int history_to = MAX ( 0 , editor_history . get_history_len ( ) - 25 ) ;
editor_history_menu - > get_popup ( ) - > clear ( ) ;
Ref < Texture > base_icon = gui_base - > get_icon ( " Object " , " EditorIcons " ) ;
Set < ObjectID > already ;
for ( int i = editor_history . get_history_len ( ) - 1 ; i > = history_to ; i - - ) {
ObjectID id = editor_history . get_history_obj ( i ) ;
Object * obj = ObjectDB : : get_instance ( id ) ;
if ( ! obj | | already . has ( id ) ) {
if ( history_to > 0 ) {
history_to - - ;
}
continue ;
}
already . insert ( id ) ;
Ref < Texture > icon = gui_base - > get_icon ( " Object " , " EditorIcons " ) ;
if ( gui_base - > has_icon ( obj - > get_type ( ) , " EditorIcons " ) )
icon = gui_base - > get_icon ( obj - > get_type ( ) , " EditorIcons " ) ;
else
icon = base_icon ;
String text ;
if ( obj - > cast_to < Resource > ( ) ) {
Resource * r = obj - > cast_to < Resource > ( ) ;
if ( r - > get_path ( ) . is_resource_file ( ) )
text = r - > get_path ( ) . get_file ( ) ;
else if ( r - > get_name ( ) ! = String ( ) ) {
text = r - > get_name ( ) ;
} else {
text = r - > get_type ( ) ;
}
} else if ( obj - > cast_to < Node > ( ) ) {
text = obj - > cast_to < Node > ( ) - > get_name ( ) ;
} else {
text = obj - > get_type ( ) ;
}
if ( i = = editor_history . get_history_pos ( ) ) {
text = " [ " + text + " ] " ;
}
editor_history_menu - > get_popup ( ) - > add_icon_item ( icon , text , i ) ;
}
}
2014-02-10 02:10:30 +01:00
void EditorNode : : _property_editor_forward ( ) {
if ( editor_history . next ( ) )
_edit_current ( ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _property_editor_back ( ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
if ( editor_history . previous ( ) )
_edit_current ( ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _imported ( Node * p_node ) {
2015-06-22 05:03:19 +02:00
/*
2016-07-06 19:04:21 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
add_edited_scene ( p_node ) ;
2014-02-10 02:10:30 +01:00
if ( scene ) {
String path = scene - > get_filename ( ) ;
p_node - > set_filename ( path ) ;
memdelete ( scene ) ;
}
2015-06-22 05:03:19 +02:00
*/
2014-02-10 02:10:30 +01:00
}
2016-03-30 01:02:53 +02:00
void EditorNode : : _hide_top_editors ( ) {
2014-02-10 02:10:30 +01:00
2016-03-30 01:02:53 +02:00
_display_top_editors ( false ) ;
2014-02-10 02:10:30 +01:00
2016-03-30 01:02:53 +02:00
editor_plugins_over - > clear ( ) ;
}
void EditorNode : : _display_top_editors ( bool p_display ) {
editor_plugins_over - > make_visible ( p_display ) ;
}
void EditorNode : : _set_top_editors ( Vector < EditorPlugin * > p_editor_plugins_over ) {
editor_plugins_over - > set_plugins_list ( p_editor_plugins_over ) ;
}
2014-02-10 02:10:30 +01:00
2016-03-30 01:02:53 +02:00
void EditorNode : : _set_editing_top_editors ( Object * p_current_object ) {
editor_plugins_over - > edit ( p_current_object ) ;
2014-02-10 02:10:30 +01:00
}
2016-03-30 01:02:53 +02:00
2014-02-10 02:10:30 +01:00
void EditorNode : : _edit_current ( ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
uint32_t current = editor_history . get_current ( ) ;
Object * current_obj = current > 0 ? ObjectDB : : get_instance ( current ) : NULL ;
2015-09-01 05:49:47 +02:00
property_back - > set_disabled ( editor_history . is_at_begining ( ) ) ;
property_forward - > set_disabled ( editor_history . is_at_end ( ) ) ;
2014-02-10 02:10:30 +01:00
this - > current = current_obj ;
editor_path - > update_path ( ) ;
if ( ! current_obj ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
scene_tree_dock - > set_selected ( NULL ) ;
property_editor - > edit ( NULL ) ;
2016-06-04 18:17:56 +02:00
node_dock - > set_node ( NULL ) ;
2014-02-10 02:10:30 +01:00
object_menu - > set_disabled ( true ) ;
2015-12-03 16:30:55 +01:00
2016-03-30 01:02:53 +02:00
_display_top_editors ( false ) ;
2015-12-03 16:30:55 +01:00
2014-02-10 02:10:30 +01:00
return ;
}
object_menu - > set_disabled ( true ) ;
2015-09-01 05:49:47 +02:00
bool is_resource = current_obj - > is_type ( " Resource " ) ;
2016-07-09 16:46:59 +02:00
bool is_node = current_obj - > is_type ( " Node " ) ;
2015-09-01 05:49:47 +02:00
resource_save_button - > set_disabled ( ! is_resource ) ;
if ( is_resource ) {
2014-02-10 02:10:30 +01:00
Resource * current_res = current_obj - > cast_to < Resource > ( ) ;
ERR_FAIL_COND ( ! current_res ) ;
scene_tree_dock - > set_selected ( NULL ) ;
property_editor - > edit ( current_res ) ;
2016-06-04 18:17:56 +02:00
node_dock - > set_node ( NULL ) ;
2014-02-10 02:10:30 +01:00
object_menu - > set_disabled ( false ) ;
2015-09-01 05:49:47 +02:00
//resources_dock->add_resource(Ref<Resource>(current_res));
2015-06-14 03:12:53 +02:00
//top_pallete->set_current_tab(1);
2016-07-09 16:46:59 +02:00
} else if ( is_node ) {
2014-02-10 02:10:30 +01:00
Node * current_node = current_obj - > cast_to < Node > ( ) ;
ERR_FAIL_COND ( ! current_node ) ;
2014-11-06 01:20:42 +01:00
ERR_FAIL_COND ( ! current_node - > is_inside_tree ( ) ) ;
2014-02-10 02:10:30 +01:00
property_editor - > edit ( current_node ) ;
2016-06-04 18:17:56 +02:00
node_dock - > set_node ( current_node ) ;
2014-02-10 02:10:30 +01:00
scene_tree_dock - > set_selected ( current_node ) ;
object_menu - > get_popup ( ) - > clear ( ) ;
2015-06-14 03:12:53 +02:00
//top_pallete->set_current_tab(0);
2014-02-10 02:10:30 +01:00
2015-08-25 05:08:45 +02:00
} else {
property_editor - > edit ( current_obj ) ;
2016-06-04 18:17:56 +02:00
node_dock - > set_node ( NULL ) ;
2015-08-25 05:08:45 +02:00
//scene_tree_dock->set_selected(current_node);
//object_menu->get_popup()->clear();
2014-02-10 02:10:30 +01:00
}
/* Take care of PLUGIN EDITOR */
2014-07-07 22:44:21 +02:00
2014-02-10 02:10:30 +01:00
EditorPlugin * main_plugin = editor_data . get_editor ( current_obj ) ;
if ( main_plugin ) {
if ( main_plugin ! = editor_plugin_screen ) {
// update screen main_plugin
2015-06-22 05:03:19 +02:00
if ( ! changing_scene ) {
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
if ( editor_plugin_screen )
editor_plugin_screen - > make_visible ( false ) ;
editor_plugin_screen = main_plugin ;
editor_plugin_screen - > edit ( current_obj ) ;
editor_plugin_screen - > make_visible ( true ) ;
for ( int i = 0 ; i < editor_table . size ( ) ; i + + ) {
2015-11-18 08:47:41 +01:00
main_editor_buttons [ i ] - > set_pressed ( editor_table [ i ] = = main_plugin ) ;
2014-02-10 02:10:30 +01:00
}
}
} else {
editor_plugin_screen - > edit ( current_obj ) ;
}
}
2016-03-30 01:02:53 +02:00
Vector < EditorPlugin * > sub_plugins = editor_data . get_subeditors ( current_obj ) ;
2014-02-10 02:10:30 +01:00
2016-03-30 01:02:53 +02:00
if ( ! sub_plugins . empty ( ) ) {
_display_top_editors ( false ) ;
2014-02-10 02:10:30 +01:00
2016-03-30 01:02:53 +02:00
_set_top_editors ( sub_plugins ) ;
_set_editing_top_editors ( current_obj ) ;
_display_top_editors ( true ) ;
2016-05-21 15:29:25 +02:00
2016-03-30 01:02:53 +02:00
} else if ( ! editor_plugins_over - > get_plugins_list ( ) . empty ( ) ) {
2014-02-10 02:10:30 +01:00
2016-03-30 01:02:53 +02:00
_hide_top_editors ( ) ;
2014-02-10 02:10:30 +01:00
}
/*
if ( ! plugin | | plugin - > has_main_screen ( ) ) {
// remove the OVER plugin if exists
if ( editor_plugin_over )
editor_plugin_over - > make_visible ( false ) ;
editor_plugin_over = NULL ;
}
*/
/* Take care of OBJECT MENU */
object_menu - > set_disabled ( false ) ;
PopupMenu * p = object_menu - > get_popup ( ) ;
p - > clear ( ) ;
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " property_editor/copy_params " , TTR ( " Copy Params " ) ) , OBJECT_COPY_PARAMS ) ;
p - > add_shortcut ( ED_SHORTCUT ( " property_editor/paste_params " , TTR ( " Paste Params " ) ) , OBJECT_PASTE_PARAMS ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " property_editor/paste_resource " , TTR ( " Paste Resource " ) ) , RESOURCE_PASTE ) ;
2015-09-01 05:49:47 +02:00
if ( is_resource ) {
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " property_editor/copy_resource " , TTR ( " Copy Resource " ) ) , RESOURCE_COPY ) ;
p - > add_shortcut ( ED_SHORTCUT ( " property_editor/unref_resource " , TTR ( " Make Built-In " ) ) , RESOURCE_UNREF ) ;
2015-09-01 05:49:47 +02:00
}
2016-07-09 16:46:59 +02:00
if ( is_resource | | is_node ) {
p - > add_separator ( ) ;
p - > add_shortcut ( ED_SHORTCUT ( " property_editor/make_subresources_unique " , TTR ( " Make Sub-Resources Unique " ) ) , OBJECT_UNIQUE_RESOURCES ) ;
p - > add_separator ( ) ;
p - > add_icon_shortcut ( gui_base - > get_icon ( " Help " , " EditorIcons " ) , ED_SHORTCUT ( " property_editor/open_help " , TTR ( " Open in Help " ) ) , OBJECT_REQUEST_HELP ) ;
}
2014-02-10 02:10:30 +01:00
List < MethodInfo > methods ;
current_obj - > get_method_list ( & methods ) ;
if ( ! methods . empty ( ) ) {
bool found = false ;
List < MethodInfo > : : Element * I = methods . front ( ) ;
int i = 0 ;
while ( I ) {
if ( I - > get ( ) . flags & METHOD_FLAG_EDITOR ) {
if ( ! found ) {
p - > add_separator ( ) ;
found = true ;
}
p - > add_item ( I - > get ( ) . name . capitalize ( ) , OBJECT_METHOD_BASE + i ) ;
}
i + + ;
I = I - > next ( ) ;
}
}
//p->add_separator();
2016-05-21 01:18:35 +02:00
//p->add_item("All Methods",OBJECT_CALL_METHOD);
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
update_keying ( ) ;
2014-02-10 02:10:30 +01:00
}
2015-09-01 05:49:47 +02:00
void EditorNode : : _resource_created ( ) {
Object * c = create_dialog - > instance_selected ( ) ;
ERR_FAIL_COND ( ! c ) ;
Resource * r = c - > cast_to < Resource > ( ) ;
ERR_FAIL_COND ( ! r ) ;
REF res ( r ) ;
push_item ( c ) ;
}
2014-02-10 02:10:30 +01:00
void EditorNode : : _resource_selected ( const RES & p_res , const String & p_property ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
if ( p_res . is_null ( ) )
return ;
RES r = p_res ;
push_item ( r . operator - > ( ) , p_property ) ;
}
void EditorNode : : _run ( bool p_current , const String & p_custom ) {
if ( editor_run . get_status ( ) = = EditorRun : : STATUS_PLAY ) {
play_button - > set_pressed ( ! _playing_edited ) ;
play_scene_button - > set_pressed ( _playing_edited ) ;
return ;
}
play_button - > set_pressed ( false ) ;
2015-12-08 19:33:50 +01:00
play_button - > set_icon ( gui_base - > get_icon ( " MainPlay " , " EditorIcons " ) ) ;
2015-04-21 00:38:02 +02:00
//pause_button->set_pressed(false);
2014-02-10 02:10:30 +01:00
play_scene_button - > set_pressed ( false ) ;
2015-10-28 23:50:11 +01:00
play_scene_button - > set_icon ( gui_base - > get_icon ( " PlayScene " , " EditorIcons " ) ) ;
2016-02-17 20:51:56 +01:00
play_custom_scene_button - > set_pressed ( false ) ;
play_custom_scene_button - > set_icon ( gui_base - > get_icon ( " PlayCustom " , " EditorIcons " ) ) ;
2014-02-10 02:10:30 +01:00
String current_filename ;
String run_filename ;
String args ;
2015-06-22 05:03:19 +02:00
if ( p_current | | ( editor_data . get_edited_scene_root ( ) & & p_custom = = editor_data . get_edited_scene_root ( ) - > get_filename ( ) ) ) {
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( ! scene ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " There is no defined scene to run. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
if ( scene - > get_filename ( ) = = " " ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2015-01-06 23:28:25 +01:00
/**/
_menu_option_confirm ( FILE_SAVE_BEFORE_RUN , false ) ;
2014-02-10 02:10:30 +01:00
return ;
}
if ( run_settings_dialog - > get_run_mode ( ) = = RunSettingsDialog : : RUN_LOCAL_SCENE ) {
run_filename = scene - > get_filename ( ) ;
} else {
current_filename = scene - > get_filename ( ) ;
}
} else if ( p_custom ! = " " ) {
run_filename = p_custom ;
}
if ( run_filename = = " " ) {
//evidently, run the scene
run_filename = GLOBAL_DEF ( " application/main_scene " , " " ) ;
if ( run_filename = = " " ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-06-28 00:59:33 +02:00
pick_main_scene - > set_text ( TTR ( " No main scene has ever been defined, select one? \n You can change it later in later in \" Project Settings \" under the 'application' category. " ) ) ;
pick_main_scene - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
2016-06-27 15:59:37 +02:00
if ( ! FileAccess : : exists ( run_filename ) ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-06-28 08:07:19 +02: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. " ) , run_filename ) ) ;
2016-06-28 00:59:33 +02:00
pick_main_scene - > popup_centered_minsize ( ) ;
2016-06-27 15:59:37 +02:00
return ;
}
if ( ResourceLoader : : get_resource_type ( run_filename ) ! = " PackedScene " ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-06-28 08:07:19 +02: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. " ) , run_filename ) ) ;
2016-06-28 00:59:33 +02:00
pick_main_scene - > popup_centered_minsize ( ) ;
2016-06-27 15:59:37 +02:00
return ;
}
2014-02-10 02:10:30 +01:00
}
if ( bool ( EDITOR_DEF ( " run/auto_save_before_running " , true ) ) ) {
if ( unsaved_cache ) {
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( scene ) { //only autosave if there is a scene obviously
if ( scene - > get_filename ( ) = = " " ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( TTR ( " Current scene was never saved, please save it prior to running. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
2015-05-31 06:59:42 +02:00
//_save_scene(scene->get_filename());
_save_scene_with_preview ( scene - > get_filename ( ) ) ;
2014-02-10 02:10:30 +01:00
}
}
2016-06-26 05:54:17 +02:00
_menu_option ( FILE_SAVE_ALL_SCENES ) ;
2014-02-10 02:10:30 +01:00
editor_data . save_editor_external_data ( ) ;
}
2015-07-30 00:03:25 +02:00
if ( bool ( EDITOR_DEF ( " run/always_clear_output_on_play " , true ) ) ) {
log - > clear ( ) ;
}
2016-12-24 23:39:16 +01:00
if ( bool ( EDITOR_DEF ( " run/always_open_output_on_play " , true ) ) ) {
make_bottom_panel_item_visible ( log ) ;
}
2014-02-10 02:10:30 +01:00
List < String > breakpoints ;
editor_data . get_editor_breakpoints ( & breakpoints ) ;
2016-12-21 15:32:52 +01:00
args = Globals : : get_singleton ( ) - > get ( " editor/main_run_args " ) ;
2014-02-10 02:10:30 +01:00
Error error = editor_run . run ( run_filename , args , breakpoints , current_filename ) ;
if ( error ! = OK ) {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
accept - > set_text ( TTR ( " Could not start subprocess! " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
emit_signal ( " play_pressed " ) ;
if ( p_current ) {
play_scene_button - > set_pressed ( true ) ;
2015-10-28 23:50:11 +01:00
play_scene_button - > set_icon ( gui_base - > get_icon ( " Reload " , " EditorIcons " ) ) ;
2016-02-17 20:51:56 +01:00
} else if ( p_custom ! = " " ) {
run_custom_filename = run_filename ;
play_custom_scene_button - > set_pressed ( true ) ;
play_custom_scene_button - > set_icon ( gui_base - > get_icon ( " Reload " , " EditorIcons " ) ) ;
2014-02-10 02:10:30 +01:00
} else {
play_button - > set_pressed ( true ) ;
2015-10-28 23:50:11 +01:00
play_button - > set_icon ( gui_base - > get_icon ( " Reload " , " EditorIcons " ) ) ;
2014-02-10 02:10:30 +01:00
}
_playing_edited = p_current ;
}
void EditorNode : : _cleanup_scene ( ) {
2015-06-22 05:03:19 +02:00
#if 0
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
editor_selection - > clear ( ) ;
editor_data . clear_editor_states ( ) ;
editor_history . clear ( ) ;
_hide_top_editors ( ) ;
animation_editor - > cleanup ( ) ;
property_editor - > edit ( NULL ) ;
2014-05-08 10:24:52 +02:00
resources_dock - > cleanup ( ) ;
2014-02-10 02:10:30 +01:00
scene_import_metadata . unref ( ) ;
2015-06-22 05:03:19 +02:00
//set_edited_scene(NULL);
2014-02-10 02:10:30 +01:00
if ( scene ) {
if ( scene - > get_filename ( ) ! = " " ) {
previous_scenes . push_back ( scene - > get_filename ( ) ) ;
}
memdelete ( scene ) ;
}
editor_data . get_undo_redo ( ) . clear_history ( ) ;
saved_version = editor_data . get_undo_redo ( ) . get_version ( ) ;
run_settings_dialog - > set_run_mode ( 0 ) ;
run_settings_dialog - > set_custom_arguments ( " -l $scene " ) ;
List < Ref < Resource > > cached ;
ResourceCache : : get_cached_resources ( & cached ) ;
for ( List < Ref < Resource > > : : Element * E = cached . front ( ) ; E ; E = E - > next ( ) ) {
String path = E - > get ( ) - > get_path ( ) ;
if ( path . is_resource_file ( ) ) {
ERR_PRINT ( ( " Stray resource not cleaned: " + path ) . utf8 ( ) . get_data ( ) ) ;
}
}
2016-03-09 00:00:52 +01:00
2014-04-10 04:50:30 +02:00
_update_title ( ) ;
2015-06-22 05:03:19 +02:00
# endif
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _menu_option_confirm ( int p_option , bool p_confirmed ) {
2016-03-09 00:00:52 +01:00
2015-04-27 00:02:32 +02:00
//print_line("option "+itos(p_option)+" confirm "+itos(p_confirmed));
if ( ! p_confirmed ) //this may be a hack..
current_option = ( MenuOptions ) p_option ;
2014-02-10 02:10:30 +01:00
switch ( p_option ) {
case FILE_NEW_SCENE : {
2016-05-19 00:08:12 +02:00
// TODO: Drop such obsolete commented code
2015-06-22 05:03:19 +02:00
/*
2014-02-10 02:10:30 +01:00
if ( ! p_confirmed ) {
2016-05-21 01:18:35 +02:00
confirmation - > get_ok ( ) - > set_text ( " Yes " ) ;
2014-02-10 02:10:30 +01:00
//confirmation->get_cancel()->show();
2016-05-19 00:08:12 +02:00
confirmation - > set_text ( " Start a New Scene? (Current will be lost) " ) ;
2015-04-08 19:02:13 +02:00
confirmation - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
break ;
2015-06-22 05:03:19 +02:00
} */
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
int idx = editor_data . add_edited_scene ( - 1 ) ;
_scene_tab_changed ( idx ) ;
2015-08-30 03:59:25 +02:00
editor_data . clear_editor_states ( ) ;
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
//_cleanup_scene();
2014-02-10 02:10:30 +01:00
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2015-10-10 14:09:09 +02:00
case FILE_NEW_INHERITED_SCENE :
2014-02-10 02:10:30 +01:00
case FILE_OPEN_SCENE : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
//print_tree();
2015-05-31 06:59:42 +02:00
file - > set_mode ( EditorFileDialog : : MODE_OPEN_FILE ) ;
2014-02-10 02:10:30 +01:00
//not for now?
List < String > extensions ;
ResourceLoader : : get_recognized_extensions_for_type ( " PackedScene " , & extensions ) ;
file - > clear_filters ( ) ;
for ( int i = 0 ; i < extensions . size ( ) ; i + + ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
file - > add_filter ( " *. " + extensions [ i ] + " ; " + extensions [ i ] . to_upper ( ) ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
//file->set_current_path(current_path);
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( scene ) {
file - > set_current_path ( scene - > get_filename ( ) ) ;
} ;
2016-05-16 17:23:40 +02:00
file - > set_title ( p_option = = FILE_OPEN_SCENE ? TTR ( " Open Scene " ) : TTR ( " Open Base Scene " ) ) ;
2014-02-10 02:10:30 +01:00
file - > popup_centered_ratio ( ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
case FILE_QUICK_OPEN_SCENE : {
2016-01-08 12:27:34 +01:00
quick_open - > popup ( " PackedScene " , true ) ;
2016-05-04 03:25:37 +02:00
quick_open - > set_title ( TTR ( " Quick Open Scene.. " ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case FILE_QUICK_OPEN_SCRIPT : {
2016-01-08 12:27:34 +01:00
quick_open - > popup ( " Script " , true ) ;
2016-05-04 03:25:37 +02:00
quick_open - > set_title ( TTR ( " Quick Open Script.. " ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
2014-02-21 03:01:44 +01:00
case FILE_RUN_SCRIPT : {
2014-02-10 02:10:30 +01:00
2014-02-21 03:01:44 +01:00
file_script - > popup_centered_ratio ( ) ;
} break ;
2014-02-10 02:10:30 +01:00
case FILE_OPEN_PREV : {
if ( previous_scenes . empty ( ) )
break ;
opening_prev = true ;
open_request ( previous_scenes . back ( ) - > get ( ) ) ;
2015-06-22 05:03:19 +02:00
} break ;
case FILE_CLOSE : {
2016-01-08 16:53:47 +01:00
if ( ! p_confirmed & & unsaved_cache ) {
2016-05-04 03:25:37 +02:00
confirmation - > get_ok ( ) - > set_text ( TTR ( " Yes " ) ) ;
2015-06-22 05:03:19 +02:00
//confirmation->get_cancel()->show();
2016-05-04 03:25:37 +02:00
confirmation - > set_text ( TTR ( " Close scene? (Unsaved changes will be lost) " ) ) ;
2015-06-22 05:03:19 +02:00
confirmation - > popup_centered_minsize ( ) ;
break ;
}
_remove_edited_scene ( ) ;
2015-11-19 14:15:17 +01:00
} break ;
case SCENE_TAB_CLOSE : {
_remove_scene ( tab_closing ) ;
_update_scene_tabs ( ) ;
current_option = - 1 ;
2014-02-10 02:10:30 +01:00
} break ;
case FILE_SAVE_SCENE : {
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( scene & & scene - > get_filename ( ) ! = " " ) {
2016-03-26 21:31:23 +01:00
// save in background if in the script editor
if ( _get_current_main_editor ( ) = = EDITOR_SCRIPT ) {
_save_scene ( scene - > get_filename ( ) ) ;
} else {
_save_scene_with_preview ( scene - > get_filename ( ) ) ;
}
2014-02-10 02:10:30 +01:00
return ;
} ;
// fallthrough to save_as
2015-12-04 16:51:36 +01:00
} ;
2014-02-10 02:10:30 +01:00
case FILE_SAVE_AS_SCENE : {
2016-03-09 00:00:52 +01:00
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
if ( ! scene ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a tree root. " ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2016-03-09 00:00:52 +01:00
break ;
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2015-05-31 06:59:42 +02:00
file - > set_mode ( EditorFileDialog : : MODE_SAVE_FILE ) ;
2014-02-10 02:10:30 +01:00
List < String > extensions ;
Ref < PackedScene > sd = memnew ( PackedScene ) ;
ResourceSaver : : get_recognized_extensions ( sd , & extensions ) ;
file - > clear_filters ( ) ;
for ( int i = 0 ; i < extensions . size ( ) ; i + + ) {
file - > add_filter ( " *. " + extensions [ i ] + " ; " + extensions [ i ] . to_upper ( ) ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
//file->set_current_path(current_path);
if ( scene - > get_filename ( ) ! = " " ) {
file - > set_current_path ( scene - > get_filename ( ) ) ;
if ( extensions . size ( ) ) {
String ext = scene - > get_filename ( ) . extension ( ) . to_lower ( ) ;
if ( extensions . find ( ext ) = = NULL ) {
file - > set_current_path ( scene - > get_filename ( ) . replacen ( " . " + ext , " . " + extensions . front ( ) - > get ( ) ) ) ;
}
}
} else {
String existing ;
if ( extensions . size ( ) ) {
2016-05-23 15:27:58 +02:00
String root_name ( get_edited_scene ( ) - > get_name ( ) ) ;
2016-06-26 11:10:22 +02:00
existing = root_name + " . " + extensions . front ( ) - > get ( ) . to_lower ( ) ;
2014-02-10 02:10:30 +01:00
}
file - > set_current_path ( existing ) ;
}
file - > popup_centered_ratio ( ) ;
2016-05-04 03:25:37 +02:00
file - > set_title ( TTR ( " Save Scene As.. " ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2016-06-26 05:54:17 +02:00
case FILE_SAVE_ALL_SCENES : {
for ( int i = 0 ; i < editor_data . get_edited_scene_count ( ) ; i + + ) {
Node * scene = editor_data . get_edited_scene_root ( i ) ;
if ( scene & & scene - > get_filename ( ) ! = " " ) {
// save in background if in the script editor
if ( i ! = editor_data . get_edited_scene ( ) | | _get_current_main_editor ( ) = = EDITOR_SCRIPT ) {
_save_scene ( scene - > get_filename ( ) , i ) ;
} else {
_save_scene_with_preview ( scene - > get_filename ( ) ) ;
}
} // else: ignore new scenes
}
} break ;
2015-01-06 23:28:25 +01:00
case FILE_SAVE_BEFORE_RUN : {
if ( ! p_confirmed ) {
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " Yes " ) ) ;
accept - > set_text ( TTR ( " This scene has never been saved. Save before running? " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2015-01-06 23:28:25 +01:00
break ;
}
_menu_option ( FILE_SAVE_AS_SCENE ) ;
_menu_option_confirm ( FILE_SAVE_AND_RUN , true ) ;
} break ;
2014-02-10 02:10:30 +01:00
case FILE_DUMP_STRINGS : {
2015-06-22 05:03:19 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( ! scene ) {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a tree root. " ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
break ;
}
String cpath ;
if ( scene - > get_filename ( ) ! = " " ) {
cpath = scene - > get_filename ( ) ;
String fn = cpath . substr ( 0 , cpath . length ( ) - cpath . extension ( ) . size ( ) ) ;
String ext = cpath . extension ( ) ;
cpath = fn + " .pot " ;
} else {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
accept - > set_text ( TTR ( " Please save the scene first. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
break ;
}
2015-05-31 06:59:42 +02:00
file - > set_mode ( EditorFileDialog : : MODE_SAVE_FILE ) ;
2014-04-23 03:28:23 +02:00
2014-02-10 02:10:30 +01:00
file - > set_current_path ( cpath ) ;
2016-05-04 03:25:37 +02:00
file - > set_title ( TTR ( " Save Translatable Strings " ) ) ;
2014-02-10 02:10:30 +01:00
file - > popup_centered_ratio ( ) ;
} break ;
case FILE_SAVE_OPTIMIZED : {
#if 0
2016-07-06 19:04:21 +02:00
Node * scene = editor_data . get_edited_scene_root ( ) ;
2014-02-10 02:10:30 +01:00
if ( ! scene ) {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-21 01:18:35 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a tree root. " ) ;
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
break ;
}
//file->set_current_path(current_path);
String cpath ;
if ( scene - > get_filename ( ) ! = " " ) {
cpath = scene - > get_filename ( ) ;
String fn = cpath . substr ( 0 , cpath . length ( ) - cpath . extension ( ) . size ( ) ) ;
String ext = cpath . extension ( ) ;
cpath = fn + " .optimized.scn " ;
optimized_save - > set_optimized_scene ( cpath ) ;
optimized_save - > popup_centered ( Size2 ( 500 , 143 ) ) ;
} else {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-21 01:18:35 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
accept - > set_text ( " Please save the scene first. " ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
break ;
}
# endif
} break ;
case FILE_EXPORT_PROJECT : {
2016-01-27 11:23:12 +01:00
project_export_settings - > popup_export ( ) ;
2014-02-10 02:10:30 +01:00
/*
String target = export_db - > get_current_platform ( ) ;
Ref < EditorExporter > exporter = export_db - > get_exporter ( target ) ;
if ( exporter . is_null ( ) ) {
2016-05-19 00:08:12 +02:00
accept - > set_text ( " No exporter for platform ' " + target + " ' yet. " ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ;
}
String extension = exporter - > get_binary_extension ( ) ;
print_line ( " for target: " + target + " extension: " + extension ) ;
file_export_password - > set_editable ( exporter - > requieres_password ( file_export_check - > is_pressed ( ) ) ) ;
file_export - > clear_filters ( ) ;
if ( extension ! = " " ) {
file_export - > add_filter ( " *. " + extension ) ;
}
file_export - > popup_centered_ratio ( ) ; */
} break ;
case FILE_EXPORT_MESH_LIBRARY : {
2015-06-22 05:03:19 +02:00
if ( ! editor_data . get_edited_scene_root ( ) ) {
2014-02-10 02:10:30 +01:00
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a scene. " ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
break ;
}
List < String > extensions ;
Ref < MeshLibrary > ml ( memnew ( MeshLibrary ) ) ;
ResourceSaver : : get_recognized_extensions ( ml , & extensions ) ;
file_export_lib - > clear_filters ( ) ;
for ( List < String > : : Element * E = extensions . front ( ) ; E ; E = E - > next ( ) ) {
file_export_lib - > add_filter ( " *. " + E - > get ( ) ) ;
}
file_export_lib - > popup_centered_ratio ( ) ;
2016-05-04 03:25:37 +02:00
file_export_lib - > set_title ( TTR ( " Export Mesh Library " ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case FILE_EXPORT_TILESET : {
List < String > extensions ;
Ref < TileSet > ml ( memnew ( TileSet ) ) ;
ResourceSaver : : get_recognized_extensions ( ml , & extensions ) ;
file_export_lib - > clear_filters ( ) ;
for ( List < String > : : Element * E = extensions . front ( ) ; E ; E = E - > next ( ) ) {
file_export_lib - > add_filter ( " *. " + E - > get ( ) ) ;
}
file_export_lib - > popup_centered_ratio ( ) ;
2016-05-04 03:25:37 +02:00
file_export_lib - > set_title ( TTR ( " Export Tile Set " ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case SETTINGS_EXPORT_PREFERENCES : {
//project_export_settings->popup_centered_ratio();
} break ;
case FILE_IMPORT_SUBSCENE : {
//import_subscene->popup_centered_ratio();
2015-06-22 05:03:19 +02:00
if ( ! editor_data . get_edited_scene_root ( ) ) {
2014-02-10 02:10:30 +01:00
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " I see.. " ) ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a selected node. " ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
break ;
}
scene_tree_dock - > import_subscene ( ) ;
} break ;
case FILE_QUIT : {
2016-03-09 00:00:52 +01:00
2015-04-27 00:02:32 +02:00
2014-02-10 02:10:30 +01:00
if ( ! p_confirmed ) {
2015-04-27 00:02:32 +02:00
2016-05-04 03:25:37 +02:00
confirmation - > get_ok ( ) - > set_text ( TTR ( " Quit " ) ) ;
2014-02-10 02:10:30 +01:00
//confirmation->get_cancel()->show();
2016-05-19 00:08:12 +02:00
confirmation - > set_text ( TTR ( " Exit the editor? " ) ) ;
2016-05-30 05:28:29 +02:00
confirmation - > popup_centered ( Size2 ( 180 , 70 ) * EDSCALE ) ;
2014-02-10 02:10:30 +01:00
break ;
}
2014-04-24 04:06:12 +02:00
2015-04-27 00:02:32 +02:00
2014-04-24 04:06:12 +02:00
_menu_option_confirm ( RUN_STOP , true ) ;
2016-06-08 03:08:12 +02:00
exiting = true ;
2014-11-06 01:20:42 +01:00
get_tree ( ) - > quit ( ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
case FILE_EXTERNAL_OPEN_SCENE : {
if ( unsaved_cache & & ! p_confirmed ) {
2016-05-04 03:25:37 +02:00
confirmation - > get_ok ( ) - > set_text ( TTR ( " Open " ) ) ;
2014-02-10 02:10:30 +01:00
//confirmation->get_cancel()->show();
2016-05-04 03:25:37 +02:00
confirmation - > set_text ( TTR ( " Current scene not saved. Open anyway? " ) ) ;
2015-04-08 19:02:13 +02:00
confirmation - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
break ;
}
bool oprev = opening_prev ;
Error err = load_scene ( external_file ) ;
if ( err = = OK & & oprev ) {
previous_scenes . pop_back ( ) ;
opening_prev = false ;
}
} break ;
case EDIT_UNDO : {
if ( OS : : get_singleton ( ) - > get_mouse_button_state ( ) )
break ; // can't undo while mouse buttons are pressed
String action = editor_data . get_undo_redo ( ) . get_current_action_name ( ) ;
if ( action ! = " " )
log - > add_message ( " UNDO: " + action ) ;
editor_data . get_undo_redo ( ) . undo ( ) ;
} break ;
case EDIT_REDO : {
if ( OS : : get_singleton ( ) - > get_mouse_button_state ( ) )
break ; // can't redo while mouse buttons are pressed
editor_data . get_undo_redo ( ) . redo ( ) ;
String action = editor_data . get_undo_redo ( ) . get_current_action_name ( ) ;
if ( action ! = " " )
log - > add_message ( " REDO: " + action ) ;
} break ;
2015-11-29 05:08:31 +01:00
case TOOLS_ORPHAN_RESOURCES : {
orphan_resources - > show ( ) ;
} break ;
2015-01-25 01:14:06 +01:00
case EDIT_REVERT : {
Node * scene = get_edited_scene ( ) ;
if ( ! scene )
break ;
2016-01-23 22:28:30 +01:00
String filename = scene - > get_filename ( ) ;
if ( filename = = String ( ) ) {
2016-05-19 00:08:12 +02:00
show_warning ( TTR ( " Can't reload a scene that was never saved. " ) ) ;
2016-01-23 22:28:30 +01:00
break ;
}
2015-01-27 01:00:07 +01:00
if ( unsaved_cache & & ! p_confirmed ) {
2016-05-04 03:25:37 +02:00
confirmation - > get_ok ( ) - > set_text ( TTR ( " Revert " ) ) ;
confirmation - > set_text ( TTR ( " This action cannot be undone. Revert anyway? " ) ) ;
2015-04-08 19:02:13 +02:00
confirmation - > popup_centered_minsize ( ) ;
2015-01-27 01:00:07 +01:00
break ;
}
2015-01-25 01:14:06 +01:00
2016-01-23 22:28:30 +01:00
int cur_idx = editor_data . get_edited_scene ( ) ;
_remove_edited_scene ( ) ;
Error err = load_scene ( filename ) ;
editor_data . move_edited_scene_to_index ( cur_idx ) ;
get_undo_redo ( ) - > clear_history ( ) ;
scene_tabs - > set_current_tab ( cur_idx ) ;
2015-01-25 01:14:06 +01:00
} break ;
2014-02-10 02:10:30 +01:00
#if 0
case NODE_EXTERNAL_INSTANCE : {
if ( ! edited_scene ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a selected node. " ) ;
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
break ;
}
Node * parent = scene_tree_editor - > get_selected ( ) ;
if ( ! parent ) {
current_option = - 1 ;
//confirmation->get_cancel()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
2014-02-10 02:10:30 +01:00
accept - > set_text ( " This operation can't be done without a selected node. " ) ;
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
break ;
}
Node * instanced_scene = SceneLoader : : load ( external_file , true ) ;
if ( ! instanced_scene ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " Ugh " ) ;
accept - > set_text ( " Error loading scene from " + external_file ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ;
}
instanced_scene - > generate_instance_state ( ) ;
instanced_scene - > set_filename ( Globals : : get_singleton ( ) - > localize_path ( external_file ) ) ;
2016-05-19 00:08:12 +02:00
editor_data . get_undo_redo ( ) . create_action ( " Instance Scene " ) ;
2014-02-10 02:10:30 +01:00
editor_data . get_undo_redo ( ) . add_do_method ( parent , " add_child " , instanced_scene ) ;
editor_data . get_undo_redo ( ) . add_do_method ( instanced_scene , " set_owner " , edited_scene ) ;
editor_data . get_undo_redo ( ) . add_do_reference ( instanced_scene ) ;
editor_data . get_undo_redo ( ) . add_undo_method ( parent , " remove_child " , instanced_scene ) ;
editor_data . get_undo_redo ( ) . commit_action ( ) ;
// parent->add_child(instanced_scene);
// instanced_scene->set_owner(edited_scene);
_last_instanced_scene = instanced_scene ;
} break ;
# endif
2015-09-01 05:49:47 +02:00
case RESOURCE_NEW : {
2016-07-10 13:19:15 +02:00
create_dialog - > popup ( true ) ;
2015-09-01 05:49:47 +02:00
} break ;
case RESOURCE_LOAD : {
open_resource ( ) ;
} break ;
case RESOURCE_SAVE : {
uint32_t current = editor_history . get_current ( ) ;
Object * current_obj = current > 0 ? ObjectDB : : get_instance ( current ) : NULL ;
ERR_FAIL_COND ( ! current_obj - > cast_to < Resource > ( ) )
RES current_res = RES ( current_obj - > cast_to < Resource > ( ) ) ;
save_resource ( current_res ) ;
} break ;
case RESOURCE_SAVE_AS : {
uint32_t current = editor_history . get_current ( ) ;
Object * current_obj = current > 0 ? ObjectDB : : get_instance ( current ) : NULL ;
ERR_FAIL_COND ( ! current_obj - > cast_to < Resource > ( ) )
RES current_res = RES ( current_obj - > cast_to < Resource > ( ) ) ;
save_resource_as ( current_res ) ;
} break ;
case RESOURCE_UNREF : {
uint32_t current = editor_history . get_current ( ) ;
Object * current_obj = current > 0 ? ObjectDB : : get_instance ( current ) : NULL ;
ERR_FAIL_COND ( ! current_obj - > cast_to < Resource > ( ) )
RES current_res = RES ( current_obj - > cast_to < Resource > ( ) ) ;
current_res - > set_path ( " " ) ;
_edit_current ( ) ;
} break ;
case RESOURCE_COPY : {
uint32_t current = editor_history . get_current ( ) ;
Object * current_obj = current > 0 ? ObjectDB : : get_instance ( current ) : NULL ;
ERR_FAIL_COND ( ! current_obj - > cast_to < Resource > ( ) )
RES current_res = RES ( current_obj - > cast_to < Resource > ( ) ) ;
EditorSettings : : get_singleton ( ) - > set_resource_clipboard ( current_res ) ;
} break ;
case RESOURCE_PASTE : {
RES r = EditorSettings : : get_singleton ( ) - > get_resource_clipboard ( ) ;
if ( r . is_valid ( ) ) {
push_item ( EditorSettings : : get_singleton ( ) - > get_resource_clipboard ( ) . ptr ( ) , String ( ) ) ;
}
} break ;
2014-02-10 02:10:30 +01:00
case OBJECT_REQUEST_HELP : {
if ( current ) {
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_SCRIPT ) ;
2014-02-10 02:10:30 +01:00
emit_signal ( " request_help " , current - > get_type ( ) ) ;
}
} break ;
case OBJECT_COPY_PARAMS : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
editor_data . apply_changes_in_editors ( ) ; ;
if ( current )
editor_data . copy_object_params ( current ) ;
} break ;
case OBJECT_PASTE_PARAMS : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
editor_data . apply_changes_in_editors ( ) ; ;
if ( current )
editor_data . paste_object_params ( current ) ;
editor_data . get_undo_redo ( ) . clear_history ( ) ;
} break ;
2014-11-02 15:31:01 +01:00
case OBJECT_UNIQUE_RESOURCES : {
editor_data . apply_changes_in_editors ( ) ; ;
if ( current ) {
List < PropertyInfo > props ;
current - > get_property_list ( & props ) ;
Map < RES , RES > duplicates ;
for ( List < PropertyInfo > : : Element * E = props . front ( ) ; E ; E = E - > next ( ) ) {
if ( ! ( E - > get ( ) . usage & PROPERTY_USAGE_STORAGE ) )
continue ;
Variant v = current - > get ( E - > get ( ) . name ) ;
if ( v . is_ref ( ) ) {
REF ref = v ;
if ( ref . is_valid ( ) ) {
RES res = ref ;
if ( res . is_valid ( ) ) {
if ( ! duplicates . has ( res ) ) {
duplicates [ res ] = res - > duplicate ( ) ;
}
res = duplicates [ res ] ;
current - > set ( E - > get ( ) . name , res ) ;
}
}
}
}
}
editor_data . get_undo_redo ( ) . clear_history ( ) ;
2016-03-30 01:02:53 +02:00
_set_editing_top_editors ( NULL ) ;
_set_editing_top_editors ( current ) ;
2014-11-02 15:31:01 +01:00
} break ;
2014-02-10 02:10:30 +01:00
case OBJECT_CALL_METHOD : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
editor_data . apply_changes_in_editors ( ) ; ;
call_dialog - > set_object ( current ) ;
call_dialog - > popup_centered_ratio ( ) ;
} break ;
case RUN_PLAY : {
2015-10-28 23:50:11 +01:00
_menu_option_confirm ( RUN_STOP , true ) ;
2014-02-10 02:10:30 +01:00
_run ( false ) ;
} break ;
case RUN_PLAY_CUSTOM_SCENE : {
2016-02-17 20:51:56 +01:00
if ( run_custom_filename . empty ( ) | | editor_run . get_status ( ) = = EditorRun : : STATUS_STOP ) {
_menu_option_confirm ( RUN_STOP , true ) ;
quick_run - > popup ( " PackedScene " , true ) ;
2016-05-04 03:25:37 +02:00
quick_run - > set_title ( TTR ( " Quick Run Scene.. " ) ) ;
2016-02-18 13:16:31 +01:00
play_custom_scene_button - > set_pressed ( false ) ;
2016-02-17 20:51:56 +01:00
} else {
String last_custom_scene = run_custom_filename ;
_menu_option_confirm ( RUN_STOP , true ) ;
_run ( false , last_custom_scene ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
case RUN_STOP : {
if ( editor_run . get_status ( ) = = EditorRun : : STATUS_STOP )
break ;
editor_run . stop ( ) ;
2016-02-17 20:51:56 +01:00
run_custom_filename . clear ( ) ;
2014-02-10 02:10:30 +01:00
play_button - > set_pressed ( false ) ;
2015-12-08 19:33:50 +01:00
play_button - > set_icon ( gui_base - > get_icon ( " MainPlay " , " EditorIcons " ) ) ;
2014-02-10 02:10:30 +01:00
play_scene_button - > set_pressed ( false ) ;
2015-10-28 23:50:11 +01:00
play_scene_button - > set_icon ( gui_base - > get_icon ( " PlayScene " , " EditorIcons " ) ) ;
2016-02-17 20:51:56 +01:00
play_custom_scene_button - > set_pressed ( false ) ;
play_custom_scene_button - > set_icon ( gui_base - > get_icon ( " PlayCustom " , " EditorIcons " ) ) ;
2015-04-21 00:38:02 +02:00
//pause_button->set_pressed(false);
2014-02-10 02:10:30 +01:00
emit_signal ( " stop_pressed " ) ;
} break ;
case RUN_PLAY_SCENE : {
2015-10-28 23:50:11 +01:00
_menu_option_confirm ( RUN_STOP , true ) ;
2014-02-10 02:10:30 +01:00
_run ( true ) ;
2015-08-06 07:37:40 +02:00
} break ;
case RUN_PLAY_NATIVE : {
2016-10-01 16:15:07 +02:00
2016-06-24 14:20:43 +02:00
bool autosave = EDITOR_DEF ( " run/auto_save_before_running " , true ) ;
if ( autosave ) {
2016-07-10 19:37:48 +02:00
_menu_option_confirm ( FILE_SAVE_ALL_SCENES , false ) ;
2016-06-24 14:20:43 +02:00
}
if ( run_native - > is_deploy_debug_remote_enabled ( ) ) {
_menu_option_confirm ( RUN_STOP , true ) ;
emit_signal ( " play_pressed " ) ;
editor_run . run_native_notify ( ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
case RUN_SCENE_SETTINGS : {
run_settings_dialog - > popup_run_settings ( ) ;
} break ;
case RUN_SETTINGS : {
project_settings - > popup_project_settings ( ) ;
} break ;
2014-02-18 05:21:06 +01:00
case RUN_PROJECT_MANAGER : {
if ( ! p_confirmed ) {
2016-05-04 03:25:37 +02:00
confirmation - > get_ok ( ) - > set_text ( TTR ( " Yes " ) ) ;
2016-05-30 20:47:53 +02:00
confirmation - > set_text ( TTR ( " Open Project Manager? \n (Unsaved changes will be lost) " ) ) ;
2015-04-08 19:02:13 +02:00
confirmation - > popup_centered_minsize ( ) ;
2014-02-18 05:21:06 +01:00
break ;
}
2016-04-17 23:12:22 +02:00
_menu_option_confirm ( RUN_STOP , true ) ;
2016-06-08 03:08:12 +02:00
exiting = true ;
2014-11-06 01:20:42 +01:00
get_tree ( ) - > quit ( ) ;
2014-02-18 05:21:06 +01:00
String exec = OS : : get_singleton ( ) - > get_executable_path ( ) ;
List < String > args ;
2016-05-28 14:59:00 +02:00
args . push_back ( " -path " ) ;
args . push_back ( exec . get_base_dir ( ) ) ;
2016-02-25 07:02:09 +01:00
args . push_back ( " -pm " ) ;
2014-02-18 05:21:06 +01:00
OS : : ProcessID pid = 0 ;
Error err = OS : : get_singleton ( ) - > execute ( exec , args , false , & pid ) ;
ERR_FAIL_COND ( err ) ;
} break ;
2014-02-10 02:10:30 +01:00
case RUN_FILE_SERVER : {
//file_server
2015-08-06 07:37:40 +02:00
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_FILE_SERVER ) ) ;
2014-02-10 02:10:30 +01:00
if ( ischecked ) {
file_server - > stop ( ) ;
2016-06-03 17:34:11 +02:00
run_native - > set_deploy_dumb ( false ) ;
2015-08-06 07:37:40 +02:00
//debug_button->set_icon(gui_base->get_icon("FileServer","EditorIcons"));
2016-05-21 01:18:35 +02:00
//debug_button->get_popup()->set_item_text( debug_button->get_popup()->get_item_index(RUN_FILE_SERVER),"Enable File Server");
2014-02-10 02:10:30 +01:00
} else {
file_server - > start ( ) ;
2016-06-03 17:34:11 +02:00
run_native - > set_deploy_dumb ( true ) ;
2015-08-06 07:37:40 +02:00
//debug_button->set_icon(gui_base->get_icon("FileServerActive","EditorIcons"));
2016-05-21 01:18:35 +02:00
//debug_button->get_popup()->set_item_text( debug_button->get_popup()->get_item_index(RUN_FILE_SERVER),"Disable File Server");
2014-02-10 02:10:30 +01:00
}
2015-08-06 07:37:40 +02:00
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_FILE_SERVER ) , ! ischecked ) ;
2014-02-10 02:10:30 +01:00
} break ;
2015-08-02 17:29:37 +02:00
case RUN_LIVE_DEBUG : {
2015-08-06 07:37:40 +02:00
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_LIVE_DEBUG ) ) ;
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_LIVE_DEBUG ) , ! ischecked ) ;
ScriptEditor : : get_singleton ( ) - > get_debugger ( ) - > set_live_debugging ( ! ischecked ) ;
2015-08-02 17:29:37 +02:00
} break ;
2016-06-03 17:34:11 +02:00
/*case RUN_DEPLOY_DUMB_CLIENTS: {
2014-02-10 02:10:30 +01:00
2015-08-06 07:37:40 +02:00
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEPLOY_DUMB_CLIENTS ) ) ;
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEPLOY_DUMB_CLIENTS ) , ! ischecked ) ;
2014-05-29 15:56:39 +02:00
run_native - > set_deploy_dumb ( ! ischecked ) ;
2014-02-10 02:10:30 +01:00
2016-06-03 17:34:11 +02:00
} break ; */
2015-08-06 07:37:40 +02:00
case RUN_DEPLOY_REMOTE_DEBUG : {
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEPLOY_REMOTE_DEBUG ) ) ;
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEPLOY_REMOTE_DEBUG ) , ! ischecked ) ;
run_native - > set_deploy_debug_remote ( ! ischecked ) ;
2014-02-10 02:10:30 +01:00
} break ;
2015-09-20 18:03:46 +02:00
case RUN_DEBUG_COLLISONS : {
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEBUG_COLLISONS ) ) ;
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEBUG_COLLISONS ) , ! ischecked ) ;
run_native - > set_debug_collisions ( ! ischecked ) ;
editor_run . set_debug_collisions ( ! ischecked ) ;
} break ;
case RUN_DEBUG_NAVIGATION : {
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEBUG_NAVIGATION ) ) ;
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_DEBUG_NAVIGATION ) , ! ischecked ) ;
run_native - > set_debug_navigation ( ! ischecked ) ;
editor_run . set_debug_navigation ( ! ischecked ) ;
} break ;
2016-06-02 01:22:02 +02:00
case RUN_RELOAD_SCRIPTS : {
2016-06-03 17:34:11 +02:00
bool ischecked = debug_button - > get_popup ( ) - > is_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_RELOAD_SCRIPTS ) ) ;
debug_button - > get_popup ( ) - > set_item_checked ( debug_button - > get_popup ( ) - > get_item_index ( RUN_RELOAD_SCRIPTS ) , ! ischecked ) ;
ScriptEditor : : get_singleton ( ) - > set_live_auto_reload_running_scripts ( ! ischecked ) ;
2016-06-02 01:22:02 +02:00
} break ;
2014-02-10 02:10:30 +01:00
case SETTINGS_UPDATE_ALWAYS : {
update_menu - > get_popup ( ) - > set_item_checked ( 0 , true ) ;
update_menu - > get_popup ( ) - > set_item_checked ( 1 , false ) ;
OS : : get_singleton ( ) - > set_low_processor_usage_mode ( false ) ;
} break ;
case SETTINGS_UPDATE_CHANGES : {
update_menu - > get_popup ( ) - > set_item_checked ( 0 , false ) ;
update_menu - > get_popup ( ) - > set_item_checked ( 1 , true ) ;
OS : : get_singleton ( ) - > set_low_processor_usage_mode ( true ) ;
} break ;
2016-10-01 16:15:07 +02:00
case SETTINGS_UPDATE_SPINNER_HIDE : {
update_menu - > set_icon ( gui_base - > get_icon ( " Collapse " , " EditorIcons " ) ) ;
update_menu - > get_popup ( ) - > toggle_item_checked ( 3 ) ;
} break ;
2014-02-10 02:10:30 +01:00
case SETTINGS_PREFERENCES : {
settings_config_dialog - > popup_edit_settings ( ) ;
} break ;
case SETTINGS_OPTIMIZED_PRESETS : {
//optimized_presets->popup_centered_ratio();
} break ;
case SETTINGS_LOAD_EXPORT_TEMPLATES : {
file_templates - > popup_centered_ratio ( ) ;
2016-06-28 00:59:33 +02:00
} break ;
case SETTINGS_PICK_MAIN_SCENE : {
//print_tree();
file - > set_mode ( EditorFileDialog : : MODE_OPEN_FILE ) ;
//not for now?
List < String > extensions ;
ResourceLoader : : get_recognized_extensions_for_type ( " PackedScene " , & extensions ) ;
file - > clear_filters ( ) ;
for ( int i = 0 ; i < extensions . size ( ) ; i + + ) {
file - > add_filter ( " *. " + extensions [ i ] + " ; " + extensions [ i ] . to_upper ( ) ) ;
}
//file->set_current_path(current_path);
Node * scene = editor_data . get_edited_scene_root ( ) ;
if ( scene ) {
file - > set_current_path ( scene - > get_filename ( ) ) ;
} ;
2016-06-28 12:00:18 +02:00
file - > set_title ( TTR ( " Pick a Main Scene " ) ) ;
2016-06-28 00:59:33 +02:00
file - > popup_centered_ratio ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case SETTINGS_ABOUT : {
2016-07-27 18:11:55 +02:00
about - > popup_centered_minsize ( Size2 ( 500 , 130 ) * EDSCALE ) ;
2014-02-10 02:10:30 +01:00
} break ;
case SOURCES_REIMPORT : {
reimport_dialog - > popup_reimport ( ) ;
} break ;
2014-05-05 03:50:23 +02:00
case DEPENDENCY_LOAD_CHANGED_IMAGES : {
2014-02-10 02:10:30 +01:00
List < Ref < Resource > > cached ;
ResourceCache : : get_cached_resources ( & cached ) ;
2016-06-27 18:17:20 +02:00
//this should probably be done in a thread..
2014-02-10 02:10:30 +01:00
for ( List < Ref < Resource > > : : Element * E = cached . front ( ) ; E ; E = E - > next ( ) ) {
2016-06-27 18:17:20 +02:00
if ( ! E - > get ( ) - > editor_can_reload_from_file ( ) )
continue ;
if ( ! E - > get ( ) - > get_path ( ) . is_resource_file ( ) & & ! E - > get ( ) - > get_path ( ) . is_abs_path ( ) )
2014-02-10 02:10:30 +01:00
continue ;
2014-06-30 07:23:17 +02:00
if ( ! FileAccess : : exists ( E - > get ( ) - > get_path ( ) ) )
continue ;
2014-02-10 02:10:30 +01:00
uint64_t mt = FileAccess : : get_modified_time ( E - > get ( ) - > get_path ( ) ) ;
if ( mt ! = E - > get ( ) - > get_last_modified_time ( ) ) {
E - > get ( ) - > reload_from_file ( ) ;
}
2016-07-03 18:15:15 +02:00
2014-02-10 02:10:30 +01:00
}
} break ;
case DEPENDENCY_UPDATE_IMPORTED : {
/*
bool editing_changed = _find_editing_changed_scene ( get_edited_scene ( ) ) ;
import_reload_fn = " " ;
if ( editing_changed ) {
if ( unsaved_cache & & ! bool ( EDITOR_DEF ( " import/ask_save_before_reimport " , false ) ) ) {
if ( ! p_confirmed ) {
2016-05-19 00:08:12 +02:00
confirmation - > get_ok ( ) - > set_text ( " Open " ) ;
2014-02-10 02:10:30 +01:00
//confirmation->get_cancel()->show();
2016-05-19 00:08:12 +02:00
confirmation - > set_text ( " Current scene changed, save and re-import ? " ) ;
2014-02-10 02:10:30 +01:00
confirmation - > popup_centered ( Size2 ( 300 , 70 ) ) ;
break ;
}
}
Node * scene = get_edited_scene ( ) ;
if ( scene - > get_filename ( ) = = " " ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
accept - > set_text ( " Can't import if edited scene was not saved. " ) ; //i dont think this code will ever run
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
break ;
}
import_reload_fn = scene - > get_filename ( ) ;
_save_scene ( import_reload_fn ) ;
_cleanup_scene ( ) ;
}
*/
} break ;
2016-05-27 19:18:40 +02:00
2014-02-10 02:10:30 +01:00
default : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
if ( p_option > = OBJECT_METHOD_BASE ) {
ERR_FAIL_COND ( ! current ) ;
int idx = p_option - OBJECT_METHOD_BASE ;
List < MethodInfo > methods ;
current - > get_method_list ( & methods ) ;
ERR_FAIL_INDEX ( idx , methods . size ( ) ) ;
String name = methods [ idx ] . name ;
if ( current )
current - > call ( name ) ;
} else if ( p_option > = IMPORT_PLUGIN_BASE ) {
Ref < EditorImportPlugin > p = editor_import_export - > get_import_plugin ( p_option - IMPORT_PLUGIN_BASE ) ;
if ( p . is_valid ( ) ) {
p - > import_dialog ( ) ;
}
}
}
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
Control * EditorNode : : get_viewport ( ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
return viewport ;
}
void EditorNode : : _editor_select ( int p_which ) {
static bool selecting = false ;
2015-11-17 13:46:08 +01:00
if ( selecting | | changing_scene )
2014-02-10 02:10:30 +01:00
return ;
selecting = true ;
ERR_FAIL_INDEX ( p_which , editor_table . size ( ) ) ;
2015-11-18 08:47:41 +01:00
for ( int i = 0 ; i < main_editor_buttons . size ( ) ; i + + ) {
main_editor_buttons [ i ] - > set_pressed ( i = = p_which ) ;
}
2014-02-10 02:10:30 +01:00
selecting = false ;
EditorPlugin * new_editor = editor_table [ p_which ] ;
ERR_FAIL_COND ( ! new_editor ) ;
if ( editor_plugin_screen = = new_editor )
return ;
if ( editor_plugin_screen ) {
editor_plugin_screen - > make_visible ( false ) ;
}
editor_plugin_screen = new_editor ;
editor_plugin_screen - > make_visible ( true ) ;
editor_plugin_screen - > selected_notify ( ) ;
2015-11-18 08:47:41 +01:00
2014-02-10 02:10:30 +01:00
}
void EditorNode : : add_editor_plugin ( EditorPlugin * p_editor ) {
if ( p_editor - > has_main_screen ( ) ) {
2016-03-09 00:00:52 +01:00
2015-11-18 08:47:41 +01:00
ToolButton * tb = memnew ( ToolButton ) ;
tb - > set_toggle_mode ( true ) ;
tb - > connect ( " pressed " , singleton , " _editor_select " , varray ( singleton - > main_editor_buttons . size ( ) ) ) ;
tb - > set_text ( p_editor - > get_name ( ) ) ;
singleton - > main_editor_buttons . push_back ( tb ) ;
singleton - > main_editor_button_vb - > add_child ( tb ) ;
2014-02-10 02:10:30 +01:00
singleton - > editor_table . push_back ( p_editor ) ;
}
singleton - > editor_data . add_editor_plugin ( p_editor ) ;
singleton - > add_child ( p_editor ) ;
}
void EditorNode : : remove_editor_plugin ( EditorPlugin * p_editor ) {
if ( p_editor - > has_main_screen ( ) ) {
2015-11-18 08:47:41 +01:00
for ( int i = 0 ; i < singleton - > main_editor_buttons . size ( ) ; i + + ) {
2016-09-16 20:02:01 +02:00
if ( p_editor - > get_name ( ) = = singleton - > main_editor_buttons [ i ] - > get_text ( ) ) {
2014-02-10 02:10:30 +01:00
2016-09-22 00:17:55 +02:00
if ( singleton - > main_editor_buttons [ i ] - > is_pressed ( ) ) {
singleton - > _editor_select ( EDITOR_SCRIPT ) ;
}
2015-11-18 08:47:41 +01:00
memdelete ( singleton - > main_editor_buttons [ i ] ) ;
singleton - > main_editor_buttons . remove ( i ) ;
2014-02-10 02:10:30 +01:00
break ;
}
}
2015-11-18 08:47:41 +01:00
//singleton->main_editor_tabs->add_tab(p_editor->get_name());
2014-02-10 02:10:30 +01:00
singleton - > editor_table . erase ( p_editor ) ;
}
2016-06-19 00:29:16 +02:00
p_editor - > make_visible ( false ) ;
p_editor - > clear ( ) ;
singleton - > editor_plugins_over - > get_plugins_list ( ) . erase ( p_editor ) ;
2014-02-10 02:10:30 +01:00
singleton - > remove_child ( p_editor ) ;
singleton - > editor_data . remove_editor_plugin ( p_editor ) ;
}
2015-02-10 07:36:16 +01:00
void EditorNode : : add_editor_import_plugin ( const Ref < EditorImportPlugin > & p_editor_import ) {
2016-02-28 03:10:44 +01:00
ERR_FAIL_COND ( p_editor_import . is_null ( ) ) ;
2015-02-10 07:36:16 +01:00
editor_import_export - > add_import_plugin ( p_editor_import ) ;
_rebuild_import_menu ( ) ;
}
void EditorNode : : remove_editor_import_plugin ( const Ref < EditorImportPlugin > & p_editor_import ) {
2016-02-28 03:10:44 +01:00
ERR_FAIL_COND ( p_editor_import . is_null ( ) ) ;
2015-02-10 07:36:16 +01:00
editor_import_export - > remove_import_plugin ( p_editor_import ) ;
_rebuild_import_menu ( ) ;
}
2016-02-28 03:10:44 +01:00
void EditorNode : : _update_addon_config ( ) {
if ( _initializing_addons )
return ;
Vector < String > enabled_addons ;
for ( Map < String , EditorPlugin * > : : Element * E = plugin_addons . front ( ) ; E ; E = E - > next ( ) ) {
enabled_addons . push_back ( E - > key ( ) ) ;
}
if ( enabled_addons . size ( ) = = 0 ) {
Globals : : get_singleton ( ) - > set ( " editor_plugins/enabled " , Variant ( ) ) ;
Globals : : get_singleton ( ) - > set_persisting ( " editor_plugins/enabled " , false ) ;
} else {
Globals : : get_singleton ( ) - > set ( " editor_plugins/enabled " , enabled_addons ) ;
Globals : : get_singleton ( ) - > set_persisting ( " editor_plugins/enabled " , true ) ;
}
project_settings - > queue_save ( ) ;
}
void EditorNode : : set_addon_plugin_enabled ( const String & p_addon , bool p_enabled ) {
ERR_FAIL_COND ( p_enabled & & plugin_addons . has ( p_addon ) ) ;
ERR_FAIL_COND ( ! p_enabled & & ! plugin_addons . has ( p_addon ) ) ;
if ( ! p_enabled ) {
EditorPlugin * addon = plugin_addons [ p_addon ] ;
2016-06-19 00:29:16 +02:00
remove_editor_plugin ( addon ) ;
2016-02-28 03:10:44 +01:00
memdelete ( addon ) ; //bye
plugin_addons . erase ( p_addon ) ;
_update_addon_config ( ) ;
return ;
}
Ref < ConfigFile > cf ;
cf . instance ( ) ;
String addon_path = " res://addons/ " + p_addon + " /plugin.cfg " ;
Error err = cf - > load ( addon_path ) ;
if ( err ! = OK ) {
show_warning ( " Unable to enable addon plugin at: ' " + addon_path + " ' parsing of config failed. " ) ;
return ;
}
if ( ! cf - > has_section_key ( " plugin " , " script " ) ) {
show_warning ( " Unable to find script field for addon plugin at: 'res://addons/ " + p_addon + " ''. " ) ;
return ;
}
String path = cf - > get_value ( " plugin " , " script " ) ;
path = " res://addons/ " + p_addon + " / " + path ;
Ref < Script > script = ResourceLoader : : load ( path ) ;
if ( script . is_null ( ) ) {
show_warning ( " Unable to load addon script from path: ' " + path + " '. " ) ;
return ;
}
//could check inheritance..
if ( String ( script - > get_instance_base_type ( ) ) ! = " EditorPlugin " ) {
show_warning ( " Unable to load addon script from path: ' " + path + " ' Base type is not EditorPlugin. " ) ;
return ;
}
if ( ! script - > is_tool ( ) ) {
show_warning ( " Unable to load addon script from path: ' " + path + " ' Script is does not support tool mode. " ) ;
return ;
}
EditorPlugin * ep = memnew ( EditorPlugin ) ;
ep - > set_script ( script . get_ref_ptr ( ) ) ;
plugin_addons [ p_addon ] = ep ;
add_editor_plugin ( ep ) ;
_update_addon_config ( ) ;
}
bool EditorNode : : is_addon_plugin_enabled ( const String & p_addon ) const {
return plugin_addons . has ( p_addon ) ;
}
2015-06-22 05:03:19 +02:00
void EditorNode : : _remove_edited_scene ( ) {
int new_index = editor_data . get_edited_scene ( ) ;
int old_index = new_index ;
if ( new_index > 0 ) {
new_index = new_index - 1 ;
} else if ( editor_data . get_edited_scene_count ( ) > 1 ) {
new_index = 1 ;
} else {
editor_data . add_edited_scene ( - 1 ) ;
new_index = 1 ;
}
2016-07-07 01:35:49 +02:00
if ( editor_data . get_scene_path ( old_index ) ! = String ( ) ) {
ScriptEditor : : get_singleton ( ) - > close_builtin_scripts_from_scene ( editor_data . get_scene_path ( old_index ) ) ;
}
2015-06-22 05:03:19 +02:00
_scene_tab_changed ( new_index ) ;
editor_data . remove_scene ( old_index ) ;
editor_data . get_undo_redo ( ) . clear_history ( ) ;
_update_title ( ) ;
_update_scene_tabs ( ) ;
2015-02-10 07:36:16 +01:00
2015-11-19 14:15:17 +01:00
// if (editor_data.get_edited_scene_count()==1) {
// //make new scene appear saved
// set_current_version(editor_data.get_undo_redo().get_version());
// unsaved_cache=false;
// }
2015-06-22 05:03:19 +02:00
}
2015-10-22 00:23:42 +02:00
void EditorNode : : _remove_scene ( int index ) {
// printf("Attempting to remove scene %d (current is %d)\n", index, editor_data.get_edited_scene());
2015-11-19 14:15:17 +01:00
2015-10-22 00:23:42 +02:00
if ( editor_data . get_edited_scene ( ) = = index ) {
//Scene to remove is current scene
_remove_edited_scene ( ) ;
}
else {
2015-11-19 14:15:17 +01:00
// Scene to remove is not active scene
2015-10-22 00:23:42 +02:00
editor_data . remove_scene ( index ) ;
}
}
2014-02-10 02:10:30 +01:00
void EditorNode : : set_edited_scene ( Node * p_scene ) {
2015-06-22 05:03:19 +02:00
if ( get_editor_data ( ) . get_edited_scene_root ( ) ) {
if ( get_editor_data ( ) . get_edited_scene_root ( ) - > get_parent ( ) = = scene_root )
scene_root - > remove_child ( get_editor_data ( ) . get_edited_scene_root ( ) ) ;
2016-01-18 00:03:57 +01:00
2016-03-09 00:00:52 +01:00
}
2015-06-22 05:03:19 +02:00
get_editor_data ( ) . set_edited_scene_root ( p_scene ) ;
2016-03-09 00:00:52 +01:00
2015-06-22 05:03:19 +02:00
if ( p_scene & & p_scene - > cast_to < Popup > ( ) )
p_scene - > cast_to < Popup > ( ) - > show ( ) ; //show popups
scene_tree_dock - > set_edited_scene ( p_scene ) ;
2014-11-06 01:20:42 +01:00
if ( get_tree ( ) )
2015-06-22 05:03:19 +02:00
get_tree ( ) - > set_edited_scene_root ( p_scene ) ;
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
if ( p_scene ) {
2014-02-10 02:10:30 +01:00
if ( p_scene - > get_parent ( ) ! = scene_root )
scene_root - > add_child ( p_scene ) ;
2016-01-18 00:03:57 +01:00
2014-02-10 02:10:30 +01:00
}
}
2015-06-22 05:03:19 +02:00
2014-02-10 02:10:30 +01:00
void EditorNode : : _fetch_translatable_strings ( const Object * p_object , Set < StringName > & strings ) {
List < String > tstrings ;
p_object - > get_translatable_strings ( & tstrings ) ;
for ( List < String > : : Element * E = tstrings . front ( ) ; E ; E = E - > next ( ) )
strings . insert ( E - > get ( ) ) ;
const Node * node = p_object - > cast_to < Node > ( ) ;
if ( ! node )
return ;
Ref < Script > script = node - > get_script ( ) ;
if ( script . is_valid ( ) )
_fetch_translatable_strings ( script . ptr ( ) , strings ) ;
for ( int i = 0 ; i < node - > get_child_count ( ) ; i + + ) {
Node * c = node - > get_child ( i ) ;
if ( c - > get_owner ( ) ! = get_edited_scene ( ) )
continue ;
_fetch_translatable_strings ( c , strings ) ;
}
}
Error EditorNode : : save_translatable_strings ( const String & p_to_file ) {
2014-11-06 01:20:42 +01:00
if ( ! is_inside_tree ( ) ) {
2014-02-10 02:10:30 +01:00
defer_translatable = p_to_file ;
return OK ;
}
ERR_FAIL_COND_V ( ! get_edited_scene ( ) , ERR_INVALID_DATA ) ;
Set < StringName > strings ;
_fetch_translatable_strings ( get_edited_scene ( ) , strings ) ;
Error err ;
FileAccess * f = FileAccess : : open ( p_to_file , FileAccess : : WRITE , & err ) ;
ERR_FAIL_COND_V ( err , err ) ;
OS : : Date date = OS : : get_singleton ( ) - > get_date ( ) ;
OS : : Time time = OS : : get_singleton ( ) - > get_time ( ) ;
f - > store_line ( " # Translation Strings Dump. " ) ;
f - > store_line ( " # Created By. " ) ;
2017-01-01 22:01:57 +01:00
f - > store_line ( " # \t " VERSION_FULL_NAME " (c) 2008-2017 Juan Linietsky, Ariel Manzur. " ) ;
2014-02-10 02:10:30 +01:00
f - > store_line ( " # From Scene: " ) ;
f - > store_line ( " # \t " + get_edited_scene ( ) - > get_filename ( ) ) ;
f - > store_line ( " " ) ;
f - > store_line ( " msgid \" \" " ) ;
f - > store_line ( " msgstr \" \" " ) ;
f - > store_line ( " \" Report-Msgid-Bugs-To: <define> \\ n \" " ) ;
f - > store_line ( " \" POT-Creation-Date: " + itos ( date . year ) + " - " + itos ( date . month ) + " - " + itos ( date . day ) + " " + itos ( time . hour ) + " : " + itos ( time . min ) + " 0000 \\ n \" " ) ;
// f->store_line("\"PO-Revision-Date: 2006-08-30 13:56-0700\\n\"");
// f->store_line("\"Last-Translator: Rubén C. Díaz Alonso <outime@gmail.com>\\n\"");
f - > store_line ( " \" Language-Team: <define> \\ n \" " ) ;
f - > store_line ( " \" MIME-Version: 1.0 \\ n \" " ) ;
f - > store_line ( " \" Content-Type: text/plain; charset=UTF-8 \\ n \" " ) ;
f - > store_line ( " \" Content-Transfer-Encoding: 8bit \\ n \" " ) ;
f - > store_line ( " " ) ;
for ( Set < StringName > : : Element * E = strings . front ( ) ; E ; E = E - > next ( ) ) {
String s = E - > get ( ) ;
if ( s = = " " | | s . strip_edges ( ) = = " " )
continue ;
Vector < String > substr = s . split ( " \n " ) ;
ERR_CONTINUE ( substr . size ( ) = = 0 ) ;
f - > store_line ( " " ) ;
if ( substr . size ( ) = = 1 ) {
f - > store_line ( " msgid \" " + substr [ 0 ] . c_escape ( ) + " \" " ) ;
} else {
f - > store_line ( " msgid \" \" " ) ;
for ( int i = 0 ; i < substr . size ( ) ; i + + ) {
String s = substr [ i ] ;
if ( i ! = substr . size ( ) - 1 )
s + = " \n " ;
f - > store_line ( " \" " + s . c_escape ( ) + " \" " ) ;
}
}
f - > store_line ( " msgstr \" \" " ) ;
}
f - > close ( ) ;
memdelete ( f ) ;
return OK ;
}
Error EditorNode : : save_optimized_copy ( const String & p_scene , const String & p_preset ) {
#if 0
if ( ! is_inside_scene ( ) ) {
defer_optimize = p_scene ;
defer_optimize_preset = p_preset ;
return OK ;
}
if ( ! get_edited_scene ( ) ) {
get_scene ( ) - > quit ( ) ;
2016-05-19 00:08:12 +02:00
ERR_EXPLAIN ( " No scene to optimize (loading failed?) " ) ;
2014-02-10 02:10:30 +01:00
ERR_FAIL_V ( ERR_FILE_NOT_FOUND ) ;
}
String src_scene = Globals : : get_singleton ( ) - > localize_path ( get_edited_scene ( ) - > get_filename ( ) ) ;
String path = p_scene ;
print_line ( " p_path: " + p_scene ) ;
print_line ( " src_scene: " + p_scene ) ;
if ( path . is_rel_path ( ) ) {
print_line ( " rel path!? " ) ;
path = src_scene . get_base_dir ( ) + " / " + path ;
}
path = Globals : : get_singleton ( ) - > localize_path ( path ) ;
print_line ( " path: " + path ) ;
String preset = " optimizer_presets/ " + p_preset ;
if ( ! Globals : : get_singleton ( ) - > has ( preset ) ) {
//accept->"()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
accept - > set_text ( " Optimizer preset not found: " + p_preset ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
2016-05-19 00:08:12 +02:00
ERR_EXPLAIN ( " Optimizer preset not found: " + p_preset ) ;
2014-02-10 02:10:30 +01:00
ERR_FAIL_V ( ERR_INVALID_PARAMETER ) ;
}
Dictionary d = Globals : : get_singleton ( ) - > get ( preset ) ;
ERR_FAIL_COND_V ( ! d . has ( " __type__ " ) , ERR_INVALID_DATA ) ;
String type = d [ " __type__ " ] ;
Ref < EditorOptimizedSaver > saver ;
for ( int i = 0 ; i < editor_data . get_optimized_saver_count ( ) ; i + + ) {
print_line ( type + " vs " + editor_data . get_optimized_saver ( i ) - > get_target_name ( ) ) ;
if ( editor_data . get_optimized_saver ( i ) - > get_target_name ( ) = = type ) {
saver = editor_data . get_optimized_saver ( i ) ;
}
}
2016-05-19 00:08:12 +02:00
ERR_EXPLAIN ( " Preset ' " + p_preset + " ' references nonexistent saver: " + type ) ;
2014-02-10 02:10:30 +01:00
ERR_FAIL_COND_V ( saver . is_null ( ) , ERR_INVALID_DATA ) ;
List < Variant > keys ;
d . get_key_list ( & keys ) ;
saver - > clear ( ) ;
for ( List < Variant > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
saver - > set ( E - > get ( ) , d [ E - > get ( ) ] ) ;
}
uint32_t flags = 0 ;
// if (saver->is_bundle_scenes_enabled())
// flags|=ResourceSaver::FLAG_BUNDLE_INSTANCED_SCENES;
if ( saver - > is_bundle_resources_enabled ( ) )
flags | = ResourceSaver : : FLAG_BUNDLE_RESOURCES ;
if ( saver - > is_remove_editor_data_enabled ( ) )
flags | = ResourceSaver : : FLAG_OMIT_EDITOR_PROPERTIES ;
if ( saver - > is_big_endian_data_enabled ( ) )
flags | = ResourceSaver : : FLAG_SAVE_BIG_ENDIAN ;
String platform = saver - > get_target_platform ( ) ;
if ( platform = = " " )
platform = " all " ;
Ref < PackedScene > sdata = memnew ( PackedScene ) ;
Error err = sdata - > pack ( get_edited_scene ( ) ) ;
if ( err ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
accept - > set_text ( " Couldn't save scene. Likely dependencies (instances) couldn't be satisfied. " ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ERR_INVALID_DATA ;
}
err = ResourceSaver : : save ( path , sdata , flags ) ; //todo, saverSceneSaver::save(path,get_edited_scene(),flags,saver);
if ( err ) {
//accept->"()->hide();
2016-05-19 00:08:12 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
accept - > set_text ( " Error saving optimized scene: " + path ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
ERR_FAIL_COND_V ( err , err ) ;
}
project_settings - > add_remapped_path ( src_scene , path , platform ) ;
# endif
return OK ;
}
2015-06-22 05:03:19 +02:00
2015-11-18 08:47:41 +01:00
int EditorNode : : _get_current_main_editor ( ) {
for ( int i = 0 ; i < editor_table . size ( ) ; i + + ) {
if ( editor_table [ i ] = = editor_plugin_screen )
return i ;
}
return 0 ;
}
2015-06-22 05:03:19 +02:00
Dictionary EditorNode : : _get_main_scene_state ( ) {
Dictionary state ;
2015-11-18 08:47:41 +01:00
state [ " main_tab " ] = _get_current_main_editor ( ) ;
2015-06-22 05:03:19 +02:00
state [ " scene_tree_offset " ] = scene_tree_dock - > get_tree_editor ( ) - > get_scene_tree ( ) - > get_vscroll_bar ( ) - > get_val ( ) ;
state [ " property_edit_offset " ] = get_property_editor ( ) - > get_scene_tree ( ) - > get_vscroll_bar ( ) - > get_val ( ) ;
state [ " saved_version " ] = saved_version ;
2016-05-16 17:23:40 +02:00
state [ " node_filter " ] = scene_tree_dock - > get_filter ( ) ;
2015-06-22 05:03:19 +02:00
//print_line(" getting main tab: "+itos(state["main_tab"]));
return state ;
}
2016-06-28 23:53:31 +02:00
void EditorNode : : _set_main_scene_state ( Dictionary p_state , Node * p_for_scene ) {
2016-06-29 07:49:03 +02:00
if ( get_edited_scene ( ) ! = p_for_scene & & p_for_scene ! = NULL )
2016-06-28 23:53:31 +02:00
return ; //not for this scene
2015-06-22 05:03:19 +02:00
//print_line("set current 7 ");
2015-11-17 13:46:08 +01:00
changing_scene = false ;
2015-06-22 05:03:19 +02:00
2015-11-17 13:46:08 +01:00
#if 0
2015-06-22 05:03:19 +02:00
if ( p_state . has ( " main_tab " ) ) {
int idx = p_state [ " main_tab " ] ;
2015-11-17 13:46:08 +01:00
print_line ( " comes with tab: " + itos ( idx ) ) ;
2015-06-22 05:03:19 +02:00
int current = - 1 ;
for ( int i = 0 ; i < editor_table . size ( ) ; i + + ) {
if ( editor_plugin_screen = = editor_table [ i ] ) {
current = i ;
break ;
}
}
2015-11-17 13:46:08 +01:00
2015-06-22 05:03:19 +02:00
if ( idx < 2 & & current < 2 ) {
//only set tab for 2D and 3D
2015-11-17 13:46:08 +01:00
_editor_select ( idx ) ;
2015-06-22 05:03:19 +02:00
//print_line(" setting main tab: "+itos(p_state["main_tab"]));
}
}
2015-11-17 13:46:08 +01:00
# else
if ( get_edited_scene ( ) ) {
int current = - 1 ;
for ( int i = 0 ; i < editor_table . size ( ) ; i + + ) {
if ( editor_plugin_screen = = editor_table [ i ] ) {
current = i ;
break ;
}
}
if ( current < 2 ) {
//use heuristic instead
int n2d = 0 , n3d = 0 ;
_find_node_types ( get_edited_scene ( ) , n2d , n3d ) ;
if ( n2d > n3d ) {
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_2D ) ;
2015-11-17 13:46:08 +01:00
} else if ( n3d > n2d ) {
2015-11-25 00:46:44 +01:00
_editor_select ( EDITOR_3D ) ;
2015-11-17 13:46:08 +01:00
}
}
}
# endif
2015-06-22 05:03:19 +02:00
if ( p_state . has ( " scene_tree_offset " ) )
scene_tree_dock - > get_tree_editor ( ) - > get_scene_tree ( ) - > get_vscroll_bar ( ) - > set_val ( p_state [ " scene_tree_offset " ] ) ;
if ( p_state . has ( " property_edit_offset " ) )
get_property_editor ( ) - > get_scene_tree ( ) - > get_vscroll_bar ( ) - > set_val ( p_state [ " property_edit_offset " ] ) ;
2016-05-16 17:23:40 +02:00
if ( p_state . has ( " node_filter " ) )
scene_tree_dock - > set_filter ( p_state [ " node_filter " ] ) ;
2015-06-22 05:03:19 +02:00
//print_line("set current 8 ");
2015-11-17 13:46:08 +01:00
//this should only happen at the very end
//changing_scene=true; //avoid script change from opening editor
ScriptEditor : : get_singleton ( ) - > get_debugger ( ) - > update_live_edit_root ( ) ;
ScriptEditor : : get_singleton ( ) - > set_scene_root_script ( editor_data . get_scene_root_script ( editor_data . get_edited_scene ( ) ) ) ;
2015-12-09 13:08:41 +01:00
editor_data . notify_edited_scene_changed ( ) ;
2015-11-17 13:46:08 +01:00
//changing_scene=false;
2015-06-22 05:03:19 +02:00
}
void EditorNode : : set_current_version ( uint64_t p_version ) {
saved_version = p_version ;
editor_data . set_edited_scene_version ( p_version ) ;
}
bool EditorNode : : is_changing_scene ( ) const {
return changing_scene ;
}
2015-12-14 00:39:01 +01:00
void EditorNode : : _clear_undo_history ( ) {
get_undo_redo ( ) - > clear_history ( ) ;
}
2015-06-22 05:03:19 +02:00
void EditorNode : : set_current_scene ( int p_idx ) {
2015-12-14 00:39:01 +01:00
if ( editor_data . check_and_update_scene ( p_idx ) ) {
call_deferred ( " _clear_undo_history " ) ;
}
2015-06-22 05:03:19 +02:00
changing_scene = true ;
editor_data . save_edited_scene_state ( editor_selection , & editor_history , _get_main_scene_state ( ) ) ;
if ( get_editor_data ( ) . get_edited_scene_root ( ) ) {
if ( get_editor_data ( ) . get_edited_scene_root ( ) - > get_parent ( ) = = scene_root )
scene_root - > remove_child ( get_editor_data ( ) . get_edited_scene_root ( ) ) ;
2016-01-18 00:03:57 +01:00
2015-06-22 05:03:19 +02:00
}
//print_line("set current 2 ");
editor_selection - > clear ( ) ;
editor_data . set_edited_scene ( p_idx ) ;
Node * new_scene = editor_data . get_edited_scene_root ( ) ;
if ( new_scene & & new_scene - > cast_to < Popup > ( ) )
new_scene - > cast_to < Popup > ( ) - > show ( ) ; //show popups
//print_line("set current 3 ");
scene_tree_dock - > set_edited_scene ( new_scene ) ;
if ( get_tree ( ) )
get_tree ( ) - > set_edited_scene_root ( new_scene ) ;
if ( new_scene ) {
if ( new_scene - > get_parent ( ) ! = scene_root )
scene_root - > add_child ( new_scene ) ;
2016-01-18 00:03:57 +01:00
2015-06-22 05:03:19 +02:00
}
//print_line("set current 4 ");
Dictionary state = editor_data . restore_edited_scene_state ( editor_selection , & editor_history ) ;
_edit_current ( ) ;
/*if (!unsaved) {
saved_version = editor_data . get_undo_redo ( ) . get_version ( ) ;
if ( p_backwards )
saved_version - - ;
else
saved_version + + ;
print_line ( " was saved, updating version " ) ;
} else {
saved_version = state [ " saved_version " ] ;
} */
//_set_main_scene_state(state);
2016-06-28 23:53:31 +02:00
call_deferred ( " _set_main_scene_state " , state , get_edited_scene ( ) ) ; //do after everything else is done setting up
2015-06-22 05:03:19 +02:00
//print_line("set current 6 ");
}
2015-08-24 01:15:56 +02:00
bool EditorNode : : is_scene_open ( const String & p_path ) {
for ( int i = 0 ; i < editor_data . get_edited_scene_count ( ) ; i + + ) {
if ( editor_data . get_scene_path ( i ) = = p_path )
return true ;
}
return false ;
}
void EditorNode : : fix_dependencies ( const String & p_for_file ) {
dependency_fixer - > edit ( p_for_file ) ;
}
2016-06-26 20:37:04 +02:00
Error EditorNode : : load_scene ( const String & p_scene , bool p_ignore_broken_deps , bool p_set_inherited , bool p_clear_errors ) {
2014-02-10 02:10:30 +01:00
2014-11-06 01:20:42 +01:00
if ( ! is_inside_tree ( ) ) {
2014-02-10 02:10:30 +01:00
defer_load_scene = p_scene ;
return OK ;
}
2016-01-02 23:42:41 +01:00
if ( ! p_set_inherited ) {
for ( int i = 0 ; i < editor_data . get_edited_scene_count ( ) ; i + + ) {
2015-06-22 05:03:19 +02:00
2016-01-02 23:42:41 +01:00
if ( editor_data . get_scene_path ( i ) = = p_scene ) {
_scene_tab_changed ( i ) ;
return OK ;
}
2015-06-22 05:03:19 +02:00
}
}
2014-02-10 02:10:30 +01:00
2016-06-26 20:37:04 +02:00
if ( p_clear_errors )
load_errors - > clear ( ) ;
2014-02-10 02:10:30 +01:00
String lpath = Globals : : get_singleton ( ) - > localize_path ( p_scene ) ;
if ( ! lpath . begins_with ( " res:// " ) ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " Ugh " ) ) ;
accept - > set_text ( TTR ( " Error loading scene, it must be inside the project path. Use 'Import' to open the scene, then save it inside the project path. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
opening_prev = false ;
return ERR_FILE_NOT_FOUND ;
}
2015-06-22 05:03:19 +02:00
int prev = editor_data . get_edited_scene ( ) ;
int idx = editor_data . add_edited_scene ( - 1 ) ;
//print_line("load scene callback");
//set_current_scene(idx);
if ( ! editor_data . get_edited_scene_root ( ) & & editor_data . get_edited_scene_count ( ) = = 2 ) {
_remove_edited_scene ( ) ;
} else {
_scene_tab_changed ( idx ) ;
}
//_cleanup_scene(); // i'm sorry but this MUST happen to avoid modified resources to not be reloaded.
2014-02-10 02:10:30 +01:00
2015-08-24 01:15:56 +02:00
dependency_errors . clear ( ) ;
2015-06-26 06:14:31 +02:00
Ref < PackedScene > sdata = ResourceLoader : : load ( lpath , " " , true ) ;
2014-02-10 02:10:30 +01:00
if ( ! sdata . is_valid ( ) ) {
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " Ugh " ) ) ;
accept - > set_text ( TTR ( " Error loading scene. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
opening_prev = false ;
2015-06-22 05:03:19 +02:00
if ( prev ! = - 1 ) {
set_current_scene ( prev ) ;
editor_data . remove_scene ( idx ) ;
}
2014-02-10 02:10:30 +01:00
return ERR_FILE_NOT_FOUND ;
}
2015-08-24 01:15:56 +02:00
if ( ! p_ignore_broken_deps & & dependency_errors . has ( lpath ) ) {
current_option = - 1 ;
Vector < String > errors ;
for ( Set < String > : : Element * E = dependency_errors [ lpath ] . front ( ) ; E ; E = E - > next ( ) ) {
errors . push_back ( E - > get ( ) ) ;
}
dependency_error - > show ( lpath , errors ) ;
opening_prev = false ;
if ( prev ! = - 1 ) {
set_current_scene ( prev ) ;
editor_data . remove_scene ( idx ) ;
}
return ERR_FILE_MISSING_DEPENDENCIES ;
}
dependency_errors . erase ( lpath ) ; //at least not self path
for ( Map < String , Set < String > > : : Element * E = dependency_errors . front ( ) ; E ; E = E - > next ( ) ) {
2016-05-19 00:08:12 +02:00
String txt = vformat ( TTR ( " Scene '%s' has broken dependencies: " ) , E - > key ( ) ) + " \n " ;
2015-08-24 01:15:56 +02:00
for ( Set < String > : : Element * F = E - > get ( ) . front ( ) ; F ; F = F - > next ( ) ) {
txt + = " \t " + F - > get ( ) + " \n " ;
}
add_io_error ( txt ) ;
}
2016-01-14 15:06:20 +01:00
if ( ResourceCache : : has ( lpath ) ) {
2016-01-14 15:50:24 +01:00
//used from somewhere else? no problem! update state and replace sdata
2016-01-14 15:06:20 +01:00
Ref < PackedScene > ps = Ref < PackedScene > ( ResourceCache : : get ( lpath ) - > cast_to < PackedScene > ( ) ) ;
if ( ps . is_valid ( ) ) {
ps - > replace_state ( sdata - > get_state ( ) ) ;
ps - > set_last_modified_time ( sdata - > get_last_modified_time ( ) ) ;
sdata = ps ;
}
} else {
sdata - > set_path ( lpath , true ) ; //take over path
}
2015-06-26 06:14:31 +02:00
2014-02-10 02:10:30 +01:00
Node * new_scene = sdata - > instance ( true ) ;
if ( ! new_scene ) {
2015-06-22 05:03:19 +02:00
sdata . unref ( ) ;
2014-02-10 02:10:30 +01:00
current_option = - 1 ;
//accept->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
accept - > get_ok ( ) - > set_text ( TTR ( " Ugh " ) ) ;
accept - > set_text ( TTR ( " Error loading scene. " ) ) ;
2015-04-08 19:02:13 +02:00
accept - > popup_centered_minsize ( ) ;
2014-02-10 02:10:30 +01:00
opening_prev = false ;
2015-06-22 05:03:19 +02:00
if ( prev ! = - 1 ) {
set_current_scene ( prev ) ;
editor_data . remove_scene ( idx ) ;
}
2014-02-10 02:10:30 +01:00
return ERR_FILE_NOT_FOUND ;
}
2015-06-22 05:03:19 +02:00
//guess not needed in the end?
//new_scene->clear_internal_tree_resource_paths(); //make sure no internal tree paths to internal resources exist
2014-02-10 02:10:30 +01:00
/*
Node * old_scene = edited_scene ;
_hide_top_editors ( ) ;
set_edited_scene ( NULL ) ;
editor_data . clear_editor_states ( ) ;
if ( old_scene ) {
if ( ! opening_prev & & old_scene - > get_filename ( ) ! = " " ) {
previous_scenes . push_back ( old_scene - > get_filename ( ) ) ;
}
memdelete ( old_scene ) ;
}
*/
2015-06-22 05:03:19 +02:00
2015-10-10 14:09:09 +02: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 14:09:09 +02:00
new_scene - > set_scene_inherited_state ( state ) ;
2015-10-18 01:55:12 +02:00
new_scene - > set_filename ( String ( ) ) ;
2015-11-29 00:56:14 +01:00
//if (new_scene->get_scene_instance_state().is_valid())
// new_scene->get_scene_instance_state()->set_path(String());
2015-10-10 14:09:09 +02:00
}
2015-11-29 00:56:14 +01:00
new_scene - > set_scene_instance_state ( Ref < SceneState > ( ) ) ;
2015-10-10 14:09:09 +02:00
2014-02-10 02:10:30 +01:00
set_edited_scene ( new_scene ) ;
2015-12-31 04:31:00 +01:00
_get_scene_metadata ( p_scene ) ;
2015-06-22 05:03:19 +02:00
/*
editor_data . set_edited_scene_root ( new_scene ) ;
2014-05-18 11:56:08 +02:00
scene_tree_dock - > set_selected ( new_scene , true ) ;
2014-02-10 02:10:30 +01:00
property_editor - > edit ( new_scene ) ;
2015-06-22 05:03:19 +02:00
editor_data . set_edited_scene_root ( new_scene ) ;
*/
editor_data . set_edited_scene_import_metadata ( sdata - > get_import_metadata ( ) ) ;
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
// editor_data.get_undo_redo().clear_history();
2014-02-10 02:10:30 +01:00
saved_version = editor_data . get_undo_redo ( ) . get_version ( ) ;
_update_title ( ) ;
2015-06-22 05:03:19 +02:00
_update_scene_tabs ( ) ;
2014-02-10 02:10:30 +01:00
_add_to_recent_scenes ( lpath ) ;
prev_scene - > set_disabled ( previous_scenes . size ( ) = = 0 ) ;
opening_prev = false ;
2015-08-02 17:29:37 +02:00
ScriptEditor : : get_singleton ( ) - > get_debugger ( ) - > update_live_edit_root ( ) ;
2015-06-14 03:12:53 +02:00
//top_pallete->set_current_tab(0); //always go to scene
2014-02-10 02:10:30 +01:00
2014-07-07 22:44:21 +02:00
push_item ( new_scene ) ;
2014-02-10 02:10:30 +01:00
return OK ;
}
void EditorNode : : open_request ( const String & p_path ) {
2015-06-22 05:03:19 +02:00
load_scene ( p_path ) ; // as it will be opened in separate tab
//external_file=p_path;
//_menu_option_confirm(FILE_EXTERNAL_OPEN_SCENE,false);
2014-02-10 02:10:30 +01:00
}
2016-05-12 01:57:52 +02:00
void EditorNode : : request_instance_scene ( const String & p_path ) {
2014-02-10 02:10:30 +01:00
2016-05-12 01:57:52 +02:00
scene_tree_dock - > instance ( p_path ) ;
2014-02-10 02:10:30 +01:00
}
2016-07-20 19:09:03 +02:00
void EditorNode : : request_instance_scenes ( const Vector < String > & p_files ) {
scene_tree_dock - > instance_scenes ( p_files ) ;
}
2017-01-21 13:07:29 +01:00
FileSystemDock * EditorNode : : get_filesystem_dock ( ) {
2014-02-10 02:10:30 +01:00
2017-01-21 13:07:29 +01:00
return filesystem_dock ;
2014-02-10 02:10:30 +01:00
}
2016-06-04 18:17:56 +02:00
SceneTreeDock * EditorNode : : get_scene_tree_dock ( ) {
return scene_tree_dock ;
}
2014-02-10 02:10:30 +01:00
2016-07-20 19:09:03 +02:00
void EditorNode : : _instance_request ( const Vector < String > & p_files ) {
2014-02-10 02:10:30 +01:00
2016-07-20 19:09:03 +02:00
request_instance_scenes ( p_files ) ;
2014-02-10 02:10:30 +01:00
}
2015-05-25 06:46:45 +02:00
void EditorNode : : _property_keyed ( const String & p_keyed , const Variant & p_value , bool p_advance ) {
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
AnimationPlayerEditor : : singleton - > get_key_editor ( ) - > insert_value_key ( p_keyed , p_value , p_advance ) ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _transform_keyed ( Object * sp , const String & p_sub , const Transform & p_key ) {
Spatial * s = sp - > cast_to < Spatial > ( ) ;
if ( ! s )
return ;
2016-01-18 00:03:57 +01:00
AnimationPlayerEditor : : singleton - > get_key_editor ( ) - > insert_transform_key ( s , p_sub , p_key ) ;
2014-02-10 02:10:30 +01:00
}
2016-01-18 00:03:57 +01:00
void EditorNode : : update_keying ( ) {
2014-02-10 02:10:30 +01:00
2016-05-04 15:28:37 +02:00
//print_line("KR: "+itos(p_enabled));
2014-02-10 02:10:30 +01:00
bool valid = false ;
2016-01-18 00:03:57 +01:00
if ( AnimationPlayerEditor : : singleton - > get_key_editor ( ) - > has_keying ( ) ) {
2014-02-10 02:10:30 +01:00
if ( editor_history . get_path_size ( ) > = 1 ) {
Object * obj = ObjectDB : : get_instance ( editor_history . get_path_object ( 0 ) ) ;
if ( obj & & obj - > cast_to < Node > ( ) ) {
valid = true ;
}
}
}
property_editor - > set_keying ( valid ) ;
2016-01-27 15:10:51 +01:00
AnimationPlayerEditor : : singleton - > get_key_editor ( ) - > update_keying ( ) ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _close_messages ( ) {
// left_split->set_dragger_visible(false);
2015-06-14 03:12:53 +02:00
old_split_ofs = center_split - > get_split_offset ( ) ;
center_split - > set_split_offset ( 0 ) ;
2014-02-10 02:10:30 +01:00
// scene_root_parent->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_END,0);
}
void EditorNode : : _show_messages ( ) {
// left_split->set_dragger_visible(true);
2015-06-14 03:12:53 +02:00
center_split - > set_split_offset ( old_split_ofs ) ;
2014-02-10 02:10:30 +01:00
// scene_root_parent->set_anchor_and_margin(MARGIN_BOTTOM,Control::ANCHOR_END,log->get_margin(MARGIN_TOP));
}
2016-01-18 00:03:57 +01:00
#if 0
2014-02-10 02:10:30 +01:00
void EditorNode : : animation_panel_make_visible ( bool p_visible ) {
if ( ! p_visible ) {
animation_panel - > hide ( ) ;
} else {
animation_panel - > show ( ) ;
}
int idx = settings_menu - > get_popup ( ) - > get_item_index ( SETTINGS_SHOW_ANIMATION ) ;
settings_menu - > get_popup ( ) - > set_item_checked ( idx , p_visible ) ;
}
2016-01-18 00:03:57 +01:00
2014-02-10 02:10:30 +01:00
void EditorNode : : animation_editor_make_visible ( bool p_visible ) {
if ( p_visible ) {
2016-03-09 00:00:52 +01:00
animation_editor - > show ( ) ;
2014-02-10 02:10:30 +01:00
animation_vb - > get_parent_control ( ) - > minimum_size_changed ( ) ;
//pd_anim->show();
top_split - > set_collapsed ( false ) ;
//scene_root_parent->set_margin(MARGIN_TOP,animation_editor->get_margin(MARGIN_BOTTOM));
} else {
//pd_anim->hide();
animation_editor - > hide ( ) ;
// scene_root_parent->set_margin(MARGIN_TOP,0);
2014-12-07 06:04:20 +01:00
if ( ! animation_vb - > get_parent_control ( ) )
return ;
2014-02-10 02:10:30 +01:00
animation_vb - > get_parent_control ( ) - > minimum_size_changed ( ) ;
top_split - > set_collapsed ( true ) ;
}
animation_editor - > set_keying ( p_visible ) ;
}
2016-01-18 00:03:57 +01:00
# endif
2014-02-10 02:10:30 +01:00
void EditorNode : : _add_to_recent_scenes ( const String & p_scene ) {
String base = " _ " + Globals : : get_singleton ( ) - > get_resource_path ( ) . replace ( " \\ " , " :: " ) . replace ( " / " , " :: " ) ;
Vector < String > rc = EDITOR_DEF ( base + " /_recent_scenes " , Array ( ) ) ;
String name = p_scene ;
name = name . replace ( " res:// " , " " ) ;
if ( rc . find ( name ) ! = - 1 )
rc . erase ( name ) ;
rc . insert ( 0 , name ) ;
if ( rc . size ( ) > 10 )
rc . resize ( 10 ) ;
EditorSettings : : get_singleton ( ) - > set ( base + " /_recent_scenes " , rc ) ;
EditorSettings : : get_singleton ( ) - > save ( ) ;
_update_recent_scenes ( ) ;
}
void EditorNode : : _open_recent_scene ( int p_idx ) {
String base = " _ " + Globals : : get_singleton ( ) - > get_resource_path ( ) . replace ( " \\ " , " :: " ) . replace ( " / " , " :: " ) ;
Vector < String > rc = EDITOR_DEF ( base + " /_recent_scenes " , Array ( ) ) ;
ERR_FAIL_INDEX ( p_idx , rc . size ( ) ) ;
String path = " res:// " + rc [ p_idx ] ;
2015-06-22 05:03:19 +02:00
/*if (unsaved_cache) {
2014-02-10 02:10:30 +01:00
_recent_scene = rc [ p_idx ] ;
open_recent_confirmation - > set_text ( " Discard current scene and open: \n ' " + rc [ p_idx ] + " ' " ) ;
open_recent_confirmation - > get_label ( ) - > set_align ( Label : : ALIGN_CENTER ) ;
open_recent_confirmation - > popup_centered ( Size2 ( 400 , 100 ) ) ;
return ;
2015-06-22 05:03:19 +02:00
} */
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
load_scene ( path ) ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : _save_optimized ( ) {
// save_optimized_copy(optimized_save->get_optimized_scene(),optimized_save->get_preset());
#if 0
String path = optimized_save - > get_optimized_scene ( ) ;
uint32_t flags = 0 ;
String platform = " all " ;
Ref < EditorOptimizedSaver > saver = editor_data . get_optimized_saver ( optimized_save - > get_preset ( ) ) ;
if ( saver - > is_bundle_scenes_enabled ( ) )
flags | = SceneSaver : : FLAG_BUNDLE_INSTANCED_SCENES ;
if ( saver - > is_bundle_resources_enabled ( ) )
flags | = SceneSaver : : FLAG_BUNDLE_RESOURCES ;
if ( saver - > is_remove_editor_data_enabled ( ) )
flags | = SceneSaver : : FLAG_OMIT_EDITOR_PROPERTIES ;
if ( saver - > is_big_endian_data_enabled ( ) )
flags | = SceneSaver : : FLAG_SAVE_BIG_ENDIAN ;
platform = saver - > get_target_platform ( ) ;
Error err = SceneSaver : : save ( path , get_edited_scene ( ) , flags , saver ) ;
if ( err ) {
//accept->"()->hide();
2016-05-21 01:18:35 +02:00
accept - > get_ok ( ) - > set_text ( " I see.. " ) ;
2016-05-19 00:08:12 +02:00
accept - > set_text ( " Error saving optimized scene: " + path ) ;
2014-02-10 02:10:30 +01:00
accept - > popup_centered ( Size2 ( 300 , 70 ) ) ; ;
return ;
}
project_settings - > add_remapped_path ( Globals : : get_singleton ( ) - > localize_path ( get_edited_scene ( ) - > get_filename ( ) ) , Globals : : get_singleton ( ) - > localize_path ( path ) , platform ) ;
# endif
}
void EditorNode : : _update_recent_scenes ( ) {
String base = " _ " + Globals : : get_singleton ( ) - > get_resource_path ( ) . replace ( " \\ " , " :: " ) . replace ( " / " , " :: " ) ;
Vector < String > rc = EDITOR_DEF ( base + " /_recent_scenes " , Array ( ) ) ;
recent_scenes - > clear ( ) ;
for ( int i = 0 ; i < rc . size ( ) ; i + + ) {
recent_scenes - > add_item ( rc [ i ] , i ) ;
}
}
2016-01-08 12:27:34 +01:00
void EditorNode : : _quick_opened ( ) {
2014-02-10 02:10:30 +01:00
2016-01-08 12:27:34 +01:00
Vector < String > files = quick_open - > get_selected_files ( ) ;
for ( int i = 0 ; i < files . size ( ) ; i + + ) {
String res_path = files [ i ] ;
2014-02-10 02:10:30 +01:00
2016-01-08 12:27:34 +01:00
if ( quick_open - > get_base_type ( ) = = " PackedScene " ) {
open_request ( res_path ) ;
} else {
load_resource ( res_path ) ;
}
}
2014-02-10 02:10:30 +01:00
}
2016-02-17 19:40:06 +01:00
void EditorNode : : _quick_run ( ) {
2014-02-10 02:10:30 +01:00
2016-02-17 19:40:06 +01:00
_run ( false , quick_run - > get_selected ( ) ) ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : notify_child_process_exited ( ) {
2015-11-19 21:06:49 +01:00
_menu_option_confirm ( RUN_STOP , false ) ;
2014-02-10 02:10:30 +01:00
stop_button - > set_pressed ( false ) ;
editor_run . stop ( ) ;
}
bool EditorNode : : _find_editing_changed_scene ( Node * p_from ) {
/*
if ( ! p_from )
return false ;
if ( p_from - > get_filename ( ) ! = " " ) {
StringName fn = p_from - > get_filename ( ) ;
for ( int i = 0 ; i < import_monitor - > get_changes ( ) . size ( ) ; i + + ) {
if ( fn = = import_monitor - > get_changes ( ) [ i ] )
return true ;
}
}
for ( int i = 0 ; i < p_from - > get_child_count ( ) ; i + + ) {
if ( _find_editing_changed_scene ( p_from - > get_child ( i ) ) )
return true ;
}
*/
return false ;
}
void EditorNode : : add_io_error ( const String & p_error ) {
2016-06-26 20:37:04 +02:00
//CharString err_ut = p_error.utf8();
//ERR_PRINT(!err_ut.get_data());
2014-02-10 02:10:30 +01:00
_load_error_notify ( singleton , p_error ) ;
}
void EditorNode : : _load_error_notify ( void * p_ud , const String & p_text ) {
2016-06-26 20:37:04 +02:00
2014-02-10 02:10:30 +01:00
EditorNode * en = ( EditorNode * ) p_ud ;
2016-06-26 20:37:04 +02:00
en - > load_errors - > add_image ( en - > gui_base - > get_icon ( " Error " , " EditorIcons " ) ) ;
en - > load_errors - > add_text ( p_text + " \n " ) ;
2014-02-10 02:10:30 +01:00
en - > load_error_dialog - > popup_centered_ratio ( 0.5 ) ;
}
2014-06-19 07:23:03 +02:00
bool EditorNode : : _find_scene_in_use ( Node * p_node , const String & p_path ) const {
if ( p_node - > get_filename ( ) = = p_path ) {
return true ;
}
for ( int i = 0 ; i < p_node - > get_child_count ( ) ; i + + ) {
if ( _find_scene_in_use ( p_node - > get_child ( i ) , p_path ) ) {
return true ;
}
}
return false ;
}
bool EditorNode : : is_scene_in_use ( const String & p_path ) {
Node * es = get_edited_scene ( ) ;
if ( es )
return _find_scene_in_use ( es , p_path ) ;
return false ;
}
2014-02-10 02:10:30 +01:00
void EditorNode : : register_editor_types ( ) {
ObjectTypeDB : : register_type < EditorPlugin > ( ) ;
ObjectTypeDB : : register_type < EditorImportPlugin > ( ) ;
2016-02-27 04:32:00 +01:00
ObjectTypeDB : : register_type < EditorExportPlugin > ( ) ;
2014-02-10 02:10:30 +01:00
ObjectTypeDB : : register_type < EditorScenePostImport > ( ) ;
2014-02-21 03:01:44 +01:00
ObjectTypeDB : : register_type < EditorScript > ( ) ;
2016-02-27 04:32:00 +01:00
ObjectTypeDB : : register_type < EditorSelection > ( ) ;
2015-05-31 06:59:42 +02:00
ObjectTypeDB : : register_type < EditorFileDialog > ( ) ;
2016-02-28 03:10:44 +01:00
//ObjectTypeDB::register_type<EditorImportExport>();
2016-02-27 04:32:00 +01:00
ObjectTypeDB : : register_type < EditorSettings > ( ) ;
2016-02-28 03:10:44 +01:00
ObjectTypeDB : : register_type < EditorSpatialGizmo > ( ) ;
2014-02-10 02:10:30 +01:00
//ObjectTypeDB::register_type<EditorImporter>();
// ObjectTypeDB::register_type<EditorPostImport>();
}
2014-02-25 13:31:47 +01:00
void EditorNode : : unregister_editor_types ( ) {
_init_callbacks . clear ( ) ;
}
2014-02-10 02:10:30 +01:00
void EditorNode : : stop_child_process ( ) {
_menu_option_confirm ( RUN_STOP , false ) ;
}
void EditorNode : : progress_add_task ( const String & p_task , const String & p_label , int p_steps ) {
singleton - > progress_dialog - > add_task ( p_task , p_label , p_steps ) ;
}
2015-12-21 13:05:49 +01:00
void EditorNode : : progress_task_step ( const String & p_task , const String & p_state , int p_step , bool p_force_redraw ) {
2014-02-10 02:10:30 +01:00
2015-12-21 13:05:49 +01:00
singleton - > progress_dialog - > task_step ( p_task , p_state , p_step , p_force_redraw ) ;
2014-02-10 02:10:30 +01:00
}
void EditorNode : : progress_end_task ( const String & p_task ) {
singleton - > progress_dialog - > end_task ( p_task ) ;
}
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 ) ;
}
void EditorNode : : progress_task_step_bg ( const String & p_task , int p_step ) {
singleton - > progress_hb - > task_step ( p_task , p_step ) ;
}
void EditorNode : : progress_end_task_bg ( const String & p_task ) {
singleton - > progress_hb - > end_task ( p_task ) ;
}
Ref < Texture > EditorNode : : _file_dialog_get_icon ( const String & p_path ) {
EditorFileSystemDirectory * efsd = EditorFileSystem : : get_singleton ( ) - > get_path ( p_path . get_base_dir ( ) ) ;
if ( efsd ) {
String file = p_path . get_file ( ) ;
for ( int i = 0 ; i < efsd - > get_file_count ( ) ; i + + ) {
if ( efsd - > get_file ( i ) = = file ) {
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 " ] ;
}
void EditorNode : : _file_dialog_register ( FileDialog * p_dialog ) {
singleton - > file_dialogs . insert ( p_dialog ) ;
}
void EditorNode : : _file_dialog_unregister ( FileDialog * p_dialog ) {
singleton - > file_dialogs . erase ( p_dialog ) ;
}
2015-05-31 06:59:42 +02:00
void EditorNode : : _editor_file_dialog_register ( EditorFileDialog * p_dialog ) {
singleton - > editor_file_dialogs . insert ( p_dialog ) ;
}
void EditorNode : : _editor_file_dialog_unregister ( EditorFileDialog * p_dialog ) {
singleton - > editor_file_dialogs . erase ( p_dialog ) ;
}
2014-02-25 13:31:47 +01:00
Vector < EditorNodeInitCallback > EditorNode : : _init_callbacks ;
2014-02-10 02:10:30 +01:00
Error EditorNode : : export_platform ( const String & p_platform , const String & p_path , bool p_debug , const String & p_password , bool p_quit_after ) {
export_defer . platform = p_platform ;
export_defer . path = p_path ;
export_defer . debug = p_debug ;
export_defer . password = p_password ;
return OK ;
}
2016-03-12 14:44:12 +01:00
void EditorNode : : show_warning ( const String & p_text , const String & p_title ) {
2015-02-14 16:09:52 +01:00
warning - > set_text ( p_text ) ;
2016-03-12 14:44:12 +01:00
warning - > set_title ( p_title ) ;
2015-02-14 16:09:52 +01:00
warning - > popup_centered_minsize ( ) ;
}
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
void EditorNode : : _dock_select_input ( const InputEvent & p_input ) {
if ( p_input . type = = InputEvent : : MOUSE_BUTTON | | p_input . type = = InputEvent : : MOUSE_MOTION ) {
Vector2 point ( p_input . mouse_motion . x , p_input . mouse_motion . y ) ;
int nrect = - 1 ;
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
if ( dock_select_rect [ i ] . has_point ( point ) ) {
nrect = i ;
break ;
}
}
2015-06-14 05:41:08 +02:00
2015-06-14 03:12:53 +02:00
if ( nrect ! = dock_select_rect_over ) {
dock_select - > update ( ) ;
dock_select_rect_over = nrect ;
2015-06-14 05:41:08 +02:00
2015-06-14 03:12:53 +02:00
}
2015-06-14 05:41:08 +02:00
if ( nrect = = - 1 )
return ;
2015-06-14 03:12:53 +02:00
if ( p_input . type = = InputEvent : : MOUSE_BUTTON & & p_input . mouse_button . button_index = = 1 & & p_input . mouse_button . pressed & & dock_popup_selected ! = nrect ) {
Control * dock = dock_slot [ dock_popup_selected ] - > get_current_tab_control ( ) ;
if ( dock ) {
dock_slot [ dock_popup_selected ] - > remove_child ( dock ) ;
}
if ( dock_slot [ dock_popup_selected ] - > get_tab_count ( ) = = 0 ) {
dock_slot [ dock_popup_selected ] - > hide ( ) ;
2015-06-14 06:09:58 +02:00
} else {
dock_slot [ dock_popup_selected ] - > set_current_tab ( 0 ) ;
2015-06-14 03:12:53 +02:00
}
2015-06-14 06:09:58 +02:00
2015-06-14 03:12:53 +02:00
dock_slot [ nrect ] - > add_child ( dock ) ;
dock_popup_selected = nrect ;
dock_slot [ nrect ] - > set_current_tab ( dock_slot [ nrect ] - > get_tab_count ( ) - 1 ) ;
dock_slot [ nrect ] - > show ( ) ;
dock_select - > update ( ) ;
VSplitContainer * splits [ DOCK_SLOT_MAX / 2 ] = {
left_l_vsplit ,
left_r_vsplit ,
right_l_vsplit ,
right_r_vsplit ,
} ;
for ( int i = 0 ; i < 4 ; i + + ) {
bool in_use = dock_slot [ i * 2 + 0 ] - > get_tab_count ( ) | | dock_slot [ i * 2 + 1 ] - > get_tab_count ( ) ;
if ( in_use )
splits [ i ] - > show ( ) ;
else
splits [ i ] - > hide ( ) ;
}
_save_docks ( ) ;
}
}
}
2015-06-14 05:41:08 +02:00
void EditorNode : : _dock_popup_exit ( ) {
dock_select_rect_over = - 1 ;
dock_select - > update ( ) ;
}
2015-06-14 03:12:53 +02:00
void EditorNode : : _dock_pre_popup ( int p_which ) {
2016-03-09 00:00:52 +01:00
2015-06-14 05:41:08 +02:00
2015-06-14 03:12:53 +02:00
dock_popup_selected = p_which ;
}
2015-06-14 05:41:08 +02:00
void EditorNode : : _dock_move_left ( ) {
if ( dock_popup_selected < 0 | | dock_popup_selected > = DOCK_SLOT_MAX )
return ;
Control * current = dock_slot [ dock_popup_selected ] - > get_tab_control ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) ) ;
Control * prev = dock_slot [ dock_popup_selected ] - > get_tab_control ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) - 1 ) ;
if ( ! current | | ! prev )
return ;
dock_slot [ dock_popup_selected ] - > move_child ( current , prev - > get_index ( ) ) ;
dock_slot [ dock_popup_selected ] - > set_current_tab ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) - 1 ) ;
dock_select - > update ( ) ;
_save_docks ( ) ;
}
void EditorNode : : _dock_move_right ( ) {
Control * current = dock_slot [ dock_popup_selected ] - > get_tab_control ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) ) ;
Control * next = dock_slot [ dock_popup_selected ] - > get_tab_control ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) + 1 ) ;
if ( ! current | | ! next )
return ;
dock_slot [ dock_popup_selected ] - > move_child ( next , current - > get_index ( ) ) ;
dock_slot [ dock_popup_selected ] - > set_current_tab ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) + 1 ) ;
dock_select - > update ( ) ;
_save_docks ( ) ;
}
2015-06-14 03:12:53 +02:00
void EditorNode : : _dock_select_draw ( ) {
Size2 s = dock_select - > get_size ( ) ;
s . y / = 2.0 ;
s . x / = 6.0 ;
Color used = Color ( 0.6 , 0.6 , 0.6 , 0.8 ) ;
Color used_selected = Color ( 0.8 , 0.8 , 0.8 , 0.8 ) ;
Color tab_selected = Color ( 1 , 1 , 1 , 1 ) ;
Color unused = used ;
unused . a = 0.4 ;
Color unusable = unused ;
unusable . a = 0.1 ;
Rect2 unr ( s . x * 2 , 0 , s . x * 2 , s . y * 2 ) ;
unr . pos + = Vector2 ( 2 , 5 ) ;
unr . size - = Vector2 ( 4 , 7 ) ;
dock_select - > draw_rect ( unr , unusable ) ;
dock_tab_move_left - > set_disabled ( true ) ;
dock_tab_move_right - > set_disabled ( true ) ;
if ( dock_popup_selected ! = - 1 & & dock_slot [ dock_popup_selected ] - > get_tab_count ( ) ) {
dock_tab_move_left - > set_disabled ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) = = 0 ) ;
dock_tab_move_right - > set_disabled ( dock_slot [ dock_popup_selected ] - > get_current_tab ( ) > = dock_slot [ dock_popup_selected ] - > get_tab_count ( ) - 1 ) ;
}
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
Vector2 ofs ;
switch ( i ) {
case DOCK_SLOT_LEFT_UL : {
} break ;
case DOCK_SLOT_LEFT_BL : {
ofs . y + = s . y ;
} break ;
case DOCK_SLOT_LEFT_UR : {
ofs . x + = s . x ;
} break ;
case DOCK_SLOT_LEFT_BR : {
ofs + = s ;
} break ;
case DOCK_SLOT_RIGHT_UL : {
ofs . x + = s . x * 4 ;
} break ;
case DOCK_SLOT_RIGHT_BL : {
ofs . x + = s . x * 4 ;
ofs . y + = s . y ;
} break ;
case DOCK_SLOT_RIGHT_UR : {
ofs . x + = s . x * 4 ;
ofs . x + = s . x ;
} break ;
case DOCK_SLOT_RIGHT_BR : {
ofs . x + = s . x * 4 ;
ofs + = s ;
} break ;
}
Rect2 r ( ofs , s ) ;
dock_select_rect [ i ] = r ;
r . pos + = Vector2 ( 2 , 5 ) ;
r . size - = Vector2 ( 4 , 7 ) ;
2015-06-14 05:41:08 +02:00
2015-06-14 03:12:53 +02:00
if ( i = = dock_select_rect_over ) {
dock_select - > draw_rect ( r , used_selected ) ;
} else if ( dock_slot [ i ] - > get_child_count ( ) = = 0 ) {
dock_select - > draw_rect ( r , unused ) ;
} else {
dock_select - > draw_rect ( r , used ) ;
}
for ( int j = 0 ; j < MIN ( 3 , dock_slot [ i ] - > get_child_count ( ) ) ; j + + ) {
int xofs = ( r . size . width / 3 ) * j ;
Color c = used ;
if ( i = = dock_popup_selected & & ( dock_slot [ i ] - > get_current_tab ( ) > 3 | | dock_slot [ i ] - > get_current_tab ( ) = = j ) )
c = tab_selected ;
dock_select - > draw_rect ( Rect2 ( 2 + ofs . x + xofs , ofs . y , r . size . width / 3 - 1 , 3 ) , c ) ;
}
}
}
void EditorNode : : _save_docks ( ) {
Ref < ConfigFile > config ;
config . instance ( ) ;
2015-11-22 19:11:17 +01:00
_save_docks_to_config ( config , " docks " ) ;
editor_data . get_plugin_window_layout ( config ) ;
config - > save ( EditorSettings : : get_singleton ( ) - > get_project_settings_path ( ) . plus_file ( " editor_layout.cfg " ) ) ;
}
void EditorNode : : _save_docks_to_config ( Ref < ConfigFile > p_layout , const String & p_section ) {
2015-06-14 03:12:53 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
String names ;
for ( int j = 0 ; j < dock_slot [ i ] - > get_tab_count ( ) ; j + + ) {
String name = dock_slot [ i ] - > get_tab_control ( j ) - > get_name ( ) ;
if ( names ! = " " )
names + = " , " ;
names + = name ;
}
if ( names ! = " " ) {
2015-11-22 19:11:17 +01:00
p_layout - > set_value ( p_section , " dock_ " + itos ( i + 1 ) , names ) ;
2015-06-14 03:12:53 +02:00
}
}
VSplitContainer * splits [ DOCK_SLOT_MAX / 2 ] = {
left_l_vsplit ,
left_r_vsplit ,
right_l_vsplit ,
right_r_vsplit ,
} ;
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + ) {
if ( splits [ i ] - > is_visible ( ) ) {
2015-11-22 19:11:17 +01:00
p_layout - > set_value ( p_section , " dock_split_ " + itos ( i + 1 ) , splits [ i ] - > get_split_offset ( ) ) ;
2015-06-14 03:12:53 +02:00
}
}
2015-06-22 05:03:19 +02:00
HSplitContainer * h_splits [ 4 ] = {
left_l_hsplit ,
left_r_hsplit ,
main_hsplit ,
right_hsplit ,
} ;
for ( int i = 0 ; i < 4 ; i + + ) {
2015-11-22 19:11:17 +01:00
p_layout - > set_value ( p_section , " dock_hsplit_ " + itos ( i + 1 ) , h_splits [ i ] - > get_split_offset ( ) ) ;
2015-06-22 05:03:19 +02:00
}
2015-06-14 03:12:53 +02:00
}
2015-06-22 05:03:19 +02:00
void EditorNode : : save_layout ( ) {
dock_drag_timer - > start ( ) ;
}
2015-06-14 03:12:53 +02:00
void EditorNode : : _dock_split_dragged ( int ofs ) {
dock_drag_timer - > start ( ) ;
}
void EditorNode : : _load_docks ( ) {
Ref < ConfigFile > config ;
config . instance ( ) ;
Error err = config - > load ( EditorSettings : : get_singleton ( ) - > get_project_settings_path ( ) . plus_file ( " editor_layout.cfg " ) ) ;
if ( err ! = OK ) {
2016-01-11 22:23:45 +01:00
//no config
if ( overridden_default_layout > = 0 ) {
_layout_menu_option ( overridden_default_layout ) ;
}
return ;
2015-06-14 03:12:53 +02:00
}
2015-11-22 19:11:17 +01:00
_load_docks_from_config ( config , " docks " ) ;
editor_data . set_plugin_window_layout ( config ) ;
}
2016-02-28 03:10:44 +01:00
void EditorNode : : _update_dock_slots_visibility ( ) {
VSplitContainer * splits [ DOCK_SLOT_MAX / 2 ] = {
left_l_vsplit ,
left_r_vsplit ,
right_l_vsplit ,
right_r_vsplit ,
} ;
HSplitContainer * h_splits [ 4 ] = {
left_l_hsplit ,
left_r_hsplit ,
main_hsplit ,
right_hsplit ,
} ;
2016-05-30 20:29:43 +02:00
if ( ! docks_visible ) {
2016-02-28 03:10:44 +01:00
2016-05-30 20:29:43 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
2016-02-28 03:10:44 +01:00
dock_slot [ i ] - > hide ( ) ;
2016-05-30 20:29:43 +02:00
}
2016-02-28 03:10:44 +01:00
2016-05-30 20:29:43 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + ) {
splits [ i ] - > hide ( ) ;
}
2016-02-28 03:10:44 +01:00
2016-05-30 20:29:43 +02:00
right_hsplit - > hide ( ) ;
bottom_panel - > hide ( ) ;
} else {
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
2016-02-28 03:10:44 +01:00
2016-05-30 20:29:43 +02:00
if ( dock_slot [ i ] - > get_tab_count ( ) )
dock_slot [ i ] - > show ( ) ;
else
dock_slot [ i ] - > hide ( ) ;
2016-02-28 03:10:44 +01:00
2016-05-30 20:29:43 +02:00
}
2016-02-28 03:10:44 +01:00
2016-05-30 20:29:43 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + ) {
bool in_use = dock_slot [ i * 2 + 0 ] - > get_tab_count ( ) | | dock_slot [ i * 2 + 1 ] - > get_tab_count ( ) ;
if ( in_use )
splits [ i ] - > show ( ) ;
else
splits [ i ] - > hide ( ) ;
}
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
if ( ! dock_slot [ i ] - > is_hidden ( ) & & dock_slot [ i ] - > get_tab_count ( ) ) {
dock_slot [ i ] - > set_current_tab ( 0 ) ;
}
2016-02-28 03:10:44 +01:00
}
2016-05-30 20:29:43 +02:00
bottom_panel - > show ( ) ;
right_hsplit - > show ( ) ;
2016-02-28 03:10:44 +01:00
}
}
2016-05-30 20:29:43 +02:00
void EditorNode : : _update_top_menu_visibility ( ) {
if ( distraction_free_mode ) {
play_cc - > hide ( ) ;
menu_hb - > hide ( ) ;
scene_tabs - > hide ( ) ;
} else {
play_cc - > show ( ) ;
menu_hb - > show ( ) ;
scene_tabs - > show ( ) ;
}
}
2016-02-28 03:10:44 +01:00
2015-11-22 19:11:17 +01:00
void EditorNode : : _load_docks_from_config ( Ref < ConfigFile > p_layout , const String & p_section ) {
2015-06-14 03:12:53 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
2015-11-22 19:11:17 +01:00
if ( ! p_layout - > has_section_key ( p_section , " dock_ " + itos ( i + 1 ) ) )
2015-06-14 03:12:53 +02:00
continue ;
2015-11-22 19:11:17 +01:00
Vector < String > names = String ( p_layout - > get_value ( p_section , " dock_ " + itos ( i + 1 ) ) ) . split ( " , " ) ;
2015-06-14 03:12:53 +02:00
for ( int j = 0 ; j < names . size ( ) ; j + + ) {
String name = names [ j ] ;
//find it, in a horribly inefficient way
int atidx = - 1 ;
Control * node = NULL ;
for ( int k = 0 ; k < DOCK_SLOT_MAX ; k + + ) {
if ( ! dock_slot [ k ] - > has_node ( name ) )
continue ;
node = dock_slot [ k ] - > get_node ( name ) - > cast_to < Control > ( ) ;
if ( ! node )
continue ;
atidx = k ;
break ;
}
if ( atidx = = - 1 ) //well, it's not anywhere
continue ;
2015-11-22 19:11:17 +01:00
if ( atidx = = i ) {
2015-06-14 03:12:53 +02:00
node - > raise ( ) ;
continue ;
}
dock_slot [ atidx ] - > remove_child ( node ) ;
if ( dock_slot [ atidx ] - > get_tab_count ( ) = = 0 ) {
dock_slot [ atidx ] - > hide ( ) ;
}
dock_slot [ i ] - > add_child ( node ) ;
dock_slot [ i ] - > show ( ) ;
}
}
VSplitContainer * splits [ DOCK_SLOT_MAX / 2 ] = {
left_l_vsplit ,
left_r_vsplit ,
right_l_vsplit ,
right_r_vsplit ,
} ;
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + ) {
2015-11-22 19:11:17 +01:00
if ( ! p_layout - > has_section_key ( p_section , " dock_split_ " + itos ( i + 1 ) ) )
2015-06-14 03:12:53 +02:00
continue ;
2015-11-22 19:11:17 +01:00
int ofs = p_layout - > get_value ( p_section , " dock_split_ " + itos ( i + 1 ) ) ;
2015-06-14 03:12:53 +02:00
splits [ i ] - > set_split_offset ( ofs ) ;
}
2015-11-22 19:11:17 +01:00
HSplitContainer * h_splits [ 4 ] = {
2015-06-22 05:03:19 +02:00
left_l_hsplit ,
left_r_hsplit ,
main_hsplit ,
right_hsplit ,
} ;
for ( int i = 0 ; i < 4 ; i + + ) {
2015-11-22 19:11:17 +01:00
if ( ! p_layout - > has_section_key ( p_section , " dock_hsplit_ " + itos ( i + 1 ) ) )
2015-06-22 05:03:19 +02:00
continue ;
2015-11-22 19:11:17 +01:00
int ofs = p_layout - > get_value ( p_section , " dock_hsplit_ " + itos ( i + 1 ) ) ;
2015-06-22 05:03:19 +02:00
h_splits [ i ] - > set_split_offset ( ofs ) ;
}
2015-06-14 03:12:53 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + ) {
bool in_use = dock_slot [ i * 2 + 0 ] - > get_tab_count ( ) | | dock_slot [ i * 2 + 1 ] - > get_tab_count ( ) ;
if ( in_use )
splits [ i ] - > show ( ) ;
else
splits [ i ] - > hide ( ) ;
}
2015-06-14 05:41:08 +02:00
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
if ( ! dock_slot [ i ] - > is_hidden ( ) & & dock_slot [ i ] - > get_tab_count ( ) ) {
dock_slot [ i ] - > set_current_tab ( 0 ) ;
}
}
2015-11-22 19:11:17 +01:00
}
2015-06-14 05:41:08 +02:00
2015-11-22 19:11:17 +01:00
void EditorNode : : _update_layouts_menu ( ) {
editor_layouts - > clear ( ) ;
2016-01-11 22:23:45 +01:00
overridden_default_layout = - 1 ;
2015-11-22 19:11:17 +01:00
editor_layouts - > set_size ( Vector2 ( ) ) ;
2016-06-05 02:31:29 +02:00
editor_layouts - > add_shortcut ( ED_SHORTCUT ( " layout/save " , TTR ( " Save Layout " ) ) , SETTINGS_LAYOUT_SAVE ) ;
2016-06-19 19:53:27 +02:00
editor_layouts - > add_shortcut ( ED_SHORTCUT ( " layout/delete " , TTR ( " Delete Layout " ) ) , SETTINGS_LAYOUT_DELETE ) ;
2015-11-22 19:11:17 +01:00
editor_layouts - > add_separator ( ) ;
2016-06-19 19:53:27 +02:00
editor_layouts - > add_shortcut ( ED_SHORTCUT ( " layout/default " , TTR ( " Default " ) ) , SETTINGS_LAYOUT_DEFAULT ) ;
2015-11-22 19:11:17 +01:00
Ref < ConfigFile > config ;
config . instance ( ) ;
Error err = config - > load ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " editor_layouts.cfg " ) ) ;
if ( err ! = OK ) {
return ; //no config
}
List < String > layouts ;
config . ptr ( ) - > get_sections ( & layouts ) ;
for ( List < String > : : Element * E = layouts . front ( ) ; E ; E = E - > next ( ) ) {
String layout = E - > get ( ) ;
2016-05-04 03:25:37 +02: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 ) ) ;
overridden_default_layout = editor_layouts - > get_item_count ( ) ;
}
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 : {
current_option = p_id ;
2016-05-04 03:25:37 +02:00
layout_dialog - > set_title ( TTR ( " Save Layout " ) ) ;
layout_dialog - > get_ok ( ) - > set_text ( TTR ( " Save " ) ) ;
2015-11-22 19:11:17 +01:00
layout_dialog - > popup_centered ( ) ;
} break ;
case SETTINGS_LAYOUT_DELETE : {
current_option = p_id ;
2016-05-04 03:25:37 +02:00
layout_dialog - > set_title ( TTR ( " Delete Layout " ) ) ;
layout_dialog - > get_ok ( ) - > set_text ( TTR ( " Delete " ) ) ;
2015-11-22 19:11:17 +01:00
layout_dialog - > popup_centered ( ) ;
} break ;
case SETTINGS_LAYOUT_DEFAULT : {
2016-01-11 22:23:45 +01:00
_load_docks_from_config ( default_layout , " docks " ) ;
2015-11-22 19:11:17 +01:00
_save_docks ( ) ;
} break ;
default : {
Ref < ConfigFile > config ;
config . instance ( ) ;
Error err = config - > load ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) . plus_file ( " editor_layouts.cfg " ) ) ;
if ( err ! = OK ) {
return ; //no config
}
2015-12-14 16:44:15 +01:00
_load_docks_from_config ( config , editor_layouts - > get_item_text ( p_id ) ) ;
2015-11-22 19:11:17 +01:00
_save_docks ( ) ;
}
}
2015-06-22 05:03:19 +02:00
}
2015-07-26 15:44:10 +02:00
void EditorNode : : _scene_tab_script_edited ( int p_tab ) {
Ref < Script > script = editor_data . get_scene_root_script ( p_tab ) ;
if ( script . is_valid ( ) )
edit_resource ( script ) ;
}
2015-08-18 20:27:01 +02:00
void EditorNode : : _scene_tab_closed ( int p_tab ) {
2015-11-19 14:15:17 +01:00
current_option = SCENE_TAB_CLOSE ;
tab_closing = p_tab ;
2016-05-02 13:40:44 +02:00
bool unsaved = ( p_tab = = editor_data . get_edited_scene ( ) ) ?
saved_version ! = editor_data . get_undo_redo ( ) . get_version ( ) :
editor_data . get_scene_version ( p_tab ) ! = 0 ;
if ( unsaved ) {
2016-05-04 03:25:37 +02:00
confirmation - > get_ok ( ) - > set_text ( TTR ( " Yes " ) ) ;
2016-05-04 03:32:38 +02:00
2015-11-19 14:15:17 +01:00
//confirmation->get_cancel()->show();
2016-05-04 03:25:37 +02:00
confirmation - > set_text ( TTR ( " Close scene? (Unsaved changes will be lost) " ) ) ;
2015-11-19 14:15:17 +01:00
confirmation - > popup_centered_minsize ( ) ;
}
else {
_remove_scene ( p_tab ) ;
2016-02-24 22:07:46 +01:00
_update_scene_tabs ( ) ;
2015-11-19 14:15:17 +01:00
}
2015-08-18 20:27:01 +02:00
}
2015-06-22 05:03:19 +02:00
void EditorNode : : _scene_tab_changed ( int p_tab ) {
//print_line("set current 1 ");
bool unsaved = ( saved_version ! = editor_data . get_undo_redo ( ) . get_version ( ) ) ;
//print_line("version: "+itos(editor_data.get_undo_redo().get_version())+", saved "+itos(saved_version));
if ( p_tab = = editor_data . get_edited_scene ( ) )
return ; //pointless
uint64_t next_scene_version = editor_data . get_scene_version ( p_tab ) ;
//print_line("scene tab changed???");
2016-05-04 03:25:37 +02:00
editor_data . get_undo_redo ( ) . create_action ( TTR ( " Switch Scene Tab " ) ) ;
2015-06-22 05:03:19 +02:00
editor_data . get_undo_redo ( ) . add_do_method ( this , " set_current_version " , unsaved ? saved_version : 0 ) ;
editor_data . get_undo_redo ( ) . add_do_method ( this , " set_current_scene " , p_tab ) ;
2016-01-23 23:51:51 +01:00
//editor_data.get_undo_redo().add_do_method(scene_tabs,"set_current_tab",p_tab);
//editor_data.get_undo_redo().add_do_method(scene_tabs,"ensure_tab_visible",p_tab);
2015-06-22 05:03:19 +02:00
editor_data . get_undo_redo ( ) . add_do_method ( this , " set_current_version " , next_scene_version = = 0 ? editor_data . get_undo_redo ( ) . get_version ( ) + 1 : next_scene_version ) ;
editor_data . get_undo_redo ( ) . add_undo_method ( this , " set_current_version " , next_scene_version ) ;
editor_data . get_undo_redo ( ) . add_undo_method ( this , " set_current_scene " , editor_data . get_edited_scene ( ) ) ;
2016-01-23 23:51:51 +01:00
//editor_data.get_undo_redo().add_undo_method(scene_tabs,"set_current_tab",editor_data.get_edited_scene());
//editor_data.get_undo_redo().add_undo_method(scene_tabs,"ensure_tab_visible",p_tab,editor_data.get_edited_scene());
2015-06-22 05:03:19 +02:00
editor_data . get_undo_redo ( ) . add_undo_method ( this , " set_current_version " , saved_version ) ;
editor_data . get_undo_redo ( ) . commit_action ( ) ;
2015-06-14 03:12:53 +02:00
}
2014-06-19 07:23:03 +02:00
2015-11-21 17:42:15 +01:00
void EditorNode : : _toggle_search_bar ( bool p_pressed ) {
property_editor - > set_use_filter ( p_pressed ) ;
if ( p_pressed ) {
search_bar - > show ( ) ;
search_box - > grab_focus ( ) ;
search_box - > select_all ( ) ;
} else {
search_bar - > hide ( ) ;
}
}
void EditorNode : : _clear_search_box ( ) {
if ( search_box - > get_text ( ) = = " " )
return ;
search_box - > clear ( ) ;
property_editor - > update_tree ( ) ;
}
2016-01-18 00:03:57 +01:00
ToolButton * EditorNode : : add_bottom_panel_item ( String p_text , Control * p_item ) {
ToolButton * tb = memnew ( ToolButton ) ;
tb - > connect ( " toggled " , this , " _bottom_panel_switch " , varray ( bottom_panel_items . size ( ) ) ) ;
tb - > set_text ( p_text ) ;
tb - > set_toggle_mode ( true ) ;
tb - > set_focus_mode ( Control : : FOCUS_NONE ) ;
bottom_panel_vb - > add_child ( p_item ) ;
bottom_panel_hb - > raise ( ) ;
bottom_panel_hb - > add_child ( tb ) ;
p_item - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
p_item - > hide ( ) ;
BottomPanelItem bpi ;
bpi . button = tb ;
bpi . control = p_item ;
bpi . name = p_text ;
bottom_panel_items . push_back ( bpi ) ;
return tb ;
}
2016-01-24 16:26:03 +01:00
bool EditorNode : : are_bottom_panels_hidden ( ) const {
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
if ( bottom_panel_items [ i ] . button - > is_pressed ( ) )
return false ;
}
return true ;
}
2016-01-18 00:03:57 +01:00
void EditorNode : : hide_bottom_panel ( ) {
_bottom_panel_switch ( false , 0 ) ;
}
void EditorNode : : make_bottom_panel_item_visible ( Control * p_item ) {
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
if ( bottom_panel_items [ i ] . control = = p_item ) {
_bottom_panel_switch ( true , i ) ;
break ;
}
}
}
void EditorNode : : raise_bottom_panel_item ( Control * p_item ) {
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
if ( bottom_panel_items [ i ] . control = = p_item ) {
bottom_panel_items [ i ] . button - > raise ( ) ;
SWAP ( bottom_panel_items [ i ] , bottom_panel_items [ bottom_panel_items . size ( ) - 1 ] ) ;
break ;
}
}
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
bottom_panel_items [ i ] . button - > disconnect ( " toggled " , this , " _bottom_panel_switch " ) ;
bottom_panel_items [ i ] . button - > connect ( " toggled " , this , " _bottom_panel_switch " , varray ( i ) ) ;
}
}
2016-02-28 20:58:17 +01:00
void EditorNode : : remove_bottom_panel_item ( Control * p_item ) {
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
if ( bottom_panel_items [ i ] . control = = p_item ) {
if ( p_item - > is_visible ( ) ) {
_bottom_panel_switch ( false , 0 ) ;
}
bottom_panel_vb - > remove_child ( bottom_panel_items [ i ] . control ) ;
bottom_panel_hb - > remove_child ( bottom_panel_items [ i ] . button ) ;
memdelete ( bottom_panel_items [ i ] . button ) ;
bottom_panel_items . remove ( i ) ;
break ;
}
}
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
bottom_panel_items [ i ] . button - > disconnect ( " toggled " , this , " _bottom_panel_switch " ) ;
bottom_panel_items [ i ] . button - > connect ( " toggled " , this , " _bottom_panel_switch " , varray ( i ) ) ;
}
}
2016-01-18 00:03:57 +01:00
void EditorNode : : _bottom_panel_switch ( bool p_enable , int p_idx ) {
ERR_FAIL_INDEX ( p_idx , bottom_panel_items . size ( ) ) ;
if ( p_enable ) {
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
bottom_panel_items [ i ] . button - > set_pressed ( i = = p_idx ) ;
bottom_panel_items [ i ] . control - > set_hidden ( i ! = p_idx ) ;
}
center_split - > set_dragger_visibility ( SplitContainer : : DRAGGER_VISIBLE ) ;
center_split - > set_collapsed ( false ) ;
} else {
for ( int i = 0 ; i < bottom_panel_items . size ( ) ; i + + ) {
bottom_panel_items [ i ] . button - > set_pressed ( false ) ;
bottom_panel_items [ i ] . control - > set_hidden ( true ) ;
}
center_split - > set_dragger_visibility ( SplitContainer : : DRAGGER_HIDDEN ) ;
center_split - > set_collapsed ( true ) ;
}
}
2016-05-30 20:29:43 +02:00
void EditorNode : : set_docks_visible ( bool p_show ) {
docks_visible = p_show ;
_update_dock_slots_visibility ( ) ;
}
bool EditorNode : : get_docks_visible ( ) const {
return docks_visible ;
}
void EditorNode : : set_distraction_free_mode ( bool p_enter ) {
distraction_free_mode = p_enter ;
if ( p_enter ) {
if ( docks_visible ) {
set_docks_visible ( false ) ;
}
} else {
set_docks_visible ( true ) ;
}
_update_top_menu_visibility ( ) ;
}
bool EditorNode : : get_distraction_free_mode ( ) const {
return distraction_free_mode ;
}
2016-02-28 03:10:44 +01:00
void EditorNode : : add_control_to_dock ( DockSlot p_slot , Control * p_control ) {
ERR_FAIL_INDEX ( p_slot , DOCK_SLOT_MAX ) ;
dock_slot [ p_slot ] - > add_child ( p_control ) ;
_update_dock_slots_visibility ( ) ;
}
void EditorNode : : remove_control_from_dock ( Control * p_control ) {
Control * dock = NULL ;
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
if ( p_control - > get_parent ( ) = = dock_slot [ i ] ) {
dock = dock_slot [ i ] ;
break ;
}
}
ERR_EXPLAIN ( " Control was not in dock " ) ;
ERR_FAIL_COND ( ! dock ) ;
dock - > remove_child ( p_control ) ;
_update_dock_slots_visibility ( ) ;
}
2016-05-11 16:46:08 +02:00
Variant EditorNode : : drag_resource ( const Ref < Resource > & p_res , Control * p_from ) {
Control * drag_control = memnew ( Control ) ;
TextureFrame * drag_preview = memnew ( TextureFrame ) ;
Label * label = memnew ( Label ) ;
2016-05-27 19:18:40 +02:00
waiting_for_sources_changed = true ; //
2016-05-11 16:46:08 +02:00
Ref < Texture > preview ;
{
//todo make proper previews
Ref < ImageTexture > pic = gui_base - > get_icon ( " FileBig " , " EditorIcons " ) ;
Image img = pic - > get_data ( ) ;
img . resize ( 48 , 48 ) ; //meh
Ref < ImageTexture > resized_pic = Ref < ImageTexture > ( memnew ( ImageTexture ) ) ;
resized_pic - > create_from_image ( img ) ;
preview = resized_pic ;
}
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 ( ) ) ;
} else if ( p_res - > get_name ( ) ! = " " ) {
label - > set_text ( p_res - > get_name ( ) ) ;
} else {
label - > set_text ( p_res - > get_type ( ) ) ;
}
drag_control - > add_child ( label ) ;
p_from - > set_drag_preview ( drag_control ) ; //wait until it enters scene
label - > set_pos ( Point2 ( ( preview - > get_width ( ) - label - > get_minimum_size ( ) . width ) / 2 , preview - > get_height ( ) ) ) ;
Dictionary drag_data ;
drag_data [ " type " ] = " resource " ;
drag_data [ " resource " ] = p_res ;
drag_data [ " from " ] = p_from ;
return drag_data ;
}
Variant EditorNode : : drag_files ( const Vector < String > & p_files , Control * p_from ) {
VBoxContainer * files = memnew ( VBoxContainer ) ;
int max_files = 6 ;
for ( int i = 0 ; i < MIN ( max_files , p_files . size ( ) ) ; i + + ) {
Label * label = memnew ( Label ) ;
label - > set_text ( p_files [ i ] . get_file ( ) ) ;
files - > add_child ( label ) ;
}
if ( p_files . size ( ) > max_files ) {
Label * label = memnew ( Label ) ;
2016-05-21 16:34:56 +02:00
label - > set_text ( vformat ( TTR ( " %d more file(s) " ) , p_files . size ( ) - max_files ) ) ;
2016-05-11 16:46:08 +02:00
files - > add_child ( label ) ;
}
Dictionary drag_data ;
drag_data [ " type " ] = " files " ;
drag_data [ " files " ] = p_files ;
drag_data [ " from " ] = p_from ;
p_from - > set_drag_preview ( files ) ; //wait until it enters scene
return drag_data ;
}
Variant EditorNode : : drag_files_and_dirs ( const Vector < String > & p_files , Control * p_from ) {
VBoxContainer * files = memnew ( VBoxContainer ) ;
int max_files = 6 ;
for ( int i = 0 ; i < MIN ( max_files , p_files . size ( ) ) ; i + + ) {
Label * label = memnew ( Label ) ;
label - > set_text ( p_files [ i ] . get_file ( ) ) ;
files - > add_child ( label ) ;
}
if ( p_files . size ( ) > max_files ) {
Label * label = memnew ( Label ) ;
2016-05-21 16:34:56 +02:00
label - > set_text ( vformat ( TTR ( " %d more file(s) or folder(s) " ) , p_files . size ( ) - max_files ) ) ;
2016-05-11 16:46:08 +02:00
files - > add_child ( label ) ;
}
Dictionary drag_data ;
drag_data [ " type " ] = " files_and_dirs " ;
drag_data [ " files " ] = p_files ;
drag_data [ " from " ] = p_from ;
p_from - > set_drag_preview ( files ) ; //wait until it enters scene
return drag_data ;
}
2016-05-27 19:18:40 +02:00
void EditorNode : : _dropped_files ( const Vector < String > & p_files , int p_screen ) {
2017-01-21 13:07:29 +01:00
String cur_path = filesystem_dock - > get_current_path ( ) ;
2016-05-27 19:18:40 +02:00
for ( int i = 0 ; i < EditorImportExport : : get_singleton ( ) - > get_import_plugin_count ( ) ; i + + ) {
EditorImportExport : : get_singleton ( ) - > get_import_plugin ( i ) - > import_from_drop ( p_files , cur_path ) ;
}
}
2016-06-13 15:10:50 +02:00
void EditorNode : : _file_access_close_error_notify ( const String & p_str ) {
add_io_error ( " Unable to write to file ' " + p_str + " ', file in use, locked or lacking permissions. " ) ;
}
2016-05-27 19:18:40 +02:00
2016-06-28 23:53:31 +02:00
void EditorNode : : reload_scene ( const String & p_path ) {
//first of all, reload textures as they might have changed on disk
List < Ref < Resource > > cached ;
ResourceCache : : get_cached_resources ( & cached ) ;
List < Ref < Resource > > to_clear ; //clear internal resources from previous scene from being used
for ( List < Ref < Resource > > : : Element * E = cached . front ( ) ; E ; E = E - > next ( ) ) {
if ( E - > get ( ) - > get_path ( ) . begins_with ( p_path + " :: " ) ) //subresources of existing scene
to_clear . push_back ( E - > get ( ) ) ;
if ( ! E - > get ( ) - > cast_to < Texture > ( ) )
continue ;
if ( ! E - > get ( ) - > get_path ( ) . is_resource_file ( ) & & ! E - > get ( ) - > get_path ( ) . is_abs_path ( ) )
continue ;
if ( ! FileAccess : : exists ( E - > get ( ) - > get_path ( ) ) )
continue ;
uint64_t mt = FileAccess : : get_modified_time ( E - > get ( ) - > get_path ( ) ) ;
if ( mt ! = E - > get ( ) - > get_last_modified_time ( ) ) {
E - > get ( ) - > reload_from_file ( ) ;
}
}
//so reload reloads everything, clear subresources of previous scene
while ( to_clear . front ( ) ) {
to_clear . front ( ) - > get ( ) - > set_path ( " " ) ;
to_clear . pop_front ( ) ;
}
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 ;
break ;
}
}
int current_tab = editor_data . get_edited_scene ( ) ;
if ( scene_idx = = - 1 ) {
if ( get_edited_scene ( ) ) {
//scene is not open, so at it might be instanced, just refresh, set tab to itself and it will reload
set_current_scene ( current_tab ) ;
editor_data . get_undo_redo ( ) . clear_history ( ) ;
}
return ;
}
if ( current_tab = = scene_idx ) {
editor_data . apply_changes_in_editors ( ) ;
_set_scene_metadata ( p_path ) ;
}
//remove scene
_remove_scene ( scene_idx ) ;
//reload scene
load_scene ( p_path ) ;
//adjust index so tab is back a the previous position
editor_data . move_edited_scene_to_index ( scene_idx ) ;
get_undo_redo ( ) - > clear_history ( ) ;
//recover the tab
scene_tabs - > set_current_tab ( current_tab ) ;
_scene_tab_changed ( current_tab ) ;
}
2016-01-18 00:03:57 +01:00
void EditorNode : : _bind_methods ( ) {
ObjectTypeDB : : bind_method ( " _menu_option " , & EditorNode : : _menu_option ) ;
ObjectTypeDB : : bind_method ( " _menu_confirm_current " , & EditorNode : : _menu_confirm_current ) ;
ObjectTypeDB : : bind_method ( " _dialog_action " , & EditorNode : : _dialog_action ) ;
ObjectTypeDB : : bind_method ( " _resource_selected " , & EditorNode : : _resource_selected , DEFVAL ( " " ) ) ;
ObjectTypeDB : : bind_method ( " _property_editor_forward " , & EditorNode : : _property_editor_forward ) ;
ObjectTypeDB : : bind_method ( " _property_editor_back " , & EditorNode : : _property_editor_back ) ;
ObjectTypeDB : : bind_method ( " _editor_select " , & EditorNode : : _editor_select ) ;
ObjectTypeDB : : bind_method ( " _node_renamed " , & EditorNode : : _node_renamed ) ;
ObjectTypeDB : : bind_method ( " edit_node " , & EditorNode : : edit_node ) ;
ObjectTypeDB : : bind_method ( " _imported " , & EditorNode : : _imported ) ;
ObjectTypeDB : : bind_method ( " _unhandled_input " , & EditorNode : : _unhandled_input ) ;
ObjectTypeDB : : bind_method ( " _get_scene_metadata " , & EditorNode : : _get_scene_metadata ) ;
ObjectTypeDB : : bind_method ( " set_edited_scene " , & EditorNode : : set_edited_scene ) ;
ObjectTypeDB : : bind_method ( " open_request " , & EditorNode : : open_request ) ;
ObjectTypeDB : : bind_method ( " _instance_request " , & EditorNode : : _instance_request ) ;
ObjectTypeDB : : bind_method ( " update_keying " , & EditorNode : : update_keying ) ;
ObjectTypeDB : : bind_method ( " _property_keyed " , & EditorNode : : _property_keyed ) ;
ObjectTypeDB : : bind_method ( " _transform_keyed " , & EditorNode : : _transform_keyed ) ;
ObjectTypeDB : : bind_method ( " _close_messages " , & EditorNode : : _close_messages ) ;
ObjectTypeDB : : bind_method ( " _show_messages " , & EditorNode : : _show_messages ) ;
ObjectTypeDB : : bind_method ( " _vp_resized " , & EditorNode : : _vp_resized ) ;
ObjectTypeDB : : bind_method ( " _quick_opened " , & EditorNode : : _quick_opened ) ;
ObjectTypeDB : : bind_method ( " _quick_run " , & EditorNode : : _quick_run ) ;
ObjectTypeDB : : bind_method ( " _resource_created " , & EditorNode : : _resource_created ) ;
ObjectTypeDB : : bind_method ( " _import_action " , & EditorNode : : _import_action ) ;
//ObjectTypeDB::bind_method("_import",&EditorNode::_import);
// ObjectTypeDB::bind_method("_import_conflicts_solved",&EditorNode::_import_conflicts_solved);
ObjectTypeDB : : bind_method ( " _open_recent_scene " , & EditorNode : : _open_recent_scene ) ;
// ObjectTypeDB::bind_method("_open_recent_scene_confirm",&EditorNode::_open_recent_scene_confirm);
ObjectTypeDB : : bind_method ( " _save_optimized " , & EditorNode : : _save_optimized ) ;
ObjectTypeDB : : bind_method ( " stop_child_process " , & EditorNode : : stop_child_process ) ;
ObjectTypeDB : : bind_method ( " _sources_changed " , & EditorNode : : _sources_changed ) ;
ObjectTypeDB : : bind_method ( " _fs_changed " , & EditorNode : : _fs_changed ) ;
ObjectTypeDB : : bind_method ( " _dock_select_draw " , & EditorNode : : _dock_select_draw ) ;
ObjectTypeDB : : bind_method ( " _dock_select_input " , & EditorNode : : _dock_select_input ) ;
ObjectTypeDB : : bind_method ( " _dock_pre_popup " , & EditorNode : : _dock_pre_popup ) ;
ObjectTypeDB : : bind_method ( " _dock_split_dragged " , & EditorNode : : _dock_split_dragged ) ;
ObjectTypeDB : : bind_method ( " _save_docks " , & EditorNode : : _save_docks ) ;
ObjectTypeDB : : bind_method ( " _dock_popup_exit " , & EditorNode : : _dock_popup_exit ) ;
ObjectTypeDB : : bind_method ( " _dock_move_left " , & EditorNode : : _dock_move_left ) ;
ObjectTypeDB : : bind_method ( " _dock_move_right " , & EditorNode : : _dock_move_right ) ;
ObjectTypeDB : : bind_method ( " _layout_menu_option " , & EditorNode : : _layout_menu_option ) ;
ObjectTypeDB : : bind_method ( " set_current_scene " , & EditorNode : : set_current_scene ) ;
ObjectTypeDB : : bind_method ( " set_current_version " , & EditorNode : : set_current_version ) ;
ObjectTypeDB : : bind_method ( " _scene_tab_changed " , & EditorNode : : _scene_tab_changed ) ;
ObjectTypeDB : : bind_method ( " _scene_tab_closed " , & EditorNode : : _scene_tab_closed ) ;
ObjectTypeDB : : bind_method ( " _scene_tab_script_edited " , & EditorNode : : _scene_tab_script_edited ) ;
ObjectTypeDB : : bind_method ( " _set_main_scene_state " , & EditorNode : : _set_main_scene_state ) ;
ObjectTypeDB : : bind_method ( " _update_scene_tabs " , & EditorNode : : _update_scene_tabs ) ;
ObjectTypeDB : : bind_method ( " _prepare_history " , & EditorNode : : _prepare_history ) ;
ObjectTypeDB : : bind_method ( " _select_history " , & EditorNode : : _select_history ) ;
ObjectTypeDB : : bind_method ( " _toggle_search_bar " , & EditorNode : : _toggle_search_bar ) ;
ObjectTypeDB : : bind_method ( " _clear_search_box " , & EditorNode : : _clear_search_box ) ;
ObjectTypeDB : : bind_method ( " _clear_undo_history " , & EditorNode : : _clear_undo_history ) ;
2016-05-27 19:18:40 +02:00
ObjectTypeDB : : bind_method ( " _dropped_files " , & EditorNode : : _dropped_files ) ;
2016-01-18 00:03:57 +01:00
ObjectTypeDB : : bind_method ( _MD ( " add_editor_import_plugin " , " plugin " ) , & EditorNode : : add_editor_import_plugin ) ;
ObjectTypeDB : : bind_method ( _MD ( " remove_editor_import_plugin " , " plugin " ) , & EditorNode : : remove_editor_import_plugin ) ;
ObjectTypeDB : : bind_method ( _MD ( " get_gui_base " ) , & EditorNode : : get_gui_base ) ;
ObjectTypeDB : : bind_method ( _MD ( " _bottom_panel_switch " ) , & EditorNode : : _bottom_panel_switch ) ;
ADD_SIGNAL ( MethodInfo ( " play_pressed " ) ) ;
ADD_SIGNAL ( MethodInfo ( " pause_pressed " ) ) ;
ADD_SIGNAL ( MethodInfo ( " stop_pressed " ) ) ;
2016-06-03 22:04:44 +02:00
ADD_SIGNAL ( MethodInfo ( " request_help " ) ) ;
2016-01-18 00:03:57 +01:00
ADD_SIGNAL ( MethodInfo ( " script_add_function_request " , PropertyInfo ( Variant : : OBJECT , " obj " ) , PropertyInfo ( Variant : : STRING , " function " ) , PropertyInfo ( Variant : : STRING_ARRAY , " args " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " resource_saved " , PropertyInfo ( Variant : : OBJECT , " obj " ) ) ) ;
}
2014-02-10 02:10:30 +01:00
EditorNode : : EditorNode ( ) {
2014-02-16 01:16:33 +01:00
EditorHelp : : generate_doc ( ) ; //before any editor classes are crated
2015-10-17 00:11:23 +02:00
SceneState : : set_disable_placeholders ( true ) ;
2016-03-12 14:44:12 +01:00
editor_initialize_certificates ( ) ; //for asset sharing
2014-02-10 02:10:30 +01:00
2015-09-24 23:06:15 +02:00
InputDefault * id = Input : : get_singleton ( ) - > cast_to < InputDefault > ( ) ;
if ( id ) {
if ( ! OS : : get_singleton ( ) - > has_touchscreen_ui_hint ( ) & & Input : : get_singleton ( ) ) {
//only if no touchscreen ui hint, set emulation
2015-08-29 22:16:11 +02:00
id - > set_emulate_touch ( false ) ; //just disable just in case
2015-09-24 23:06:15 +02:00
}
id - > set_custom_mouse_cursor ( RES ( ) ) ;
2015-08-29 22:16:11 +02:00
}
2014-02-10 02:10:30 +01:00
singleton = this ;
2016-06-08 03:08:12 +02:00
exiting = false ;
2015-06-22 05:03:19 +02:00
last_checked_version = 0 ;
changing_scene = false ;
2016-02-28 03:10:44 +01:00
_initializing_addons = false ;
2016-05-30 20:29:43 +02:00
docks_visible = true ;
distraction_free_mode = false ;
2014-02-10 02:10:30 +01:00
FileAccess : : set_backup_save ( true ) ;
PathRemap : : get_singleton ( ) - > clear_remaps ( ) ; ; //editor uses no remaps
TranslationServer : : get_singleton ( ) - > set_enabled ( false ) ;
// load settings
if ( ! EditorSettings : : get_singleton ( ) )
EditorSettings : : create ( ) ;
2016-06-05 23:43:45 +02:00
{
2016-06-06 07:37:58 +02:00
int dpi_mode = EditorSettings : : get_singleton ( ) - > get ( " global/hidpi_mode " ) ;
2016-06-05 23:43:45 +02:00
if ( dpi_mode = = 0 ) {
editor_set_hidpi ( OS : : get_singleton ( ) - > get_screen_dpi ( 0 ) > 150 ) ;
} else if ( dpi_mode = = 2 ) {
editor_set_hidpi ( true ) ;
} else {
editor_set_hidpi ( false ) ;
}
}
2014-02-10 02:10:30 +01:00
ResourceLoader : : set_abort_on_missing_resources ( false ) ;
2015-03-23 17:44:03 +01:00
FileDialog : : set_default_show_hidden_files ( EditorSettings : : get_singleton ( ) - > get ( " file_dialog/show_hidden_files " ) ) ;
2015-12-06 23:35:31 +01:00
EditorFileDialog : : set_default_show_hidden_files ( EditorSettings : : get_singleton ( ) - > get ( " file_dialog/show_hidden_files " ) ) ;
2015-12-15 17:39:13 +01:00
EditorFileDialog : : set_default_display_mode ( ( EditorFileDialog : : DisplayMode ) EditorSettings : : get_singleton ( ) - > get ( " file_dialog/display_mode " ) . operator int ( ) ) ;
2014-02-10 02:10:30 +01:00
ResourceLoader : : set_error_notify_func ( this , _load_error_notify ) ;
2015-08-24 01:15:56 +02:00
ResourceLoader : : set_dependency_error_notify_func ( this , _dependency_error_report ) ;
2014-02-10 02:10:30 +01:00
ResourceLoader : : set_timestamp_on_load ( true ) ;
ResourceSaver : : set_timestamp_on_save ( true ) ;
_pvrtc_register_compressors ( ) ;
editor_selection = memnew ( EditorSelection ) ;
EditorFileSystem * efs = memnew ( EditorFileSystem ) ;
add_child ( efs ) ;
//used for previews
FileDialog : : get_icon_func = _file_dialog_get_icon ;
FileDialog : : register_func = _file_dialog_register ;
FileDialog : : unregister_func = _file_dialog_unregister ;
2015-05-31 06:59:42 +02:00
EditorFileDialog : : get_icon_func = _file_dialog_get_icon ;
EditorFileDialog : : register_func = _editor_file_dialog_register ;
EditorFileDialog : : unregister_func = _editor_file_dialog_unregister ;
2014-02-10 02:10:30 +01:00
editor_import_export = memnew ( EditorImportExport ) ;
2015-04-21 00:38:02 +02:00
add_child ( editor_import_export ) ;
2014-02-10 02:10:30 +01:00
register_exporters ( ) ;
editor_import_export - > load_config ( ) ;
2016-12-21 15:32:52 +01:00
GLOBAL_DEF ( " editor/main_run_args " , " $scene " ) ;
2014-02-10 02:10:30 +01:00
ObjectTypeDB : : set_type_enabled ( " CollisionShape " , true ) ;
ObjectTypeDB : : set_type_enabled ( " CollisionShape2D " , true ) ;
ObjectTypeDB : : set_type_enabled ( " CollisionPolygon2D " , true ) ;
2016-06-17 06:13:23 +02:00
Control * theme_base = memnew ( Control ) ;
add_child ( theme_base ) ;
theme_base - > set_area_as_parent_rect ( ) ;
2014-02-10 02:10:30 +01:00
gui_base = memnew ( Panel ) ;
2016-06-17 06:13:23 +02:00
theme_base - > add_child ( gui_base ) ;
2014-02-10 02:10:30 +01:00
gui_base - > set_area_as_parent_rect ( ) ;
2016-06-18 07:32:03 +02:00
theme_base - > set_theme ( create_default_theme ( ) ) ;
theme = create_editor_theme ( ) ;
gui_base - > set_theme ( theme ) ;
2016-06-17 06:13:23 +02:00
2015-05-31 06:59:42 +02:00
resource_preview = memnew ( EditorResourcePreview ) ;
add_child ( resource_preview ) ;
2014-02-10 02:10:30 +01:00
progress_dialog = memnew ( ProgressDialog ) ;
gui_base - > add_child ( progress_dialog ) ;
// take up all screen
gui_base - > set_anchor ( MARGIN_RIGHT , Control : : ANCHOR_END ) ;
gui_base - > set_anchor ( MARGIN_BOTTOM , Control : : ANCHOR_END ) ;
gui_base - > set_end ( Point2 ( 0 , 0 ) ) ;
2015-06-22 05:03:19 +02:00
2014-02-10 02:10:30 +01:00
main_vbox = memnew ( VBoxContainer ) ;
gui_base - > add_child ( main_vbox ) ;
main_vbox - > set_area_as_parent_rect ( 8 ) ;
2015-11-18 08:47:41 +01:00
#if 0
2015-06-22 05:03:19 +02:00
PanelContainer * top_dark_panel = memnew ( PanelContainer ) ;
Ref < StyleBoxTexture > top_dark_sb ;
top_dark_sb . instance ( ) ; ;
top_dark_sb - > set_texture ( theme - > get_icon ( " PanelTop " , " EditorIcons " ) ) ;
for ( int i = 0 ; i < 4 ; i + + ) {
top_dark_sb - > set_margin_size ( Margin ( i ) , 3 ) ;
top_dark_sb - > set_default_margin ( Margin ( i ) , 0 ) ;
}
top_dark_sb - > set_expand_margin_size ( MARGIN_LEFT , 20 ) ;
top_dark_sb - > set_expand_margin_size ( MARGIN_RIGHT , 20 ) ;
top_dark_panel - > add_style_override ( " panel " , top_dark_sb ) ;
VBoxContainer * top_dark_vb = memnew ( VBoxContainer ) ;
main_vbox - > add_child ( top_dark_panel ) ;
top_dark_panel - > add_child ( top_dark_vb ) ;
2015-11-18 08:47:41 +01:00
# endif
2015-06-22 05:03:19 +02:00
2014-02-10 02:10:30 +01:00
menu_hb = memnew ( HBoxContainer ) ;
2015-11-18 08:47:41 +01:00
main_vbox - > add_child ( menu_hb ) ;
2014-02-10 02:10:30 +01:00
2015-11-18 08:47:41 +01:00
// top_dark_vb->add_child(scene_tabs);
2015-06-14 03:12:53 +02:00
//left
left_l_hsplit = memnew ( HSplitContainer ) ;
main_vbox - > add_child ( left_l_hsplit ) ;
left_l_hsplit - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
left_l_vsplit = memnew ( VSplitContainer ) ;
left_l_hsplit - > add_child ( left_l_vsplit ) ;
dock_slot [ DOCK_SLOT_LEFT_UL ] = memnew ( TabContainer ) ;
left_l_vsplit - > add_child ( dock_slot [ DOCK_SLOT_LEFT_UL ] ) ;
dock_slot [ DOCK_SLOT_LEFT_BL ] = memnew ( TabContainer ) ;
left_l_vsplit - > add_child ( dock_slot [ DOCK_SLOT_LEFT_BL ] ) ;
left_l_vsplit - > hide ( ) ;
dock_slot [ DOCK_SLOT_LEFT_UL ] - > hide ( ) ;
dock_slot [ DOCK_SLOT_LEFT_BL ] - > hide ( ) ;
left_r_hsplit = memnew ( HSplitContainer ) ;
left_l_hsplit - > add_child ( left_r_hsplit ) ;
left_r_vsplit = memnew ( VSplitContainer ) ;
left_r_hsplit - > add_child ( left_r_vsplit ) ;
dock_slot [ DOCK_SLOT_LEFT_UR ] = memnew ( TabContainer ) ;
left_r_vsplit - > add_child ( dock_slot [ DOCK_SLOT_LEFT_UR ] ) ;
dock_slot [ DOCK_SLOT_LEFT_BR ] = memnew ( TabContainer ) ;
left_r_vsplit - > add_child ( dock_slot [ DOCK_SLOT_LEFT_BR ] ) ;
//left_r_vsplit->hide();
//dock_slot[DOCK_SLOT_LEFT_UR]->hide();
//dock_slot[DOCK_SLOT_LEFT_BR]->hide();
main_hsplit = memnew ( HSplitContainer ) ;
left_r_hsplit - > add_child ( main_hsplit ) ;
//main_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2015-11-18 08:47:41 +01:00
VBoxContainer * center_vb = memnew ( VBoxContainer ) ;
main_hsplit - > add_child ( center_vb ) ;
center_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2015-06-14 03:12:53 +02:00
center_split = memnew ( VSplitContainer ) ;
2015-11-18 08:47:41 +01:00
//main_hsplit->add_child(center_split);
center_split - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2015-06-14 03:12:53 +02:00
center_split - > set_collapsed ( false ) ;
2015-11-18 08:47:41 +01:00
center_vb - > add_child ( center_split ) ;
2015-06-14 03:12:53 +02:00
right_hsplit = memnew ( HSplitContainer ) ;
main_hsplit - > add_child ( right_hsplit ) ;
right_l_vsplit = memnew ( VSplitContainer ) ;
right_hsplit - > add_child ( right_l_vsplit ) ;
dock_slot [ DOCK_SLOT_RIGHT_UL ] = memnew ( TabContainer ) ;
right_l_vsplit - > add_child ( dock_slot [ DOCK_SLOT_RIGHT_UL ] ) ;
dock_slot [ DOCK_SLOT_RIGHT_BL ] = memnew ( TabContainer ) ;
right_l_vsplit - > add_child ( dock_slot [ DOCK_SLOT_RIGHT_BL ] ) ;
2015-08-09 21:59:13 +02:00
//right_l_vsplit->hide();
//dock_slot[DOCK_SLOT_RIGHT_UL]->hide();
//dock_slot[DOCK_SLOT_RIGHT_BL]->hide();
2015-06-14 03:12:53 +02:00
right_r_vsplit = memnew ( VSplitContainer ) ;
right_hsplit - > add_child ( right_r_vsplit ) ;
dock_slot [ DOCK_SLOT_RIGHT_UR ] = memnew ( TabContainer ) ;
right_r_vsplit - > add_child ( dock_slot [ DOCK_SLOT_RIGHT_UR ] ) ;
dock_slot [ DOCK_SLOT_RIGHT_BR ] = memnew ( TabContainer ) ;
right_r_vsplit - > add_child ( dock_slot [ DOCK_SLOT_RIGHT_BR ] ) ;
right_r_vsplit - > hide ( ) ;
2015-08-09 21:59:13 +02:00
dock_slot [ DOCK_SLOT_RIGHT_UR ] - > hide ( ) ;
dock_slot [ DOCK_SLOT_RIGHT_BR ] - > hide ( ) ;
2015-06-14 03:12:53 +02:00
left_l_vsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
left_r_vsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
right_l_vsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
right_r_vsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
2015-06-22 05:03:19 +02:00
left_l_hsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
left_r_hsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
main_hsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
right_hsplit - > connect ( " dragged " , this , " _dock_split_dragged " ) ;
2015-06-14 03:12:53 +02:00
dock_select_popoup = memnew ( PopupPanel ) ;
gui_base - > add_child ( dock_select_popoup ) ;
VBoxContainer * dock_vb = memnew ( VBoxContainer ) ;
dock_select_popoup - > add_child ( dock_vb ) ;
HBoxContainer * dock_hb = memnew ( HBoxContainer ) ;
dock_tab_move_left = memnew ( ToolButton ) ;
dock_tab_move_left - > set_icon ( theme - > get_icon ( " Back " , " EditorIcons " ) ) ;
dock_tab_move_left - > set_focus_mode ( Control : : FOCUS_NONE ) ;
2015-06-14 05:41:08 +02:00
dock_tab_move_left - > connect ( " pressed " , this , " _dock_move_left " ) ;
2015-06-14 03:12:53 +02:00
//dock_tab_move_left->set_h_size_flags(Control::SIZE_EXPAND_FILL);
dock_hb - > add_child ( dock_tab_move_left ) ;
dock_hb - > add_spacer ( ) ;
dock_tab_move_right = memnew ( ToolButton ) ;
dock_tab_move_right - > set_icon ( theme - > get_icon ( " Forward " , " EditorIcons " ) ) ;
dock_tab_move_right - > set_focus_mode ( Control : : FOCUS_NONE ) ;
2015-06-14 05:41:08 +02:00
dock_tab_move_right - > connect ( " pressed " , this , " _dock_move_right " ) ;
2015-06-14 03:12:53 +02:00
//dock_tab_move_right->set_h_size_flags(Control::SIZE_EXPAND_FILL);
dock_hb - > add_child ( dock_tab_move_right ) ;
dock_vb - > add_child ( dock_hb ) ;
dock_select = memnew ( Control ) ;
2016-05-30 05:28:29 +02:00
dock_select - > set_custom_minimum_size ( Size2 ( 128 , 64 ) * EDSCALE ) ;
2015-06-14 03:12:53 +02:00
dock_select - > connect ( " input_event " , this , " _dock_select_input " ) ;
dock_select - > connect ( " draw " , this , " _dock_select_draw " ) ;
2015-06-14 05:41:08 +02:00
dock_select - > connect ( " mouse_exit " , this , " _dock_popup_exit " ) ;
2015-06-14 03:12:53 +02:00
dock_select - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
dock_vb - > add_child ( dock_select ) ;
dock_select_popoup - > set_child_rect ( dock_vb ) ;
dock_select_popoup - > set_as_minsize ( ) ;
dock_select_rect_over = - 1 ;
dock_popup_selected = - 1 ;
//dock_select_popoup->set_(Size2(20,20));
for ( int i = 0 ; i < DOCK_SLOT_MAX ; i + + ) {
2016-05-30 05:28:29 +02:00
dock_slot [ i ] - > set_custom_minimum_size ( Size2 ( 230 , 220 ) * EDSCALE ) ;
2015-06-14 03:12:53 +02:00
dock_slot [ i ] - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
dock_slot [ i ] - > set_popup ( dock_select_popoup ) ;
dock_slot [ i ] - > connect ( " pre_popup_pressed " , this , " _dock_pre_popup " , varray ( i ) ) ;
//dock_slot[i]->set_tab_align(TabContainer::ALIGN_LEFT);
}
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
dock_drag_timer = memnew ( Timer ) ;
add_child ( dock_drag_timer ) ;
dock_drag_timer - > set_wait_time ( 0.5 ) ;
dock_drag_timer - > set_one_shot ( true ) ;
dock_drag_timer - > connect ( " timeout " , this , " _save_docks " ) ;
2014-02-10 02:10:30 +01:00
top_split = memnew ( VSplitContainer ) ;
2015-06-14 03:12:53 +02:00
center_split - > add_child ( top_split ) ;
2014-02-10 02:10:30 +01:00
top_split - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
top_split - > set_collapsed ( true ) ;
VBoxContainer * srt = memnew ( VBoxContainer ) ;
srt - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
top_split - > add_child ( srt ) ;
srt - > add_constant_override ( " separation " , 0 ) ;
2015-11-18 08:47:41 +01:00
/* main_editor_tabs = memnew( Tabs );
2014-02-10 02:10:30 +01:00
main_editor_tabs - > connect ( " tab_changed " , this , " _editor_select " ) ;
2015-08-18 20:27:01 +02:00
main_editor_tabs - > set_tab_close_display_policy ( Tabs : : SHOW_NEVER ) ;
2015-11-18 08:47:41 +01:00
*/
scene_tabs = memnew ( Tabs ) ;
scene_tabs - > add_tab ( " unsaved " ) ;
scene_tabs - > set_tab_align ( Tabs : : ALIGN_CENTER ) ;
2016-02-20 02:41:29 +01:00
scene_tabs - > set_tab_close_display_policy ( ( bool ( EDITOR_DEF ( " global/always_show_close_button_in_scene_tabs " , false ) ) ? Tabs : : CLOSE_BUTTON_SHOW_ALWAYS : Tabs : : CLOSE_BUTTON_SHOW_ACTIVE_ONLY ) ) ;
2015-11-18 08:47:41 +01:00
scene_tabs - > connect ( " tab_changed " , this , " _scene_tab_changed " ) ;
scene_tabs - > connect ( " right_button_pressed " , this , " _scene_tab_script_edited " ) ;
scene_tabs - > connect ( " tab_close " , this , " _scene_tab_closed " ) ;
srt - > add_child ( scene_tabs ) ;
2014-02-10 02:10:30 +01:00
2016-02-08 17:01:54 +01:00
scene_root_parent = memnew ( PanelContainer ) ;
2016-05-30 05:28:29 +02:00
scene_root_parent - > set_custom_minimum_size ( Size2 ( 0 , 80 ) * EDSCALE ) ;
2016-02-08 17:01:54 +01:00
//Ref<StyleBox> sp = scene_root_parent->get_stylebox("panel","TabContainer");
//scene_root_parent->add_style_override("panel",sp);
2014-02-10 02:10:30 +01:00
/*scene_root_parent->set_anchor( MARGIN_RIGHT, Control::ANCHOR_END );
scene_root_parent - > set_anchor ( MARGIN_BOTTOM , Control : : ANCHOR_END ) ;
scene_root_parent - > set_begin ( Point2 ( 0 , 0 ) ) ;
scene_root_parent - > set_end ( Point2 ( 0 , 80 ) ) ; */
srt - > add_child ( scene_root_parent ) ;
scene_root_parent - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
scene_root = memnew ( Viewport ) ;
2015-03-16 04:47:37 +01:00
2014-02-10 02:10:30 +01:00
//scene_root_base->add_child(scene_root);
2016-01-17 02:41:10 +01:00
//scene_root->set_meta("_editor_disable_input",true);
2014-02-10 02:10:30 +01:00
VisualServer : : get_singleton ( ) - > viewport_set_hide_scenario ( scene_root - > get_viewport ( ) , true ) ;
2016-01-17 02:41:10 +01:00
scene_root - > set_disable_input ( true ) ;
2014-02-10 02:10:30 +01:00
scene_root - > set_as_audio_listener_2d ( true ) ;
scene_root - > set_size_override ( true , Size2 ( Globals : : get_singleton ( ) - > get ( " display/width " ) , Globals : : get_singleton ( ) - > get ( " display/height " ) ) ) ;
// scene_root->set_world_2d( Ref<World2D>( memnew( World2D )) );
2016-02-08 17:01:54 +01:00
viewport = memnew ( VBoxContainer ) ;
viewport - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
/*for(int i=0;i<4;i++) {
2014-02-10 02:10:30 +01:00
viewport - > set_margin ( Margin ( i ) , sp - > get_margin ( Margin ( i ) ) ) ;
2016-02-08 17:01:54 +01:00
} */
2014-02-10 02:10:30 +01:00
scene_root_parent - > add_child ( viewport ) ;
PanelContainer * top_region = memnew ( PanelContainer ) ;
top_region - > add_style_override ( " panel " , gui_base - > get_stylebox ( " hover " , " Button " ) ) ;
HBoxContainer * left_menu_hb = memnew ( HBoxContainer ) ;
top_region - > add_child ( left_menu_hb ) ;
menu_hb - > add_child ( top_region ) ;
PopupMenu * p ;
file_menu = memnew ( MenuButton ) ;
2016-05-04 03:25:37 +02:00
file_menu - > set_text ( TTR ( " Scene " ) ) ;
2014-02-10 02:10:30 +01:00
//file_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
left_menu_hb - > add_child ( file_menu ) ;
prev_scene = memnew ( ToolButton ) ;
prev_scene - > set_icon ( gui_base - > get_icon ( " PrevScene " , " EditorIcons " ) ) ;
2016-05-04 03:25:37 +02:00
prev_scene - > set_tooltip ( TTR ( " Go to previously opened scene. " ) ) ;
2014-02-10 02:10:30 +01:00
prev_scene - > set_disabled ( true ) ;
//left_menu_hb->add_child( prev_scene );
prev_scene - > connect ( " pressed " , this , " _menu_option " , make_binds ( FILE_OPEN_PREV ) ) ;
2015-04-21 00:38:02 +02:00
gui_base - > add_child ( prev_scene ) ;
2014-02-10 02:10:30 +01:00
prev_scene - > set_pos ( Point2 ( 3 , 24 ) ) ;
2015-04-21 00:38:02 +02:00
prev_scene - > hide ( ) ;
2014-02-10 02:10:30 +01:00
2016-06-15 18:25:17 +02:00
ED_SHORTCUT ( " editor/fullscreen_mode " , TTR ( " Fullscreen Mode " ) , KEY_MASK_SHIFT | KEY_F11 ) ;
ED_SHORTCUT ( " editor/distraction_free_mode " , TTR ( " Distraction Free Mode " ) , KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F11 ) ;
2014-02-10 02:10:30 +01:00
2016-06-25 06:42:09 +02:00
ED_SHORTCUT ( " editor/next_tab " , TTR ( " Next tab " ) , KEY_MASK_CMD + KEY_TAB ) ;
ED_SHORTCUT ( " editor/prev_tab " , TTR ( " Previous tab " ) , KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_TAB ) ;
2017-01-21 13:07:29 +01:00
ED_SHORTCUT ( " editor/filter_files " , TTR ( " Filter Files.. " ) , KEY_MASK_ALT + KEY_MASK_CMD + KEY_P ) ;
2016-06-25 06:42:09 +02:00
2016-05-04 03:25:37 +02:00
file_menu - > set_tooltip ( TTR ( " Operations with scene files. " ) ) ;
2014-02-10 02:10:30 +01:00
p = file_menu - > get_popup ( ) ;
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " editor/new_scene " , TTR ( " New Scene " ) ) , FILE_NEW_SCENE ) ;
p - > add_shortcut ( ED_SHORTCUT ( " editor/new_inherited_scene " , TTR ( " New Inherited Scene.. " ) ) , FILE_NEW_INHERITED_SCENE ) ;
p - > add_shortcut ( ED_SHORTCUT ( " editor/open_scene " , TTR ( " Open Scene.. " ) , KEY_MASK_CMD + KEY_O ) , FILE_OPEN_SCENE ) ;
2015-04-26 04:45:49 +02:00
p - > add_separator ( ) ;
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " editor/save_scene " , TTR ( " Save Scene " ) , KEY_MASK_CMD + KEY_S ) , FILE_SAVE_SCENE ) ;
p - > add_shortcut ( ED_SHORTCUT ( " editor/save_scene_as " , TTR ( " Save Scene As.. " ) , KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S ) , FILE_SAVE_AS_SCENE ) ;
2016-06-26 05:54:17 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " editor/save_all_scenes " , TTR ( " Save all Scenes " ) , KEY_MASK_ALT + KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S ) , FILE_SAVE_ALL_SCENES ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " editor/close_scene " , TTR ( " Close Scene " ) , KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_W ) , FILE_CLOSE ) ;
2015-06-22 05:03:19 +02:00
p - > add_separator ( ) ;
2016-06-05 02:31:29 +02:00
//p->add_shortcut(ED_SHORTCUT("editor/save_scene",TTR("Close Goto Prev. Scene")),FILE_OPEN_PREV,KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_P);
2016-05-04 03:25:37 +02:00
p - > add_submenu_item ( TTR ( " Open Recent " ) , " RecentScenes " , FILE_OPEN_RECENT ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-06-05 02:31:29 +02:00
p - > add_shortcut ( ED_SHORTCUT ( " editor/quick_open_scene " , TTR ( " Quick Open Scene.. " ) , KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_O ) , FILE_QUICK_OPEN_SCENE ) ;
p - > add_shortcut ( ED_SHORTCUT ( " editor/quick_open_script " , TTR ( " Quick Open Script.. " ) , KEY_MASK_ALT + KEY_MASK_CMD + KEY_O ) , FILE_QUICK_OPEN_SCRIPT ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
PopupMenu * pm_export = memnew ( PopupMenu ) ;
pm_export - > set_name ( " Export " ) ;
p - > add_child ( pm_export ) ;
2016-05-04 03:25:37 +02:00
p - > add_submenu_item ( TTR ( " Convert To.. " ) , " Export " ) ;
pm_export - > add_item ( TTR ( " Translatable Strings.. " ) , FILE_DUMP_STRINGS ) ;
2014-02-10 02:10:30 +01:00
pm_export - > add_separator ( ) ;
2016-06-12 04:51:54 +02:00
pm_export - > add_shortcut ( ED_SHORTCUT ( " editor/convert_to_MeshLibrary " , TTR ( " MeshLibrary.. " ) ) , FILE_EXPORT_MESH_LIBRARY ) ;
pm_export - > add_shortcut ( ED_SHORTCUT ( " editor/convert_to_TileSet " , TTR ( " TileSet.. " ) ) , FILE_EXPORT_TILESET ) ;
2014-02-10 02:10:30 +01:00
pm_export - > connect ( " item_pressed " , this , " _menu_option " ) ;
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Undo " ) , EDIT_UNDO , KEY_MASK_CMD + KEY_Z ) ;
p - > add_item ( TTR ( " Redo " ) , EDIT_REDO , KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Z ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Run Script " ) , FILE_RUN_SCRIPT , KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_R ) ;
2014-02-21 03:01:44 +01:00
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Project Settings " ) , RUN_SETTINGS ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Revert Scene " ) , EDIT_REVERT ) ;
2015-01-27 00:51:13 +01:00
p - > add_separator ( ) ;
2016-01-10 19:57:24 +01:00
# ifdef OSX_ENABLED
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Quit to Project List " ) , RUN_PROJECT_MANAGER , KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q ) ;
2016-01-10 19:57:24 +01:00
# else
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Quit to Project List " ) , RUN_PROJECT_MANAGER , KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_Q ) ;
2016-01-10 19:57:24 +01:00
# endif
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Quit " ) , FILE_QUIT , KEY_MASK_CMD + KEY_Q ) ;
2014-02-10 02:10:30 +01:00
recent_scenes = memnew ( PopupMenu ) ;
recent_scenes - > set_name ( " RecentScenes " ) ;
p - > add_child ( recent_scenes ) ;
recent_scenes - > connect ( " item_pressed " , this , " _open_recent_scene " ) ;
2015-11-18 08:47:41 +01:00
{
Control * sp = memnew ( Control ) ;
2016-05-30 05:28:29 +02:00
sp - > set_custom_minimum_size ( Size2 ( 30 , 0 ) * EDSCALE ) ;
2015-11-18 08:47:41 +01:00
menu_hb - > add_child ( sp ) ;
}
PanelContainer * editor_region = memnew ( PanelContainer ) ;
editor_region - > add_style_override ( " panel " , gui_base - > get_stylebox ( " hover " , " Button " ) ) ;
main_editor_button_vb = memnew ( HBoxContainer ) ;
editor_region - > add_child ( main_editor_button_vb ) ;
menu_hb - > add_child ( editor_region ) ;
2014-02-10 02:10:30 +01:00
//menu_hb->add_spacer();
#if 0
node_menu = memnew ( MenuButton ) ;
node_menu - > set_text ( " Node " ) ;
node_menu - > set_pos ( Point2 ( 50 , 0 ) ) ; ;
menu_panel - > add_child ( node_menu ) ;
p = node_menu - > get_popup ( ) ;
2016-05-21 01:18:35 +02:00
p - > add_item ( " Create " , NODE_CREATE ) ;
p - > add_item ( " Instance " , NODE_INSTANCE ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-21 01:18:35 +02:00
p - > add_item ( " Reparent " , NODE_REPARENT ) ;
p - > add_item ( " Move Up " , NODE_MOVE_UP ) ;
p - > add_item ( " Move Down " , NODE_MOVE_DOWN ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-21 01:18:35 +02:00
p - > add_item ( " Duplicate " , NODE_DUPLICATE ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-21 01:18:35 +02:00
p - > add_item ( " Remove (Branch) " , NODE_REMOVE_BRANCH ) ;
p - > add_item ( " Remove (Element) " , NODE_REMOVE_ELEMENT ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-21 01:18:35 +02:00
p - > add_item ( " Edit Subscriptions.. " , NODE_CONNECTIONS ) ;
p - > add_item ( " Edit Groups.. " , NODE_GROUPS ) ;
2014-02-10 02:10:30 +01:00
resource_menu = memnew ( MenuButton ) ;
resource_menu - > set_text ( " Resource " ) ;
resource_menu - > set_pos ( Point2 ( 90 , 0 ) ) ;
menu_panel - > add_child ( resource_menu ) ;
# endif
import_menu = memnew ( MenuButton ) ;
2016-05-04 03:25:37 +02:00
import_menu - > set_tooltip ( TTR ( " Import assets to the project. " ) ) ;
import_menu - > set_text ( TTR ( " Import " ) ) ;
2014-02-10 02:10:30 +01:00
//import_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
left_menu_hb - > add_child ( import_menu ) ;
p = import_menu - > get_popup ( ) ;
p - > connect ( " item_pressed " , this , " _menu_option " ) ;
2015-11-29 05:08:31 +01:00
tool_menu = memnew ( MenuButton ) ;
2016-05-19 00:08:12 +02:00
tool_menu - > set_tooltip ( TTR ( " Miscellaneous project or scene-wide tools. " ) ) ;
2016-05-04 03:25:37 +02:00
tool_menu - > set_text ( TTR ( " Tools " ) ) ;
2015-11-29 05:08:31 +01:00
//tool_menu->set_icon(gui_base->get_icon("Save","EditorIcons"));
left_menu_hb - > add_child ( tool_menu ) ;
p = tool_menu - > get_popup ( ) ;
p - > connect ( " item_pressed " , this , " _menu_option " ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Orphan Resource Explorer " ) , TOOLS_ORPHAN_RESOURCES ) ;
2015-11-29 05:08:31 +01:00
2014-02-10 02:10:30 +01:00
export_button = memnew ( ToolButton ) ;
2016-05-04 03:25:37 +02:00
export_button - > set_tooltip ( TTR ( " Export the project to many platforms. " ) ) ;
export_button - > set_text ( TTR ( " Export " ) ) ;
2014-02-10 02:10:30 +01:00
export_button - > connect ( " pressed " , this , " _menu_option " , varray ( FILE_EXPORT_PROJECT ) ) ;
export_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
left_menu_hb - > add_child ( export_button ) ;
menu_hb - > add_spacer ( ) ;
//Separator *s1 = memnew( VSeparator );
//menu_panel->add_child(s1);
//s1->set_pos(Point2(210,4));
//s1->set_size(Point2(10,15));
2016-05-30 20:29:43 +02:00
play_cc = memnew ( CenterContainer ) ;
2014-02-10 02:10:30 +01:00
play_cc - > set_ignore_mouse ( true ) ;
gui_base - > add_child ( play_cc ) ;
play_cc - > set_area_as_parent_rect ( ) ;
play_cc - > set_anchor_and_margin ( MARGIN_BOTTOM , Control : : ANCHOR_BEGIN , 10 ) ;
play_cc - > set_margin ( MARGIN_TOP , 5 ) ;
top_region = memnew ( PanelContainer ) ;
top_region - > add_style_override ( " panel " , gui_base - > get_stylebox ( " hover " , " Button " ) ) ;
play_cc - > add_child ( top_region ) ;
HBoxContainer * play_hb = memnew ( HBoxContainer ) ;
top_region - > add_child ( play_hb ) ;
play_button = memnew ( ToolButton ) ;
play_hb - > add_child ( play_button ) ;
play_button - > set_toggle_mode ( true ) ;
play_button - > set_icon ( gui_base - > get_icon ( " MainPlay " , " EditorIcons " ) ) ;
play_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
play_button - > connect ( " pressed " , this , " _menu_option " , make_binds ( RUN_PLAY ) ) ;
2016-06-05 02:31:29 +02:00
play_button - > set_tooltip ( TTR ( " Play the project. " ) ) ;
play_button - > set_shortcut ( ED_SHORTCUT ( " editor/play " , TTR ( " Play " ) , KEY_F5 ) ) ;
2014-02-10 02:10:30 +01:00
2016-05-22 02:18:16 +02:00
pause_button = memnew ( ToolButton ) ;
2014-02-10 02:10:30 +01:00
//menu_panel->add_child(pause_button); - not needed for now?
pause_button - > set_toggle_mode ( true ) ;
pause_button - > set_icon ( gui_base - > get_icon ( " Pause " , " EditorIcons " ) ) ;
pause_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
2016-05-22 02:18:16 +02:00
//pause_button->connect("pressed", this,"_menu_option",make_binds(RUN_PAUSE));
pause_button - > set_tooltip ( TTR ( " Pause the scene " ) ) ;
pause_button - > set_disabled ( true ) ;
play_hb - > add_child ( pause_button ) ;
2016-06-05 02:31:29 +02:00
pause_button - > set_shortcut ( ED_SHORTCUT ( " editor/pause_scene " , TTR ( " Pause Scene " ) , KEY_F7 ) ) ;
2016-05-22 02:18:16 +02:00
2016-05-22 03:34:55 +02:00
2014-02-10 02:10:30 +01:00
stop_button = memnew ( ToolButton ) ;
play_hb - > add_child ( stop_button ) ;
//stop_button->set_toggle_mode(true);
stop_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
stop_button - > set_icon ( gui_base - > get_icon ( " MainStop " , " EditorIcons " ) ) ;
stop_button - > connect ( " pressed " , this , " _menu_option " , make_binds ( RUN_STOP ) ) ;
2016-06-05 02:31:29 +02:00
stop_button - > set_tooltip ( TTR ( " Stop the scene. " ) ) ;
stop_button - > set_shortcut ( ED_SHORTCUT ( " editor/stop " , TTR ( " Stop " ) , KEY_F8 ) ) ;
2014-02-10 02:10:30 +01:00
run_native = memnew ( EditorRunNative ) ;
play_hb - > add_child ( run_native ) ;
native_play_button = memnew ( MenuButton ) ;
native_play_button - > set_text ( " NTV " ) ;
menu_hb - > add_child ( native_play_button ) ;
native_play_button - > hide ( ) ;
native_play_button - > get_popup ( ) - > connect ( " item_pressed " , this , " _run_in_device " ) ;
2015-08-06 07:37:40 +02:00
run_native - > connect ( " native_run " , this , " _menu_option " , varray ( RUN_PLAY_NATIVE ) ) ;
2014-02-10 02:10:30 +01:00
2015-04-21 00:38:02 +02:00
// VSeparator *s1 = memnew( VSeparator );
2014-02-10 02:10:30 +01:00
// play_hb->add_child(s1);
play_scene_button = memnew ( ToolButton ) ;
play_hb - > add_child ( play_scene_button ) ;
play_scene_button - > set_toggle_mode ( true ) ;
play_scene_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
play_scene_button - > set_icon ( gui_base - > get_icon ( " PlayScene " , " EditorIcons " ) ) ;
play_scene_button - > connect ( " pressed " , this , " _menu_option " , make_binds ( RUN_PLAY_SCENE ) ) ;
2016-06-05 02:31:29 +02:00
play_scene_button - > set_tooltip ( TTR ( " Play the edited scene. " ) ) ;
play_scene_button - > set_shortcut ( ED_SHORTCUT ( " editor/play_scene " , TTR ( " Play Scene " ) , KEY_F6 ) ) ;
2014-02-10 02:10:30 +01:00
play_custom_scene_button = memnew ( ToolButton ) ;
play_hb - > add_child ( play_custom_scene_button ) ;
play_custom_scene_button - > set_toggle_mode ( true ) ;
play_custom_scene_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
play_custom_scene_button - > set_icon ( gui_base - > get_icon ( " PlayCustom " , " EditorIcons " ) ) ;
play_custom_scene_button - > connect ( " pressed " , this , " _menu_option " , make_binds ( RUN_PLAY_CUSTOM_SCENE ) ) ;
2016-07-11 19:46:41 +02:00
play_custom_scene_button - > set_tooltip ( TTR ( " Play custom scene " ) ) ;
play_custom_scene_button - > set_shortcut ( ED_SHORTCUT ( " editor/play_custom_scene " , TTR ( " Play Custom Scene " ) , KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5 ) ) ;
2014-02-10 02:10:30 +01:00
2015-08-06 07:37:40 +02:00
debug_button = memnew ( MenuButton ) ;
debug_button - > set_flat ( true ) ;
play_hb - > add_child ( debug_button ) ;
//debug_button->set_toggle_mode(true);
debug_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
debug_button - > set_icon ( gui_base - > get_icon ( " Remote " , " EditorIcons " ) ) ;
//debug_button->connect("pressed", this,"_menu_option",make_binds(RUN_LIVE_DEBUG));
2016-05-19 00:08:12 +02:00
debug_button - > set_tooltip ( TTR ( " Debug options " ) ) ;
2015-08-06 07:37:40 +02:00
p = debug_button - > get_popup ( ) ;
2016-12-23 15:43:45 +01:00
p - > set_hide_on_item_selection ( false ) ;
2016-06-04 02:03:09 +02:00
p - > add_check_item ( TTR ( " Deploy with Remote Debug " ) , RUN_DEPLOY_REMOTE_DEBUG ) ;
p - > set_item_tooltip ( p - > get_item_count ( ) - 1 , TTR ( " When exporting or deploying, the resulting executable will attempt to connect to the IP of this computer in order to be debugged. " ) ) ;
p - > add_check_item ( TTR ( " Small Deploy with Network FS " ) , RUN_FILE_SERVER ) ;
2016-06-04 18:17:56 +02:00
p - > set_item_tooltip ( p - > get_item_count ( ) - 1 , TTR ( " When this option is enabled, export or deploy will produce a minimal executable. \n The filesystem will be provided from the project by the editor over the network. \n On Android, deploy will use the USB cable for faster performance. This option speeds up testing for games with a large footprint. " ) ) ;
2015-09-20 18:03:46 +02:00
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_check_item ( TTR ( " Visible Collision Shapes " ) , RUN_DEBUG_COLLISONS ) ;
2016-06-04 02:03:09 +02:00
p - > set_item_tooltip ( p - > get_item_count ( ) - 1 , TTR ( " Collision shapes and raycast nodes (for 2D and 3D) will be visible on the running game if this option is turned on. " ) ) ;
2016-05-04 03:25:37 +02:00
p - > add_check_item ( TTR ( " Visible Navigation " ) , RUN_DEBUG_NAVIGATION ) ;
2016-06-04 02:03:09 +02:00
p - > set_item_tooltip ( p - > get_item_count ( ) - 1 , TTR ( " Navigation meshes and polygons will be visible on the running game if this option is turned on. " ) ) ;
2016-06-02 01:22:02 +02:00
p - > add_separator ( ) ;
2016-06-04 02:03:09 +02:00
p - > add_check_item ( TTR ( " Sync Scene Changes " ) , RUN_LIVE_DEBUG ) ;
2016-06-04 18:17:56 +02:00
p - > set_item_tooltip ( p - > get_item_count ( ) - 1 , TTR ( " When this option is turned on, any changes made to the scene in the editor will be replicated in the running game. \n When used remotely on a device, this is more efficient with network filesystem. " ) ) ;
2016-06-04 02:03:09 +02:00
p - > add_check_item ( TTR ( " Sync Script Changes " ) , RUN_RELOAD_SCRIPTS ) ;
2016-06-04 18:17:56 +02:00
p - > set_item_tooltip ( p - > get_item_count ( ) - 1 , TTR ( " When this option is turned on, any script that is saved will be reloaded on the running game. \n When used remotely on a device, this is more efficient with network filesystem. " ) ) ;
2014-02-10 02:10:30 +01:00
p - > connect ( " item_pressed " , this , " _menu_option " ) ;
2015-04-21 00:38:02 +02:00
/*
2014-02-10 02:10:30 +01:00
run_settings_button = memnew ( ToolButton ) ;
//menu_hb->add_child(run_settings_button);
//run_settings_button->set_toggle_mode(true);
run_settings_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
run_settings_button - > set_icon ( gui_base - > get_icon ( " Run " , " EditorIcons " ) ) ;
run_settings_button - > connect ( " pressed " , this , " _menu_option " , make_binds ( RUN_SCENE_SETTINGS ) ) ;
2015-04-21 00:38:02 +02:00
*/
2014-02-10 02:10:30 +01:00
/*
run_settings_button = memnew ( ToolButton ) ;
menu_panel - > add_child ( run_settings_button ) ;
run_settings_button - > set_pos ( Point2 ( 305 , 0 ) ) ;
run_settings_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
run_settings_button - > set_icon ( gui_base - > get_icon ( " Run " , " EditorIcons " ) ) ;
run_settings_button - > connect ( " pressed " , this , " _menu_option " , make_binds ( RUN_SETTINGS ) ) ;
*/
2015-11-18 08:47:41 +01:00
progress_hb = memnew ( BackgroundProgress ) ;
menu_hb - > add_child ( progress_hb ) ;
{
Control * sp = memnew ( Control ) ;
2016-05-30 05:28:29 +02:00
sp - > set_custom_minimum_size ( Size2 ( 30 , 0 ) * EDSCALE ) ;
2015-11-18 08:47:41 +01:00
menu_hb - > add_child ( sp ) ;
}
PanelContainer * vu_cont = memnew ( PanelContainer ) ;
vu_cont - > add_style_override ( " panel " , gui_base - > get_stylebox ( " hover " , " Button " ) ) ;
menu_hb - > add_child ( vu_cont ) ;
audio_vu = memnew ( TextureProgress ) ;
CenterContainer * vu_cc = memnew ( CenterContainer ) ;
vu_cc - > add_child ( audio_vu ) ;
vu_cont - > add_child ( vu_cc ) ;
audio_vu - > set_under_texture ( gui_base - > get_icon ( " VuEmpty " , " EditorIcons " ) ) ;
audio_vu - > set_progress_texture ( gui_base - > get_icon ( " VuFull " , " EditorIcons " ) ) ;
audio_vu - > set_max ( 24 ) ;
audio_vu - > set_min ( - 80 ) ;
audio_vu - > set_step ( 0.01 ) ;
audio_vu - > set_val ( 0 ) ;
{
Control * sp = memnew ( Control ) ;
2016-05-30 05:28:29 +02:00
sp - > set_custom_minimum_size ( Size2 ( 30 , 0 ) * EDSCALE ) ;
2015-11-18 08:47:41 +01:00
menu_hb - > add_child ( sp ) ;
}
2014-02-10 02:10:30 +01:00
top_region = memnew ( PanelContainer ) ;
top_region - > add_style_override ( " panel " , gui_base - > get_stylebox ( " hover " , " Button " ) ) ;
HBoxContainer * right_menu_hb = memnew ( HBoxContainer ) ;
top_region - > add_child ( right_menu_hb ) ;
menu_hb - > add_child ( top_region ) ;
settings_menu = memnew ( MenuButton ) ;
2016-05-04 03:25:37 +02:00
settings_menu - > set_text ( TTR ( " Settings " ) ) ;
2014-02-10 02:10:30 +01:00
//settings_menu->set_anchor(MARGIN_RIGHT,ANCHOR_END);
right_menu_hb - > add_child ( settings_menu ) ;
p = settings_menu - > get_popup ( ) ;
2016-05-21 01:18:35 +02:00
//p->add_item("Export Settings",SETTINGS_EXPORT_PREFERENCES);
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Editor Settings " ) , SETTINGS_PREFERENCES ) ;
2016-05-21 01:18:35 +02:00
//p->add_item("Optimization Presets",SETTINGS_OPTIMIZED_PRESETS);
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2015-11-22 19:11:17 +01:00
editor_layouts = memnew ( PopupMenu ) ;
editor_layouts - > set_name ( " Layouts " ) ;
p - > add_child ( editor_layouts ) ;
editor_layouts - > connect ( " item_pressed " , this , " _layout_menu_option " ) ;
2016-05-04 03:25:37 +02:00
p - > add_submenu_item ( TTR ( " Editor Layout " ) , " Layouts " ) ;
2015-11-22 19:11:17 +01:00
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " Install Export Templates " ) , SETTINGS_LOAD_EXPORT_TEMPLATES ) ;
2014-02-10 02:10:30 +01:00
p - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_item ( TTR ( " About " ) , SETTINGS_ABOUT ) ;
2014-02-10 02:10:30 +01:00
2015-12-14 16:49:24 +01:00
layout_dialog = memnew ( EditorNameDialog ) ;
2015-11-22 19:11:17 +01:00
gui_base - > add_child ( layout_dialog ) ;
layout_dialog - > set_hide_on_ok ( false ) ;
2016-05-30 05:28:29 +02:00
layout_dialog - > set_size ( Size2 ( 175 , 70 ) * EDSCALE ) ;
2015-12-14 16:49:24 +01:00
layout_dialog - > connect ( " name_confirmed " , this , " _dialog_action " ) ;
2014-02-10 02:10:30 +01:00
sources_button = memnew ( ToolButton ) ;
right_menu_hb - > add_child ( sources_button ) ;
sources_button - > set_icon ( gui_base - > get_icon ( " DependencyOk " , " EditorIcons " ) ) ;
sources_button - > connect ( " pressed " , this , " _menu_option " , varray ( SOURCES_REIMPORT ) ) ;
2016-05-04 03:25:37 +02:00
sources_button - > set_tooltip ( TTR ( " Alerts when an external resource has changed. " ) ) ;
2014-02-10 02:10:30 +01:00
2015-11-18 08:47:41 +01:00
update_menu = memnew ( MenuButton ) ;
2016-05-04 03:25:37 +02:00
update_menu - > set_tooltip ( TTR ( " Spins when the editor window repaints! " ) ) ;
2015-11-18 08:47:41 +01:00
right_menu_hb - > add_child ( update_menu ) ;
update_menu - > set_icon ( gui_base - > get_icon ( " Progress1 " , " EditorIcons " ) ) ;
p = update_menu - > get_popup ( ) ;
2016-05-04 03:25:37 +02:00
p - > add_check_item ( TTR ( " Update Always " ) , SETTINGS_UPDATE_ALWAYS ) ;
p - > add_check_item ( TTR ( " Update Changes " ) , SETTINGS_UPDATE_CHANGES ) ;
2016-10-01 16:15:07 +02:00
p - > add_separator ( ) ;
p - > add_check_item ( TTR ( " Disable Update Spinner " ) , SETTINGS_UPDATE_SPINNER_HIDE ) ;
2015-11-18 08:47:41 +01:00
p - > set_item_checked ( 1 , true ) ;
2014-02-10 02:10:30 +01:00
//sources_button->connect();
/*
Separator * s2 = memnew ( VSeparator ) ;
menu_panel - > add_child ( s2 ) ;
s2 - > set_pos ( Point2 ( 338 , 4 ) ) ;
s2 - > set_size ( Point2 ( 10 , 15 ) ) ;
*/
2015-06-14 03:12:53 +02:00
//editor_hsplit = memnew( HSplitContainer );
//main_split->add_child(editor_hsplit);
//editor_hsplit->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
//editor_vsplit = memnew( VSplitContainer );
//editor_hsplit->add_child(editor_vsplit);
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
//top_pallete = memnew( TabContainer );
2014-02-10 02:10:30 +01:00
scene_tree_dock = memnew ( SceneTreeDock ( this , scene_root , editor_selection , editor_data ) ) ;
2016-05-04 03:25:37 +02:00
scene_tree_dock - > set_name ( TTR ( " Scene " ) ) ;
2015-06-14 03:12:53 +02:00
//top_pallete->add_child(scene_tree_dock);
2016-06-04 02:03:09 +02:00
dock_slot [ DOCK_SLOT_RIGHT_UL ] - > add_child ( scene_tree_dock ) ;
2015-09-01 05:49:47 +02:00
#if 0
2014-02-10 02:10:30 +01:00
resources_dock = memnew ( ResourcesDock ( this ) ) ;
2016-05-21 01:18:35 +02:00
resources_dock - > set_name ( " Resources " ) ;
2015-06-14 03:12:53 +02:00
//top_pallete->add_child(resources_dock);
dock_slot [ DOCK_SLOT_RIGHT_BL ] - > add_child ( resources_dock ) ;
//top_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2015-09-01 05:49:47 +02:00
# endif
2016-06-04 02:03:09 +02:00
dock_slot [ DOCK_SLOT_LEFT_BR ] - > hide ( ) ;
2015-06-14 03:12:53 +02:00
/*Control *editor_spacer = memnew( Control );
2015-01-03 21:24:16 +01:00
editor_spacer - > set_custom_minimum_size ( Size2 ( 260 , 200 ) ) ;
2014-02-10 02:10:30 +01:00
editor_spacer - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
editor_vsplit - > add_child ( editor_spacer ) ;
editor_spacer - > add_child ( top_pallete ) ;
2015-06-14 03:12:53 +02:00
top_pallete - > set_area_as_parent_rect ( ) ; */
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
//prop_pallete = memnew( TabContainer );
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
//prop_pallete->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2014-02-10 02:10:30 +01:00
2015-06-14 03:12:53 +02:00
/*editor_spacer = memnew( Control );
2015-01-03 21:24:16 +01:00
editor_spacer - > set_custom_minimum_size ( Size2 ( 260 , 200 ) ) ;
2014-02-10 02:10:30 +01:00
editor_spacer - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
editor_vsplit - > add_child ( editor_spacer ) ;
editor_spacer - > add_child ( prop_pallete ) ;
2015-06-14 03:12:53 +02:00
prop_pallete - > set_area_as_parent_rect ( ) ; */
2014-02-10 02:10:30 +01:00
VBoxContainer * prop_editor_base = memnew ( VBoxContainer ) ;
2016-05-04 03:25:37 +02:00
prop_editor_base - > set_name ( TTR ( " Inspector " ) ) ; // Properties?
2016-06-04 02:03:09 +02:00
dock_slot [ DOCK_SLOT_RIGHT_BL ] - > add_child ( prop_editor_base ) ;
2014-02-10 02:10:30 +01:00
HBoxContainer * prop_editor_hb = memnew ( HBoxContainer ) ;
2015-09-01 05:49:47 +02:00
prop_editor_base - > add_child ( prop_editor_hb ) ;
2016-05-23 22:10:26 +02:00
prop_editor_vb = prop_editor_base ;
2014-02-10 02:10:30 +01:00
2015-09-01 05:49:47 +02:00
resource_new_button = memnew ( ToolButton ) ;
2016-05-19 00:08:12 +02:00
resource_new_button - > set_tooltip ( TTR ( " Create a new resource in memory and edit it. " ) ) ;
2015-09-01 05:49:47 +02:00
resource_new_button - > set_icon ( gui_base - > get_icon ( " New " , " EditorIcons " ) ) ;
prop_editor_hb - > add_child ( resource_new_button ) ;
resource_new_button - > connect ( " pressed " , this , " _menu_option " , varray ( RESOURCE_NEW ) ) ;
resource_new_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
resource_load_button = memnew ( ToolButton ) ;
2016-05-19 00:08:12 +02:00
resource_load_button - > set_tooltip ( TTR ( " Load an existing resource from disk and edit it. " ) ) ;
2015-09-01 05:49:47 +02:00
resource_load_button - > set_icon ( gui_base - > get_icon ( " Load " , " EditorIcons " ) ) ;
prop_editor_hb - > add_child ( resource_load_button ) ;
resource_load_button - > connect ( " pressed " , this , " _menu_option " , varray ( RESOURCE_LOAD ) ) ;
resource_load_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
resource_save_button = memnew ( MenuButton ) ;
2016-05-19 00:08:12 +02:00
resource_save_button - > set_tooltip ( TTR ( " Save the currently edited resource. " ) ) ;
2015-09-01 05:49:47 +02:00
resource_save_button - > set_icon ( gui_base - > get_icon ( " Save " , " EditorIcons " ) ) ;
prop_editor_hb - > add_child ( resource_save_button ) ;
2016-05-04 03:25:37 +02:00
resource_save_button - > get_popup ( ) - > add_item ( TTR ( " Save " ) , RESOURCE_SAVE ) ;
resource_save_button - > get_popup ( ) - > add_item ( TTR ( " Save As.. " ) , RESOURCE_SAVE_AS ) ;
2015-09-01 05:49:47 +02:00
resource_save_button - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
resource_save_button - > set_focus_mode ( Control : : FOCUS_NONE ) ;
resource_save_button - > set_disabled ( true ) ;
prop_editor_hb - > add_spacer ( ) ;
2014-02-10 02:10:30 +01:00
property_back = memnew ( ToolButton ) ;
property_back - > set_icon ( gui_base - > get_icon ( " Back " , " EditorIcons " ) ) ;
property_back - > set_flat ( true ) ;
2016-05-04 03:25:37 +02:00
property_back - > set_tooltip ( TTR ( " Go to the previous edited object in history. " ) ) ;
2015-09-01 05:49:47 +02:00
property_back - > set_disabled ( true ) ;
2014-02-10 02:10:30 +01:00
prop_editor_hb - > add_child ( property_back ) ;
property_forward = memnew ( ToolButton ) ;
property_forward - > set_icon ( gui_base - > get_icon ( " Forward " , " EditorIcons " ) ) ;
property_forward - > set_flat ( true ) ;
2016-05-04 03:25:37 +02:00
property_forward - > set_tooltip ( TTR ( " Go to the next edited object in history. " ) ) ;
2015-09-01 05:49:47 +02:00
property_forward - > set_disabled ( true ) ;
2014-02-10 02:10:30 +01:00
prop_editor_hb - > add_child ( property_forward ) ;
2015-09-01 05:49:47 +02:00
editor_history_menu = memnew ( MenuButton ) ;
2016-05-19 00:08:12 +02:00
editor_history_menu - > set_tooltip ( TTR ( " History of recently edited objects. " ) ) ;
2015-09-01 05:49:47 +02:00
editor_history_menu - > set_icon ( gui_base - > get_icon ( " History " , " EditorIcons " ) ) ;
prop_editor_hb - > add_child ( editor_history_menu ) ;
editor_history_menu - > connect ( " about_to_show " , this , " _prepare_history " ) ;
editor_history_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _select_history " ) ;
prop_editor_hb = memnew ( HBoxContainer ) ; //again...
prop_editor_base - > add_child ( prop_editor_hb ) ;
editor_path = memnew ( EditorPath ( & editor_history ) ) ;
editor_path - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
prop_editor_hb - > add_child ( editor_path ) ;
2015-11-21 17:42:15 +01:00
search_button = memnew ( ToolButton ) ;
search_button - > set_toggle_mode ( true ) ;
search_button - > set_pressed ( false ) ;
search_button - > set_icon ( gui_base - > get_icon ( " Zoom " , " EditorIcons " ) ) ;
prop_editor_hb - > add_child ( search_button ) ;
search_button - > connect ( " toggled " , this , " _toggle_search_bar " ) ;
2015-09-01 05:49:47 +02:00
2014-02-10 02:10:30 +01:00
object_menu = memnew ( MenuButton ) ;
object_menu - > set_icon ( gui_base - > get_icon ( " Tools " , " EditorIcons " ) ) ;
prop_editor_hb - > add_child ( object_menu ) ;
2016-05-04 03:25:37 +02:00
object_menu - > set_tooltip ( TTR ( " Object properties. " ) ) ;
2014-02-10 02:10:30 +01:00
2015-09-01 05:49:47 +02:00
create_dialog = memnew ( CreateDialog ) ;
gui_base - > add_child ( create_dialog ) ;
create_dialog - > set_base_type ( " Resource " ) ;
create_dialog - > connect ( " create " , this , " _resource_created " ) ;
2015-11-21 17:42:15 +01:00
search_bar = memnew ( HBoxContainer ) ;
search_bar - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
prop_editor_base - > add_child ( search_bar ) ;
search_bar - > hide ( ) ;
2016-05-19 00:08:12 +02:00
Label * l = memnew ( Label ( TTR ( " Search: " ) + " " ) ) ;
2015-11-21 17:42:15 +01:00
search_bar - > add_child ( l ) ;
search_box = memnew ( LineEdit ) ;
search_box - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
search_bar - > add_child ( search_box ) ;
ToolButton * clear_button = memnew ( ToolButton ) ;
clear_button - > set_icon ( gui_base - > get_icon ( " Close " , " EditorIcons " ) ) ;
search_bar - > add_child ( clear_button ) ;
clear_button - > connect ( " pressed " , this , " _clear_search_box " ) ;
2015-09-01 05:49:47 +02:00
property_editor = memnew ( PropertyEditor ) ;
property_editor - > set_autoclear ( true ) ;
property_editor - > set_show_categories ( true ) ;
property_editor - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
property_editor - > set_use_doc_hints ( true ) ;
property_editor - > hide_top_label ( ) ;
2015-11-21 17:42:15 +01:00
property_editor - > register_text_enter ( search_box ) ;
2015-09-01 05:49:47 +02:00
prop_editor_base - > add_child ( property_editor ) ;
property_editor - > set_undo_redo ( & editor_data . get_undo_redo ( ) ) ;
2014-02-10 02:10:30 +01:00
2016-06-04 18:17:56 +02:00
node_dock = memnew ( NodeDock ) ;
//node_dock->set_undoredo(&editor_data.get_undo_redo());
dock_slot [ DOCK_SLOT_RIGHT_BL ] - > add_child ( node_dock ) ;
2016-06-04 02:03:09 +02:00
2017-01-21 13:07:29 +01:00
filesystem_dock = memnew ( FileSystemDock ( this ) ) ;
filesystem_dock - > set_name ( TTR ( " FileSystem " ) ) ;
filesystem_dock - > set_display_mode ( int ( EditorSettings : : get_singleton ( ) - > get ( " filesystem_dock/display_mode " ) ) ) ;
dock_slot [ DOCK_SLOT_LEFT_UR ] - > add_child ( filesystem_dock ) ;
//prop_pallete->add_child(filesystem_dock);
filesystem_dock - > connect ( " open " , this , " open_request " ) ;
filesystem_dock - > connect ( " instance " , this , " _instance_request " ) ;
2014-02-10 02:10:30 +01:00
2015-11-22 19:11:17 +01:00
const String docks_section = " docks " ;
2016-01-11 22:23:45 +01:00
overridden_default_layout = - 1 ;
default_layout . instance ( ) ;
2016-09-19 18:52:08 +02:00
default_layout - > set_value ( docks_section , " dock_3 " , TTR ( " FileSystem " ) ) ;
default_layout - > set_value ( docks_section , " dock_5 " , TTR ( " Scene " ) ) ;
default_layout - > set_value ( docks_section , " dock_6 " , TTR ( " Inspector " ) + " , " + TTR ( " Node " ) ) ;
2015-11-22 19:11:17 +01:00
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + )
2016-01-11 22:23:45 +01:00
default_layout - > set_value ( docks_section , " dock_hsplit_ " + itos ( i + 1 ) , 0 ) ;
2015-11-22 19:11:17 +01:00
for ( int i = 0 ; i < DOCK_SLOT_MAX / 2 ; i + + )
2016-01-11 22:23:45 +01:00
default_layout - > set_value ( docks_section , " dock_split_ " + itos ( i + 1 ) , 0 ) ;
2014-02-10 02:10:30 +01:00
2015-11-22 19:11:17 +01:00
_update_layouts_menu ( ) ;
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
bottom_panel = memnew ( PanelContainer ) ;
bottom_panel - > add_style_override ( " panel " , gui_base - > get_stylebox ( " panelf " , " Panel " ) ) ;
center_split - > add_child ( bottom_panel ) ;
center_split - > set_dragger_visibility ( SplitContainer : : DRAGGER_HIDDEN ) ;
2015-11-18 08:47:41 +01:00
2016-01-18 00:03:57 +01:00
bottom_panel_vb = memnew ( VBoxContainer ) ;
bottom_panel - > add_child ( bottom_panel_vb ) ;
//bottom_panel_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
2015-11-18 08:47:41 +01:00
2016-01-18 00:03:57 +01:00
bottom_panel_hb = memnew ( HBoxContainer ) ;
bottom_panel_vb - > add_child ( bottom_panel_hb ) ;
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
log = memnew ( EditorLog ) ;
2014-02-10 02:10:30 +01:00
2016-05-04 03:25:37 +02:00
add_bottom_panel_item ( TTR ( " Output " ) , log ) ;
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
//left_split->set_dragger_visible(false);
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
old_split_ofs = 0 ;
center_split - > connect ( " resized " , this , " _vp_resized " ) ;
2014-02-10 02:10:30 +01:00
2015-11-18 08:47:41 +01:00
/*PanelContainer *bottom_pc = memnew( PanelContainer );
srt - > add_child ( bottom_pc ) ;
2014-02-10 02:10:30 +01:00
bottom_hb = memnew ( HBoxContainer ) ;
2015-11-18 08:47:41 +01:00
bottom_pc - > add_child ( bottom_hb ) ; */
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
// center_vb->add_child( log->get_button() );
// log->get_button()->set_h_size_flags(Control::SIZE_EXPAND_FILL);
2014-02-10 02:10:30 +01:00
2015-11-18 08:47:41 +01:00
2014-02-10 02:10:30 +01:00
//progress_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
/*
animation_menu = memnew ( ToolButton ) ;
animation_menu - > set_pos ( Point2 ( 500 , 0 ) ) ;
animation_menu - > set_size ( Size2 ( 20 , 20 ) ) ;
animation_menu - > set_toggle_mode ( true ) ;
animation_menu - > set_focus_mode ( Control : : FOCUS_NONE ) ;
menu_panel - > add_child ( animation_menu ) ;
animation_menu - > set_icon ( gui_base - > get_icon ( " Animation " , " EditorIcons " ) ) ;
animation_menu - > connect ( " pressed " , this , " _animation_visibility_toggle " ) ; ;
*/
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
call_dialog = memnew ( CallDialog ) ;
call_dialog - > hide ( ) ;
gui_base - > add_child ( call_dialog ) ;
2015-11-29 05:08:31 +01:00
orphan_resources = memnew ( OrphanResourcesDialog ) ;
gui_base - > add_child ( orphan_resources ) ;
2014-02-10 02:10:30 +01:00
confirmation = memnew ( ConfirmationDialog ) ;
gui_base - > add_child ( confirmation ) ;
confirmation - > connect ( " confirmed " , this , " _menu_confirm_current " ) ;
accept = memnew ( AcceptDialog ) ;
gui_base - > add_child ( accept ) ;
accept - > connect ( " confirmed " , this , " _menu_confirm_current " ) ;
// optimized_save = memnew( OptimizedSaveDialog(&editor_data) );
//gui_base->add_child(optimized_save);
//optimized_save->connect("confirmed",this,"_save_optimized");
project_export = memnew ( ProjectExport ( & editor_data ) ) ;
gui_base - > add_child ( project_export ) ;
project_export_settings = memnew ( ProjectExportDialog ( this ) ) ;
gui_base - > add_child ( project_export_settings ) ;
//optimized_presets = memnew( OptimizedPresetsDialog(&editor_data) );
//gui_base->add_child(optimized_presets);
//optimized_presets->connect("confirmed",this,"_presets_optimized");
//import_subscene = memnew( EditorSubScene );
//gui_base->add_child(import_subscene);
2015-08-24 01:15:56 +02:00
dependency_error = memnew ( DependencyErrorDialog ) ;
gui_base - > add_child ( dependency_error ) ;
2014-02-10 02:10:30 +01:00
2015-08-24 01:15:56 +02:00
dependency_fixer = memnew ( DependencyEditor ) ;
gui_base - > add_child ( dependency_fixer ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
settings_config_dialog = memnew ( EditorSettingsDialog ) ;
gui_base - > add_child ( settings_config_dialog ) ;
project_settings = memnew ( ProjectSettings ( & editor_data ) ) ;
gui_base - > add_child ( project_settings ) ;
import_confirmation = memnew ( ConfirmationDialog ) ;
2016-05-04 03:25:37 +02:00
import_confirmation - > get_ok ( ) - > set_text ( TTR ( " Re-Import " ) ) ;
import_confirmation - > add_button ( TTR ( " Update " ) , ! OS : : get_singleton ( ) - > get_swap_ok_cancel ( ) , " update " ) ;
2014-02-10 02:10:30 +01:00
import_confirmation - > get_label ( ) - > set_align ( Label : : ALIGN_CENTER ) ;
import_confirmation - > connect ( " confirmed " , this , " _import_action " , make_binds ( " re-import " ) ) ;
import_confirmation - > connect ( " custom_action " , this , " _import_action " ) ;
gui_base - > add_child ( import_confirmation ) ;
open_recent_confirmation = memnew ( ConfirmationDialog ) ;
add_child ( open_recent_confirmation ) ;
open_recent_confirmation - > connect ( " confirmed " , this , " _open_recent_scene_confirm " ) ;
run_settings_dialog = memnew ( RunSettingsDialog ) ;
gui_base - > add_child ( run_settings_dialog ) ;
about = memnew ( AcceptDialog ) ;
2016-05-19 00:08:12 +02:00
about - > set_title ( TTR ( " Thanks from the Godot community! " ) ) ;
2014-02-10 02:10:30 +01:00
//about->get_cancel()->hide();
2016-05-04 03:25:37 +02:00
about - > get_ok ( ) - > set_text ( TTR ( " Thanks! " ) ) ;
2014-02-10 02:10:30 +01:00
about - > set_hide_on_ok ( true ) ;
Label * about_text = memnew ( Label ) ;
2017-01-01 22:01:57 +01:00
about_text - > set_text ( VERSION_FULL_NAME " \n (c) 2008-2017 Juan Linietsky, Ariel Manzur. \n " ) ;
2014-02-10 02:10:30 +01:00
about_text - > set_pos ( Point2 ( gui_base - > get_icon ( " Logo " , " EditorIcons " ) - > get_size ( ) . width + 30 , 20 ) ) ;
gui_base - > add_child ( about ) ;
about - > add_child ( about_text ) ;
TextureFrame * logo = memnew ( TextureFrame ) ;
about - > add_child ( logo ) ;
logo - > set_pos ( Point2 ( 20 , 20 ) ) ;
logo - > set_texture ( gui_base - > get_icon ( " Logo " , " EditorIcons " ) ) ;
2015-02-14 16:09:52 +01:00
warning = memnew ( AcceptDialog ) ;
2016-06-12 02:38:25 +02:00
gui_base - > add_child ( warning ) ;
2014-02-10 02:10:30 +01:00
file_templates = memnew ( FileDialog ) ;
2016-05-19 00:08:12 +02:00
file_templates - > set_title ( TTR ( " Import Templates From ZIP File " ) ) ;
2014-02-10 02:10:30 +01:00
gui_base - > add_child ( file_templates ) ;
file_templates - > set_mode ( FileDialog : : MODE_OPEN_FILE ) ;
file_templates - > set_access ( FileDialog : : ACCESS_FILESYSTEM ) ;
file_templates - > clear_filters ( ) ;
2014-04-15 03:43:44 +02:00
file_templates - > add_filter ( " *.tpz ; Template Package " ) ;
2014-02-10 02:10:30 +01:00
2015-05-31 06:59:42 +02:00
file = memnew ( EditorFileDialog ) ;
2014-02-10 02:10:30 +01:00
gui_base - > add_child ( file ) ;
file - > set_current_dir ( " res:// " ) ;
file_export = memnew ( FileDialog ) ;
file_export - > set_access ( FileDialog : : ACCESS_FILESYSTEM ) ;
gui_base - > add_child ( file_export ) ;
2016-05-04 03:25:37 +02:00
file_export - > set_title ( TTR ( " Export Project " ) ) ;
2014-02-10 02:10:30 +01:00
file_export - > connect ( " file_selected " , this , " _dialog_action " ) ;
file_export_lib = memnew ( FileDialog ) ;
2016-05-04 03:25:37 +02:00
file_export_lib - > set_title ( TTR ( " Export Library " ) ) ;
2014-02-10 02:10:30 +01:00
file_export_lib - > set_mode ( FileDialog : : MODE_SAVE_FILE ) ;
file_export_lib - > connect ( " file_selected " , this , " _dialog_action " ) ;
file_export_lib_merge = memnew ( CheckButton ) ;
2016-05-04 03:25:37 +02:00
file_export_lib_merge - > set_text ( TTR ( " Merge With Existing " ) ) ;
2014-02-10 02:10:30 +01:00
file_export_lib_merge - > set_pressed ( true ) ;
file_export_lib - > get_vbox ( ) - > add_child ( file_export_lib_merge ) ;
gui_base - > add_child ( file_export_lib ) ;
file_export_password = memnew ( LineEdit ) ;
file_export_password - > set_secret ( true ) ;
file_export_password - > set_editable ( false ) ;
2016-05-04 03:25:37 +02:00
file_export - > get_vbox ( ) - > add_margin_child ( TTR ( " Password: " ) , file_export_password ) ;
2014-02-10 02:10:30 +01:00
2014-02-21 03:01:44 +01:00
file_script = memnew ( FileDialog ) ;
2016-05-04 03:25:37 +02:00
file_script - > set_title ( TTR ( " Open & Run a Script " ) ) ;
2014-02-21 03:01:44 +01:00
file_script - > set_access ( FileDialog : : ACCESS_FILESYSTEM ) ;
file_script - > set_mode ( FileDialog : : MODE_OPEN_FILE ) ;
List < String > sexts ;
ResourceLoader : : get_recognized_extensions_for_type ( " Script " , & sexts ) ;
for ( List < String > : : Element * E = sexts . front ( ) ; E ; E = E - > next ( ) ) {
file_script - > add_filter ( " *. " + E - > get ( ) ) ;
}
gui_base - > add_child ( file_script ) ;
file_script - > connect ( " file_selected " , this , " _dialog_action " ) ;
2014-02-10 02:10:30 +01:00
reimport_dialog = memnew ( EditorReImportDialog ) ;
gui_base - > add_child ( reimport_dialog ) ;
property_forward - > connect ( " pressed " , this , " _property_editor_forward " ) ;
property_back - > connect ( " pressed " , this , " _property_editor_back " ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
file_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
object_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
update_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
settings_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
file - > connect ( " file_selected " , this , " _dialog_action " ) ;
file_templates - > connect ( " file_selected " , this , " _dialog_action " ) ;
property_editor - > connect ( " resource_selected " , this , " _resource_selected " ) ;
property_editor - > connect ( " property_keyed " , this , " _property_keyed " ) ;
2016-01-18 00:03:57 +01:00
2014-02-10 02:10:30 +01:00
//plugin stuff
file_server = memnew ( EditorFileServer ) ;
2016-05-27 19:18:40 +02:00
editor_import_export - > add_import_plugin ( Ref < EditorTextureImportPlugin > ( memnew ( EditorTextureImportPlugin ( this ) ) ) ) ;
2014-02-10 02:10:30 +01:00
Ref < EditorSceneImportPlugin > _scene_import = memnew ( EditorSceneImportPlugin ( this ) ) ;
Ref < EditorSceneImporterCollada > _collada_import = memnew ( EditorSceneImporterCollada ) ;
_scene_import - > add_importer ( _collada_import ) ;
2014-11-02 15:31:01 +01:00
// Ref<EditorSceneImporterFBXConv> _fbxconv_import = memnew( EditorSceneImporterFBXConv);
// _scene_import->add_importer(_fbxconv_import);
2014-02-10 02:10:30 +01:00
editor_import_export - > add_import_plugin ( _scene_import ) ;
2016-02-17 22:17:34 +01:00
// TODO: This plugin has no code, it should be either implemented or dropped (GH-3667)
// editor_import_export->add_import_plugin( Ref<EditorSceneAnimationImportPlugin>( memnew(EditorSceneAnimationImportPlugin(this))));
2014-05-14 06:22:15 +02:00
editor_import_export - > add_import_plugin ( Ref < EditorMeshImportPlugin > ( memnew ( EditorMeshImportPlugin ( this ) ) ) ) ;
2014-02-10 02:10:30 +01:00
editor_import_export - > add_import_plugin ( Ref < EditorFontImportPlugin > ( memnew ( EditorFontImportPlugin ( this ) ) ) ) ;
editor_import_export - > add_import_plugin ( Ref < EditorSampleImportPlugin > ( memnew ( EditorSampleImportPlugin ( this ) ) ) ) ;
editor_import_export - > add_import_plugin ( Ref < EditorTranslationImportPlugin > ( memnew ( EditorTranslationImportPlugin ( this ) ) ) ) ;
2016-06-05 20:11:57 +02:00
editor_import_export - > add_import_plugin ( Ref < EditorBitMaskImportPlugin > ( memnew ( EditorBitMaskImportPlugin ( this ) ) ) ) ;
2014-02-10 02:10:30 +01:00
2014-02-24 13:53:33 +01:00
editor_import_export - > add_export_plugin ( Ref < EditorTextureExportPlugin > ( memnew ( EditorTextureExportPlugin ) ) ) ;
2015-11-09 04:49:18 +01:00
editor_import_export - > add_export_plugin ( Ref < EditorSampleExportPlugin > ( memnew ( EditorSampleExportPlugin ) ) ) ;
2015-12-04 14:18:28 +01:00
editor_import_export - > add_export_plugin ( Ref < EditorSceneExportPlugin > ( memnew ( EditorSceneExportPlugin ) ) ) ;
2014-02-10 02:10:30 +01:00
2016-01-18 00:03:57 +01:00
add_editor_plugin ( memnew ( AnimationPlayerEditorPlugin ( this ) ) ) ;
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( CanvasItemEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( SpatialEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( ScriptEditorPlugin ( this ) ) ) ;
2016-01-18 00:03:57 +01:00
2016-06-10 03:47:43 +02:00
if ( StreamPeerSSL : : is_available ( ) ) {
add_editor_plugin ( memnew ( AssetLibraryEditorPlugin ( this ) ) ) ;
} else {
WARN_PRINT ( " Asset Library not available, as it requires SSL to work. " ) ;
}
2016-01-18 00:03:57 +01:00
//more visually meaningful to have this later
raise_bottom_panel_item ( AnimationPlayerEditor : : singleton ) ;
2015-01-21 00:25:19 +01:00
add_editor_plugin ( memnew ( ShaderGraphEditorPlugin ( this , true ) ) ) ;
add_editor_plugin ( memnew ( ShaderGraphEditorPlugin ( this , false ) ) ) ;
2015-01-12 00:52:42 +01:00
add_editor_plugin ( memnew ( ShaderEditorPlugin ( this , true ) ) ) ;
add_editor_plugin ( memnew ( ShaderEditorPlugin ( this , false ) ) ) ;
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( CameraEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( SampleEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( SampleLibraryEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( ThemeEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( MultiMeshEditorPlugin ( this ) ) ) ;
2014-10-12 07:13:22 +02:00
add_editor_plugin ( memnew ( MeshInstanceEditorPlugin ( this ) ) ) ;
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( AnimationTreeEditorPlugin ( this ) ) ) ;
2016-05-23 22:10:26 +02:00
//add_editor_plugin( memnew( SamplePlayerEditorPlugin(this) ) ); - this is kind of useless at this point
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( MeshLibraryEditorPlugin ( this ) ) ) ;
2016-05-23 22:10:26 +02:00
//add_editor_plugin( memnew( StreamEditorPlugin(this) ) );
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( StyleBoxEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( ParticlesEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( ResourcePreloaderEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( ItemListEditorPlugin ( this ) ) ) ;
2015-04-21 21:01:58 +02:00
//add_editor_plugin( memnew( RichTextEditorPlugin(this) ) );
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( CollisionPolygonEditorPlugin ( this ) ) ) ;
2014-09-17 02:19:54 +02:00
add_editor_plugin ( memnew ( CollisionPolygon2DEditorPlugin ( this ) ) ) ;
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( TileSetEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( TileMapEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( SpriteFramesEditorPlugin ( this ) ) ) ;
2016-06-03 22:04:44 +02:00
add_editor_plugin ( memnew ( TextureRegionEditorPlugin ( this ) ) ) ;
2014-02-10 02:10:30 +01:00
add_editor_plugin ( memnew ( Particles2DEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( Path2DEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( PathEditorPlugin ( this ) ) ) ;
2014-05-14 06:22:15 +02:00
add_editor_plugin ( memnew ( BakedLightEditorPlugin ( this ) ) ) ;
2014-07-07 22:44:21 +02:00
add_editor_plugin ( memnew ( Polygon2DEditorPlugin ( this ) ) ) ;
2015-03-02 04:54:10 +01:00
add_editor_plugin ( memnew ( LightOccluder2DEditorPlugin ( this ) ) ) ;
2015-02-14 16:09:52 +01:00
add_editor_plugin ( memnew ( NavigationPolygonEditorPlugin ( this ) ) ) ;
2016-05-23 22:10:26 +02:00
add_editor_plugin ( memnew ( ColorRampEditorPlugin ( this ) ) ) ;
2015-06-23 17:20:34 +02:00
add_editor_plugin ( memnew ( CollisionShape2DEditorPlugin ( this ) ) ) ;
2016-05-23 22:10:26 +02:00
add_editor_plugin ( memnew ( TextureEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( MaterialEditorPlugin ( this ) ) ) ;
add_editor_plugin ( memnew ( MeshEditorPlugin ( this ) ) ) ;
2014-02-10 02:10:30 +01:00
for ( int i = 0 ; i < EditorPlugins : : get_plugin_count ( ) ; i + + )
add_editor_plugin ( EditorPlugins : : create ( i , this ) ) ;
2015-05-31 06:59:42 +02:00
resource_preview - > add_preview_generator ( Ref < EditorTexturePreviewPlugin > ( memnew ( EditorTexturePreviewPlugin ) ) ) ;
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 ) ) ) ;
resource_preview - > add_preview_generator ( Ref < EditorSamplePreviewPlugin > ( memnew ( EditorSamplePreviewPlugin ) ) ) ;
2015-06-01 02:13:24 +02:00
resource_preview - > add_preview_generator ( Ref < EditorMeshPreviewPlugin > ( memnew ( EditorMeshPreviewPlugin ) ) ) ;
2016-01-03 21:14:28 +01:00
resource_preview - > add_preview_generator ( Ref < EditorBitmapPreviewPlugin > ( memnew ( EditorBitmapPreviewPlugin ) ) ) ;
2015-05-31 06:59:42 +02:00
2014-02-10 02:10:30 +01:00
circle_step_msec = OS : : get_singleton ( ) - > get_ticks_msec ( ) ;
2015-11-22 19:11:17 +01:00
circle_step_frame = OS : : get_singleton ( ) - > get_frames_drawn ( ) ;
2014-02-10 02:10:30 +01:00
circle_step = 0 ;
2015-02-10 07:36:16 +01:00
_rebuild_import_menu ( ) ;
2014-02-10 02:10:30 +01:00
editor_plugin_screen = NULL ;
2016-03-30 01:02:53 +02:00
editor_plugins_over = memnew ( EditorPluginList ) ;
2014-02-10 02:10:30 +01:00
// force_top_viewport(true);
_edit_current ( ) ;
current = NULL ;
PhysicsServer : : get_singleton ( ) - > set_active ( false ) ; // no physics by default if editor
Physics2DServer : : get_singleton ( ) - > set_active ( false ) ; // no physics by default if editor
ScriptServer : : set_scripting_enabled ( false ) ; // no scripting by default if editor
Globals : : get_singleton ( ) - > set ( " debug/indicators_enabled " , true ) ;
Globals : : get_singleton ( ) - > set ( " render/room_cull_enabled " , false ) ;
reference_resource_mem = true ;
save_external_resources_mem = true ;
set_process ( true ) ;
OS : : get_singleton ( ) - > set_low_processor_usage_mode ( true ) ;
if ( 0 ) { //not sure if i want this to happen after all
//store project name in ssettings
String project_name ;
//figure it out from path
project_name = Globals : : get_singleton ( ) - > get_resource_path ( ) . replace ( " \\ " , " / " ) ;
print_line ( " path: " + project_name ) ;
if ( project_name . length ( ) & & project_name [ project_name . length ( ) - 1 ] = = ' / ' )
project_name = project_name . substr ( 0 , project_name . length ( ) - 1 ) ;
project_name = project_name . replace ( " / " , " :: " ) ;
if ( project_name ! = " " ) {
EditorSettings : : get_singleton ( ) - > set ( " projects/ " + project_name , Globals : : get_singleton ( ) - > get_resource_path ( ) ) ;
EditorSettings : : get_singleton ( ) - > raise_order ( " projects/ " + project_name ) ;
EditorSettings : : get_singleton ( ) - > save ( ) ;
}
}
2015-06-22 05:03:19 +02:00
//edited_scene=NULL;
saved_version = 1 ;
2014-02-10 02:10:30 +01:00
unsaved_cache = true ;
_last_instanced_scene = NULL ;
quick_open = memnew ( EditorQuickOpen ) ;
gui_base - > add_child ( quick_open ) ;
quick_open - > connect ( " quick_open " , this , " _quick_opened " ) ;
quick_run = memnew ( EditorQuickOpen ) ;
gui_base - > add_child ( quick_run ) ;
quick_run - > connect ( " quick_open " , this , " _quick_run " ) ;
_update_recent_scenes ( ) ;
editor_data . restore_editor_global_states ( ) ;
convert_old = false ;
opening_prev = false ;
set_process_unhandled_input ( true ) ;
_playing_edited = false ;
2016-06-26 21:34:28 +02:00
// Panel *errors = memnew( Panel );
2016-06-26 20:37:04 +02:00
load_errors = memnew ( RichTextLabel ) ;
// load_errors->set_readonly(true);
2014-02-10 02:10:30 +01:00
load_error_dialog = memnew ( AcceptDialog ) ;
load_error_dialog - > add_child ( load_errors ) ;
2016-05-04 03:25:37 +02:00
load_error_dialog - > set_title ( TTR ( " Load Errors " ) ) ;
2014-02-10 02:10:30 +01:00
load_error_dialog - > set_child_rect ( load_errors ) ;
2016-06-28 00:59:33 +02:00
gui_base - > add_child ( load_error_dialog ) ;
2014-02-10 02:10:30 +01:00
//EditorImport::add_importer( Ref<EditorImporterCollada>( memnew(EditorImporterCollada )));
EditorFileSystem : : get_singleton ( ) - > connect ( " sources_changed " , this , " _sources_changed " ) ;
EditorFileSystem : : get_singleton ( ) - > connect ( " filesystem_changed " , this , " _fs_changed " ) ;
{
List < StringName > tl ;
StringName ei = " EditorIcons " ;
2016-06-17 06:13:23 +02:00
theme_base - > get_theme ( ) - > get_icon_list ( ei , & tl ) ;
2014-02-10 02:10:30 +01:00
for ( List < StringName > : : Element * E = tl . front ( ) ; E ; E = E - > next ( ) ) {
if ( ! ObjectTypeDB : : type_exists ( E - > get ( ) ) )
continue ;
2016-06-17 06:13:23 +02:00
icon_type_cache [ E - > get ( ) ] = theme_base - > get_theme ( ) - > get_icon ( E - > get ( ) , ei ) ;
2014-02-10 02:10:30 +01:00
}
}
2016-02-28 03:10:44 +01:00
2014-02-23 00:28:19 +01:00
Node : : set_human_readable_collision_renaming ( true ) ;
2014-02-10 02:10:30 +01:00
2014-05-05 03:50:23 +02:00
2016-06-28 00:59:33 +02:00
pick_main_scene = memnew ( ConfirmationDialog ) ;
gui_base - > add_child ( pick_main_scene ) ;
pick_main_scene - > get_ok ( ) - > set_text ( " Select " ) ;
pick_main_scene - > connect ( " confirmed " , this , " _menu_option " , varray ( SETTINGS_PICK_MAIN_SCENE ) ) ;
2015-06-14 03:12:53 +02:00
2014-02-10 02:10:30 +01:00
// Ref<ImageTexture> it = gui_base->get_icon("logo","Icons");
// OS::get_singleton()->set_icon( it->get_data() );
2014-02-25 13:31:47 +01:00
for ( int i = 0 ; i < _init_callbacks . size ( ) ; i + + )
_init_callbacks [ i ] ( ) ;
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
editor_data . add_edited_scene ( - 1 ) ;
editor_data . set_edited_scene ( 0 ) ;
_update_scene_tabs ( ) ;
2016-02-28 03:10:44 +01:00
{
_initializing_addons = true ;
Vector < String > addons = Globals : : get_singleton ( ) - > get ( " editor_plugins/enabled " ) ;
for ( int i = 0 ; i < addons . size ( ) ; i + + ) {
set_addon_plugin_enabled ( addons [ i ] , true ) ;
}
_initializing_addons = false ;
}
2015-06-14 03:12:53 +02:00
_load_docks ( ) ;
2015-06-22 05:03:19 +02:00
2016-06-13 15:10:50 +02:00
FileAccess : : set_file_close_fail_notify_callback ( _file_access_close_error_notify ) ;
2015-06-22 05:03:19 +02:00
2016-05-27 19:18:40 +02:00
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
EditorNode : : ~ EditorNode ( ) {
2016-05-21 15:29:25 +02:00
2016-06-13 15:10:50 +02:00
2015-11-17 13:46:08 +01:00
memdelete ( EditorHelp : : get_doc_data ( ) ) ;
2014-02-10 02:10:30 +01:00
memdelete ( editor_selection ) ;
2016-03-30 01:02:53 +02:00
memdelete ( editor_plugins_over ) ;
2014-02-10 02:10:30 +01:00
memdelete ( file_server ) ;
EditorSettings : : destroy ( ) ;
}
2016-03-30 01:02:53 +02:00
/*
* EDITOR PLUGIN LIST
*/
void EditorPluginList : : make_visible ( bool p_visible ) {
if ( ! plugins_list . empty ( ) ) {
for ( int i = 0 ; i < plugins_list . size ( ) ; i + + ) {
plugins_list [ i ] - > make_visible ( p_visible ) ;
}
}
}
void EditorPluginList : : edit ( Object * p_object ) {
if ( ! plugins_list . empty ( ) ) {
for ( int i = 0 ; i < plugins_list . size ( ) ; i + + ) {
plugins_list [ i ] - > edit ( p_object ) ;
}
}
}
bool EditorPluginList : : forward_input_event ( const InputEvent & p_event ) {
bool discard = false ;
if ( ! plugins_list . empty ( ) ) {
for ( int i = 0 ; i < plugins_list . size ( ) ; i + + ) {
if ( plugins_list [ i ] - > forward_input_event ( p_event ) ) {
discard = true ;
}
}
}
return discard ;
}
bool EditorPluginList : : forward_spatial_input_event ( Camera * p_camera , const InputEvent & p_event ) {
bool discard = false ;
if ( ! plugins_list . empty ( ) ) {
for ( int i = 0 ; i < plugins_list . size ( ) ; i + + ) {
if ( plugins_list [ i ] - > forward_spatial_input_event ( p_camera , p_event ) ) {
discard = true ;
}
}
}
return discard ;
}
bool EditorPluginList : : empty ( ) {
return plugins_list . empty ( ) ;
}
void EditorPluginList : : clear ( ) {
plugins_list . clear ( ) ;
}
EditorPluginList : : EditorPluginList ( ) {
}
EditorPluginList : : ~ EditorPluginList ( ) {
}