2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* editor_settings.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
2016-01-01 14:50:53 +01:00
/* Copyright (c) 2007-2016 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 "editor_settings.h"
# include "os/os.h"
# include "os/dir_access.h"
# include "os/file_access.h"
2014-10-07 06:31:49 +02:00
2014-02-10 02:10:30 +01:00
# include "version.h"
# include "scene/main/scene_main_loop.h"
# include "os/os.h"
# include "scene/main/node.h"
# include "io/resource_loader.h"
# include "io/resource_saver.h"
# include "scene/main/viewport.h"
# include "io/config_file.h"
# include "editor_node.h"
# include "globals.h"
2016-05-28 00:58:28 +02:00
# include "translations.h"
# include "io/file_access_memory.h"
# include "io/translation_loader_po.h"
# include "io/compression.h"
2014-02-10 02:10:30 +01:00
Ref < EditorSettings > EditorSettings : : singleton = NULL ;
EditorSettings * EditorSettings : : get_singleton ( ) {
return singleton . ptr ( ) ;
}
bool EditorSettings : : _set ( const StringName & p_name , const Variant & p_value ) {
_THREAD_SAFE_METHOD_
if ( p_value . get_type ( ) = = Variant : : NIL )
props . erase ( p_name ) ;
else {
if ( props . has ( p_name ) )
props [ p_name ] . variant = p_value ;
else
props [ p_name ] = VariantContainer ( p_value , last_order + + ) ;
}
emit_signal ( " settings_changed " ) ;
return true ;
}
bool EditorSettings : : _get ( const StringName & p_name , Variant & r_ret ) const {
_THREAD_SAFE_METHOD_
const VariantContainer * v = props . getptr ( p_name ) ;
if ( ! v )
return false ;
r_ret = v - > variant ;
return true ;
}
struct _EVCSort {
String name ;
Variant : : Type type ;
int order ;
bool operator < ( const _EVCSort & p_vcs ) const { return order < p_vcs . order ; }
} ;
void EditorSettings : : _get_property_list ( List < PropertyInfo > * p_list ) const {
_THREAD_SAFE_METHOD_
const String * k = NULL ;
Set < _EVCSort > vclist ;
while ( ( k = props . next ( k ) ) ) {
const VariantContainer * v = props . getptr ( * k ) ;
if ( v - > hide_from_editor )
continue ;
_EVCSort vc ;
vc . name = * k ;
vc . order = v - > order ;
vc . type = v - > variant . get_type ( ) ;
vclist . insert ( vc ) ;
}
for ( Set < _EVCSort > : : Element * E = vclist . front ( ) ; E ; E = E - > next ( ) ) {
int pinfo = PROPERTY_USAGE_STORAGE ;
if ( ! E - > get ( ) . name . begins_with ( " _ " ) )
pinfo | = PROPERTY_USAGE_EDITOR ;
PropertyInfo pi ( E - > get ( ) . type , E - > get ( ) . name ) ;
pi . usage = pinfo ;
if ( hints . has ( E - > get ( ) . name ) )
pi = hints [ E - > get ( ) . name ] ;
p_list - > push_back ( pi ) ;
}
}
bool EditorSettings : : has ( String p_var ) const {
_THREAD_SAFE_METHOD_
return props . has ( p_var ) ;
}
void EditorSettings : : erase ( String p_var ) {
_THREAD_SAFE_METHOD_
props . erase ( p_var ) ;
}
void EditorSettings : : raise_order ( const String & p_name ) {
_THREAD_SAFE_METHOD_
ERR_FAIL_COND ( ! props . has ( p_name ) ) ;
props [ p_name ] . order = + + last_order ;
}
Variant _EDITOR_DEF ( const String & p_var , const Variant & p_default ) {
if ( EditorSettings : : get_singleton ( ) - > has ( p_var ) )
return EditorSettings : : get_singleton ( ) - > get ( p_var ) ;
EditorSettings : : get_singleton ( ) - > set ( p_var , p_default ) ;
return p_default ;
}
void EditorSettings : : create ( ) {
if ( singleton . ptr ( ) )
return ; //pointless
DirAccess * dir = NULL ;
Variant meta ;
String config_path ;
String config_dir ;
String config_file = " editor_settings.xml " ;
2016-02-22 00:15:47 +01:00
Ref < ConfigFile > extra_config = memnew ( ConfigFile ) ;
2014-02-10 02:10:30 +01:00
2016-02-19 08:41:08 +01:00
String exe_path = OS : : get_singleton ( ) - > get_executable_path ( ) . get_base_dir ( ) ;
DirAccess * d = DirAccess : : create_for_path ( exe_path ) ;
if ( d - > file_exists ( exe_path + " /._sc_ " ) ) {
2014-02-10 02:10:30 +01:00
2016-02-19 08:41:08 +01:00
// editor is self contained
config_path = exe_path ;
config_dir = " editor_data " ;
2016-02-22 00:15:47 +01:00
extra_config - > load ( exe_path + " /._sc_ " ) ;
2016-02-19 08:41:08 +01:00
} else {
if ( OS : : get_singleton ( ) - > has_environment ( " APPDATA " ) ) {
// Most likely under windows, save here
config_path = OS : : get_singleton ( ) - > get_environment ( " APPDATA " ) ;
config_dir = String ( _MKSTR ( VERSION_SHORT_NAME ) ) . capitalize ( ) ;
} else if ( OS : : get_singleton ( ) - > has_environment ( " HOME " ) ) {
config_path = OS : : get_singleton ( ) - > get_environment ( " HOME " ) ;
config_dir = " . " + String ( _MKSTR ( VERSION_SHORT_NAME ) ) . to_lower ( ) ;
}
} ;
2014-02-10 02:10:30 +01:00
ObjectTypeDB : : register_type < EditorSettings > ( ) ; //otherwise it can't be unserialized
String config_file_path ;
if ( config_path ! = " " ) {
dir = DirAccess : : create ( DirAccess : : ACCESS_FILESYSTEM ) ;
if ( dir - > change_dir ( config_path ) ! = OK ) {
ERR_PRINT ( " Cannot find path for config directory! " ) ;
memdelete ( dir ) ;
goto fail ;
}
if ( dir - > change_dir ( config_dir ) ! = OK ) {
dir - > make_dir ( config_dir ) ;
if ( dir - > change_dir ( config_dir ) ! = OK ) {
ERR_PRINT ( " Cannot create config directory! " ) ;
memdelete ( dir ) ;
goto fail ;
}
}
if ( dir - > change_dir ( " templates " ) ! = OK ) {
dir - > make_dir ( " templates " ) ;
} else {
dir - > change_dir ( " .. " ) ;
}
2016-04-12 16:45:31 +02:00
if ( dir - > change_dir ( " text_editor_themes " ) ! = OK ) {
dir - > make_dir ( " text_editor_themes " ) ;
} else {
dir - > change_dir ( " .. " ) ;
}
2014-02-10 02:10:30 +01:00
if ( dir - > change_dir ( " tmp " ) ! = OK ) {
dir - > make_dir ( " tmp " ) ;
} else {
dir - > change_dir ( " .. " ) ;
}
2015-06-06 14:44:38 +02:00
if ( dir - > change_dir ( " config " ) ! = OK ) {
dir - > make_dir ( " config " ) ;
} else {
dir - > change_dir ( " .. " ) ;
}
dir - > change_dir ( " config " ) ;
String pcp = Globals : : get_singleton ( ) - > get_resource_path ( ) ;
if ( pcp . ends_with ( " / " ) )
pcp = config_path . substr ( 0 , pcp . size ( ) - 1 ) ;
pcp = pcp . get_file ( ) + " - " + pcp . md5_text ( ) ;
if ( dir - > change_dir ( pcp ) ) {
dir - > make_dir ( pcp ) ;
} else {
dir - > change_dir ( " .. " ) ;
}
dir - > change_dir ( " .. " ) ;
2014-02-10 02:10:30 +01:00
// path at least is validated, so validate config file
config_file_path = config_path + " / " + config_dir + " / " + config_file ;
if ( ! dir - > file_exists ( config_file ) ) {
memdelete ( dir ) ;
2016-05-04 03:25:37 +02:00
WARN_PRINT ( " Config file does not exist, creating. " ) ;
2014-02-10 02:10:30 +01:00
goto fail ;
}
memdelete ( dir ) ;
2016-05-19 00:08:12 +02:00
singleton = ResourceLoader : : load ( config_file_path , " EditorSettings " ) ;
2014-02-10 02:10:30 +01:00
if ( singleton . is_null ( ) ) {
WARN_PRINT ( " Could not open config file. " ) ;
goto fail ;
}
singleton - > config_file_path = config_file_path ;
2015-06-06 14:44:38 +02:00
singleton - > project_config_path = pcp ;
2014-02-10 02:10:30 +01:00
singleton - > settings_path = config_path + " / " + config_dir ;
if ( OS : : get_singleton ( ) - > is_stdout_verbose ( ) ) {
2016-05-04 15:28:37 +02:00
print_line ( " EditorSettings: Load OK! " ) ;
2014-02-10 02:10:30 +01:00
}
2016-05-28 00:58:28 +02:00
singleton - > setup_language ( ) ;
2015-08-06 07:37:40 +02:00
singleton - > setup_network ( ) ;
2015-06-06 14:44:38 +02:00
singleton - > load_favorites ( ) ;
2016-04-12 16:45:31 +02:00
singleton - > list_text_editor_themes ( ) ;
2014-02-10 02:10:30 +01:00
return ;
}
fail :
2016-02-22 00:15:47 +01:00
// patch init projects
if ( extra_config - > has_section ( " init_projects " ) ) {
Vector < String > list = extra_config - > get_value ( " init_projects " , " list " ) ;
for ( int i = 0 ; i < list . size ( ) ; i + + ) {
list [ i ] = exe_path + " / " + list [ i ] ;
} ;
extra_config - > set_value ( " init_projects " , " list " , list ) ;
} ;
2014-02-10 02:10:30 +01:00
singleton = Ref < EditorSettings > ( memnew ( EditorSettings ) ) ;
singleton - > config_file_path = config_file_path ;
2015-04-29 01:36:46 +02:00
singleton - > settings_path = config_path + " / " + config_dir ;
2016-05-28 00:58:28 +02:00
singleton - > _load_defaults ( extra_config ) ;
singleton - > setup_language ( ) ;
2015-08-06 07:37:40 +02:00
singleton - > setup_network ( ) ;
2016-04-12 16:45:31 +02:00
singleton - > list_text_editor_themes ( ) ;
2014-02-10 02:10:30 +01:00
2016-05-28 00:58:28 +02:00
2014-02-10 02:10:30 +01:00
}
String EditorSettings : : get_settings_path ( ) const {
return settings_path ;
}
2016-05-28 00:58:28 +02:00
void EditorSettings : : setup_language ( ) {
String lang = get ( " global/editor_language " ) ;
print_line ( " LANG IS " + lang ) ;
if ( lang = = " en " )
return ; //none to do
for ( int i = 0 ; i < translations . size ( ) ; i + + ) {
print_line ( " TESTING " + translations [ i ] - > get_locale ( ) ) ;
if ( translations [ i ] - > get_locale ( ) = = lang ) {
print_line ( " ok translation " ) ;
TranslationServer : : get_singleton ( ) - > set_tool_translation ( translations [ i ] ) ;
break ;
}
}
}
2015-08-06 07:37:40 +02:00
void EditorSettings : : setup_network ( ) {
List < IP_Address > local_ip ;
IP : : get_singleton ( ) - > get_local_addresses ( & local_ip ) ;
String lip ;
String hint ;
String current = get ( " network/debug_host " ) ;
for ( List < IP_Address > : : Element * E = local_ip . front ( ) ; E ; E = E - > next ( ) ) {
String ip = E - > get ( ) ;
if ( ip = = " 127.0.0.1 " )
continue ;
if ( lip ! = " " )
lip = ip ;
if ( ip = = current )
lip = current ; //so it saves
if ( hint ! = " " )
hint + = " , " ;
hint + = ip ;
}
set ( " network/debug_host " , lip ) ;
add_property_hint ( PropertyInfo ( Variant : : STRING , " network/debug_host " , PROPERTY_HINT_ENUM , hint ) ) ;
}
2014-02-10 02:10:30 +01:00
void EditorSettings : : save ( ) {
//_THREAD_SAFE_METHOD_
if ( ! singleton . ptr ( ) )
return ;
if ( singleton - > config_file_path = = " " ) {
ERR_PRINT ( " Cannot save EditorSettings config, no valid path " ) ;
return ;
}
Error err = ResourceSaver : : save ( singleton - > config_file_path , singleton ) ;
if ( err ! = OK ) {
ERR_PRINT ( " Can't Save! " ) ;
return ;
}
if ( OS : : get_singleton ( ) - > is_stdout_verbose ( ) ) {
2016-05-04 15:28:37 +02:00
print_line ( " EditorSettings Save OK! " ) ;
2014-02-10 02:10:30 +01:00
}
}
void EditorSettings : : destroy ( ) {
if ( ! singleton . ptr ( ) )
return ;
save ( ) ;
singleton = Ref < EditorSettings > ( ) ;
}
2016-02-22 00:15:47 +01:00
void EditorSettings : : _load_defaults ( Ref < ConfigFile > p_extra_config ) {
2014-02-10 02:10:30 +01:00
_THREAD_SAFE_METHOD_
2016-05-28 00:58:28 +02:00
{
String lang_hint = " en " ;
String host_lang = OS : : get_singleton ( ) - > get_locale ( ) ;
String best ;
for ( int i = 0 ; i < translations . size ( ) ; i + + ) {
String locale = translations [ i ] - > get_locale ( ) ;
lang_hint + = " , " ;
lang_hint + = locale ;
if ( host_lang = = locale ) {
best = locale ;
}
if ( best = = String ( ) & & host_lang . begins_with ( locale ) ) {
best = locale ;
}
}
if ( best = = String ( ) ) {
best = " en " ;
}
set ( " global/editor_language " , best ) ;
hints [ " global/editor_language " ] = PropertyInfo ( Variant : : STRING , " global/editor_language " , PROPERTY_HINT_ENUM , lang_hint , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED ) ;
}
set ( " global/show_script_in_scene_tabs " , false ) ;
2014-04-05 17:39:30 +02:00
set ( " global/font " , " " ) ;
hints [ " global/font " ] = PropertyInfo ( Variant : : STRING , " global/font " , PROPERTY_HINT_GLOBAL_FILE , " *.fnt " ) ;
2014-11-01 07:06:29 +01:00
set ( " global/autoscan_project_path " , " " ) ;
hints [ " global/autoscan_project_path " ] = PropertyInfo ( Variant : : STRING , " global/autoscan_project_path " , PROPERTY_HINT_GLOBAL_DIR ) ;
2014-08-25 03:20:45 +02:00
set ( " global/default_project_path " , " " ) ;
hints [ " global/default_project_path " ] = PropertyInfo ( Variant : : STRING , " global/default_project_path " , PROPERTY_HINT_GLOBAL_DIR ) ;
set ( " global/default_project_export_path " , " " ) ;
hints [ " global/default_project_export_path " ] = PropertyInfo ( Variant : : STRING , " global/default_project_export_path " , PROPERTY_HINT_GLOBAL_DIR ) ;
2015-11-18 08:47:41 +01:00
set ( " global/show_script_in_scene_tabs " , false ) ;
2016-04-12 16:45:31 +02:00
2016-05-28 00:58:28 +02:00
2016-04-12 16:45:31 +02:00
set ( " text_editor/color_theme " , " Default " ) ;
hints [ " text_editor/color_theme " ] = PropertyInfo ( Variant : : STRING , " text_editor/color_theme " , PROPERTY_HINT_ENUM , " Default " ) ;
_load_default_text_editor_theme ( ) ;
2014-02-10 02:10:30 +01:00
2016-03-30 20:32:45 +02:00
set ( " text_editor/syntax_highlighting " , true ) ;
2016-03-16 22:20:42 +01:00
set ( " text_editor/highlight_all_occurrences " , true ) ;
2016-03-07 03:32:51 +01:00
set ( " text_editor/scroll_past_end_of_file " , false ) ;
2016-03-11 19:10:01 +01:00
set ( " text_editor/tab_size " , 4 ) ;
hints [ " text_editor/tab_size " ] = PropertyInfo ( Variant : : INT , " text_editor/tab_size " , PROPERTY_HINT_RANGE , " 1, 64, 1 " ) ; // size of 0 crashes.
2016-03-18 13:49:18 +01:00
set ( " text_editor/draw_tabs " , true ) ;
2016-03-11 19:10:01 +01:00
2016-03-30 20:16:52 +02:00
set ( " text_editor/show_line_numbers " , true ) ;
2016-04-23 20:21:34 +02:00
set ( " text_editor/trim_trailing_whitespace_on_save " , false ) ;
2014-02-10 02:10:30 +01:00
set ( " text_editor/idle_parse_delay " , 2 ) ;
set ( " text_editor/create_signal_callbacks " , true ) ;
2015-05-05 04:32:40 +02:00
set ( " text_editor/autosave_interval_secs " , 0 ) ;
2015-06-22 05:03:19 +02:00
2016-05-09 20:21:55 +02:00
set ( " text_editor/caret_blink " , false ) ;
set ( " text_editor/caret_blink_speed " , 0.65 ) ;
hints [ " text_editor/caret_blink_speed " ] = PropertyInfo ( Variant : : REAL , " text_editor/caret_blink_speed " , PROPERTY_HINT_RANGE , " 0.1, 10, 0.1 " ) ;
2014-04-05 17:39:30 +02:00
set ( " text_editor/font " , " " ) ;
hints [ " text_editor/font " ] = PropertyInfo ( Variant : : STRING , " text_editor/font " , PROPERTY_HINT_GLOBAL_FILE , " *.fnt " ) ;
2014-08-25 03:20:45 +02:00
set ( " text_editor/auto_brace_complete " , false ) ;
2015-06-22 05:03:19 +02:00
set ( " text_editor/restore_scripts_on_load " , true ) ;
2014-04-05 17:39:30 +02:00
2014-02-10 02:10:30 +01:00
2015-01-11 06:08:32 +01:00
set ( " scenetree_editor/duplicate_node_name_num_separator " , 0 ) ;
hints [ " scenetree_editor/duplicate_node_name_num_separator " ] = PropertyInfo ( Variant : : INT , " scenetree_editor/duplicate_node_name_num_separator " , PROPERTY_HINT_ENUM , " None,Space,Underscore,Dash " ) ;
2016-05-17 23:27:15 +02:00
//set("scenetree_editor/display_old_action_buttons",false);
2015-01-11 06:08:32 +01:00
2015-07-10 04:51:49 +02:00
set ( " gridmap_editor/pick_distance " , 5000.0 ) ;
2015-01-11 06:08:32 +01:00
2014-02-10 02:10:30 +01:00
set ( " 3d_editor/default_fov " , 45.0 ) ;
set ( " 3d_editor/default_z_near " , 0.1 ) ;
set ( " 3d_editor/default_z_far " , 500.0 ) ;
2014-03-31 05:07:21 +02:00
set ( " 3d_editor/navigation_scheme " , 0 ) ;
2014-03-31 09:52:27 +02:00
hints [ " 3d_editor/navigation_scheme " ] = PropertyInfo ( Variant : : INT , " 3d_editor/navigation_scheme " , PROPERTY_HINT_ENUM , " Godot,Maya,Modo " ) ;
2014-12-28 14:01:08 +01:00
set ( " 3d_editor/zoom_style " , 0 ) ;
hints [ " 3d_editor/zoom_style " ] = PropertyInfo ( Variant : : INT , " 3d_editor/zoom_style " , PROPERTY_HINT_ENUM , " Vertical, Horizontal " ) ;
2014-02-10 02:10:30 +01:00
set ( " 3d_editor/orbit_modifier " , 0 ) ;
hints [ " 3d_editor/orbit_modifier " ] = PropertyInfo ( Variant : : INT , " 3d_editor/orbit_modifier " , PROPERTY_HINT_ENUM , " None,Shift,Alt,Meta,Ctrl " ) ;
set ( " 3d_editor/pan_modifier " , 1 ) ;
hints [ " 3d_editor/pan_modifier " ] = PropertyInfo ( Variant : : INT , " 3d_editor/pan_modifier " , PROPERTY_HINT_ENUM , " None,Shift,Alt,Meta,Ctrl " ) ;
set ( " 3d_editor/zoom_modifier " , 4 ) ;
hints [ " 3d_editor/zoom_modifier " ] = PropertyInfo ( Variant : : INT , " 3d_editor/zoom_modifier " , PROPERTY_HINT_ENUM , " None,Shift,Alt,Meta,Ctrl " ) ;
2016-02-07 19:48:13 +01:00
set ( " 3d_editor/emulate_numpad " , false ) ;
2016-04-12 03:37:35 +02:00
set ( " 3d_editor/trackpad_hint " , false ) ;
2014-02-10 02:10:30 +01:00
2014-07-06 16:49:27 +02:00
set ( " 2d_editor/bone_width " , 5 ) ;
set ( " 2d_editor/bone_color1 " , Color ( 1.0 , 1.0 , 1.0 , 0.9 ) ) ;
set ( " 2d_editor/bone_color2 " , Color ( 0.75 , 0.75 , 0.75 , 0.9 ) ) ;
set ( " 2d_editor/bone_selected_color " , Color ( 0.9 , 0.45 , 0.45 , 0.9 ) ) ;
set ( " 2d_editor/bone_ik_color " , Color ( 0.9 , 0.9 , 0.45 , 0.9 ) ) ;
2016-05-21 15:29:25 +02:00
2016-05-10 19:20:28 +02:00
set ( " 2d_editor/keep_margins_when_changing_anchors " , false ) ;
2014-07-06 16:49:27 +02:00
2015-08-31 04:36:46 +02:00
set ( " game_window_placement/rect " , 0 ) ;
hints [ " game_window_placement/rect " ] = PropertyInfo ( Variant : : INT , " game_window_placement/rect " , PROPERTY_HINT_ENUM , " Default,Centered,Custom Position,Force Maximized,Force Full Screen " ) ;
2016-05-04 03:25:37 +02:00
String screen_hints = TTR ( " Default (Same as Editor) " ) ;
2015-08-31 04:36:46 +02:00
for ( int i = 0 ; i < OS : : get_singleton ( ) - > get_screen_count ( ) ; i + + ) {
screen_hints + = " ,Monitor " + itos ( i + 1 ) ;
}
set ( " game_window_placement/rect_custom_position " , Vector2 ( ) ) ;
set ( " game_window_placement/screen " , 0 ) ;
hints [ " game_window_placement/screen " ] = PropertyInfo ( Variant : : INT , " game_window_placement/screen " , PROPERTY_HINT_ENUM , screen_hints ) ;
2015-08-06 07:37:40 +02:00
2014-02-10 02:10:30 +01:00
set ( " on_save/compress_binary_resources " , true ) ;
set ( " on_save/save_modified_external_resources " , true ) ;
set ( " on_save/save_paths_as_relative " , false ) ;
2014-02-25 13:31:47 +01:00
set ( " on_save/save_paths_without_extension " , false ) ;
2014-02-10 02:10:30 +01:00
set ( " text_editor/create_signal_callbacks " , true ) ;
2015-03-21 18:33:32 +01:00
set ( " file_dialog/show_hidden_files " , false ) ;
2015-12-15 17:39:13 +01:00
set ( " file_dialog/display_mode " , 0 ) ;
hints [ " file_dialog/display_mode " ] = PropertyInfo ( Variant : : INT , " file_dialog/display_mode " , PROPERTY_HINT_ENUM , " Thumbnails,List " ) ;
2015-05-31 06:59:42 +02:00
set ( " file_dialog/thumbnail_size " , 64 ) ;
hints [ " file_dialog/thumbnail_size " ] = PropertyInfo ( Variant : : INT , " file_dialog/thumbnail_size " , PROPERTY_HINT_RANGE , " 32,128,16 " ) ;
2014-02-10 02:10:30 +01:00
set ( " animation/autorename_animation_tracks " , true ) ;
2014-12-08 10:35:06 +01:00
set ( " animation/confirm_insert_track " , true ) ;
2014-02-10 02:10:30 +01:00
set ( " property_editor/texture_preview_width " , 48 ) ;
2015-01-03 19:39:01 +01:00
set ( " property_editor/auto_refresh_interval " , 0.3 ) ;
2014-02-10 02:10:30 +01:00
set ( " help/doc_path " , " " ) ;
set ( " import/ask_save_before_reimport " , false ) ;
set ( " import/pvrtc_texture_tool " , " " ) ;
# ifdef WINDOWS_ENABLED
2014-04-05 17:39:30 +02:00
hints [ " import/pvrtc_texture_tool " ] = PropertyInfo ( Variant : : STRING , " import/pvrtc_texture_tool " , PROPERTY_HINT_GLOBAL_FILE , " *.exe " ) ;
2014-02-10 02:10:30 +01:00
# else
2014-04-05 17:39:30 +02:00
hints [ " import/pvrtc_texture_tool " ] = PropertyInfo ( Variant : : STRING , " import/pvrtc_texture_tool " , PROPERTY_HINT_GLOBAL_FILE , " " ) ;
2014-02-10 02:10:30 +01:00
# endif
2016-05-19 00:08:12 +02:00
// TODO: Rename to "import/pvrtc_fast_conversion" to match other names?
set ( " PVRTC/fast_conversion " , false ) ;
2014-02-10 02:10:30 +01:00
set ( " run/auto_save_before_running " , true ) ;
set ( " resources/save_compressed_resources " , true ) ;
2014-05-05 03:50:23 +02:00
set ( " resources/auto_reload_modified_images " , true ) ;
2016-02-22 00:15:47 +01:00
2016-05-27 19:18:40 +02:00
set ( " import/automatic_reimport_on_sources_changed " , true ) ;
2016-02-27 16:11:40 +01:00
if ( p_extra_config . is_valid ( ) ) {
2016-02-22 00:15:47 +01:00
2016-02-27 16:11:40 +01:00
if ( p_extra_config - > has_section ( " init_projects " ) & & p_extra_config - > has_section_key ( " init_projects " , " list " ) ) {
Vector < String > list = p_extra_config - > get_value ( " init_projects " , " list " ) ;
for ( int i = 0 ; i < list . size ( ) ; i + + ) {
String name = list [ i ] . replace ( " / " , " :: " ) ;
set ( " projects/ " + name , list [ i ] ) ;
} ;
} ;
if ( p_extra_config - > has_section ( " presets " ) ) {
List < String > keys ;
p_extra_config - > get_section_keys ( " presets " , & keys ) ;
for ( List < String > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
2016-02-22 00:15:47 +01:00
2016-02-27 16:11:40 +01:00
String key = E - > get ( ) ;
Variant val = p_extra_config - > get_value ( " presets " , key ) ;
set ( key , val ) ;
} ;
2016-02-22 00:15:47 +01:00
} ;
} ;
2016-05-16 17:23:40 +02:00
2016-04-12 16:45:31 +02:00
}
void EditorSettings : : _load_default_text_editor_theme ( ) {
set ( " text_editor/background_color " , Color : : html ( " 3b000000 " ) ) ;
set ( " text_editor/caret_color " , Color : : html ( " aaaaaa " ) ) ;
set ( " text_editor/line_number_color " , Color : : html ( " 66aaaaaa " ) ) ;
set ( " text_editor/text_color " , Color : : html ( " aaaaaa " ) ) ;
set ( " text_editor/text_selected_color " , Color : : html ( " 000000 " ) ) ;
set ( " text_editor/keyword_color " , Color : : html ( " ffffb3 " ) ) ;
set ( " text_editor/base_type_color " , Color : : html ( " a4ffd4 " ) ) ;
set ( " text_editor/engine_type_color " , Color : : html ( " 83d3ff " ) ) ;
set ( " text_editor/function_color " , Color : : html ( " 66a2ce " ) ) ;
set ( " text_editor/member_variable_color " , Color : : html ( " e64e59 " ) ) ;
set ( " text_editor/comment_color " , Color : : html ( " 676767 " ) ) ;
set ( " text_editor/string_color " , Color : : html ( " ef6ebe " ) ) ;
set ( " text_editor/number_color " , Color : : html ( " EB9532 " ) ) ;
set ( " text_editor/symbol_color " , Color : : html ( " badfff " ) ) ;
set ( " text_editor/selection_color " , Color : : html ( " 7b5dbe " ) ) ;
set ( " text_editor/brace_mismatch_color " , Color ( 1 , 0.2 , 0.2 ) ) ;
set ( " text_editor/current_line_color " , Color ( 0.3 , 0.5 , 0.8 , 0.15 ) ) ;
2016-05-25 17:57:33 +02:00
set ( " text_editor/mark_color " , Color ( 1.0 , 0.4 , 0.4 , 0.4 ) ) ;
set ( " text_editor/breakpoint_color " , Color ( 0.8 , 0.8 , 0.4 , 0.2 ) ) ;
2016-04-12 16:45:31 +02:00
set ( " text_editor/word_highlighted_color " , Color ( 0.8 , 0.9 , 0.9 , 0.15 ) ) ;
2014-02-10 02:10:30 +01:00
}
void EditorSettings : : notify_changes ( ) {
_THREAD_SAFE_METHOD_
2014-11-06 01:20:42 +01:00
SceneTree * sml = NULL ;
2014-02-10 02:10:30 +01:00
if ( OS : : get_singleton ( ) - > get_main_loop ( ) )
2014-11-06 01:20:42 +01:00
sml = OS : : get_singleton ( ) - > get_main_loop ( ) - > cast_to < SceneTree > ( ) ;
2014-02-10 02:10:30 +01:00
if ( ! sml ) {
print_line ( " not SML " ) ;
return ;
}
Node * root = sml - > get_root ( ) - > get_child ( 0 ) ;
if ( ! root ) {
return ;
}
root - > propagate_notification ( NOTIFICATION_EDITOR_SETTINGS_CHANGED ) ;
}
void EditorSettings : : add_property_hint ( const PropertyInfo & p_hint ) {
_THREAD_SAFE_METHOD_
hints [ p_hint . name ] = p_hint ;
}
2015-06-06 14:44:38 +02:00
void EditorSettings : : set_favorite_dirs ( const Vector < String > & p_favorites ) {
favorite_dirs = p_favorites ;
FileAccess * f = FileAccess : : open ( get_project_settings_path ( ) . plus_file ( " favorite_dirs " ) , FileAccess : : WRITE ) ;
if ( f ) {
for ( int i = 0 ; i < favorite_dirs . size ( ) ; i + + )
f - > store_line ( favorite_dirs [ i ] ) ;
memdelete ( f ) ;
}
}
Vector < String > EditorSettings : : get_favorite_dirs ( ) const {
return favorite_dirs ;
}
void EditorSettings : : set_recent_dirs ( const Vector < String > & p_recent ) {
recent_dirs = p_recent ;
FileAccess * f = FileAccess : : open ( get_project_settings_path ( ) . plus_file ( " recent_dirs " ) , FileAccess : : WRITE ) ;
if ( f ) {
for ( int i = 0 ; i < recent_dirs . size ( ) ; i + + )
f - > store_line ( recent_dirs [ i ] ) ;
memdelete ( f ) ;
}
}
Vector < String > EditorSettings : : get_recent_dirs ( ) const {
return recent_dirs ;
}
String EditorSettings : : get_project_settings_path ( ) const {
return get_settings_path ( ) . plus_file ( " config " ) . plus_file ( project_config_path ) ;
}
void EditorSettings : : load_favorites ( ) {
FileAccess * f = FileAccess : : open ( get_project_settings_path ( ) . plus_file ( " favorite_dirs " ) , FileAccess : : READ ) ;
if ( f ) {
String line = f - > get_line ( ) . strip_edges ( ) ;
while ( line ! = " " ) {
favorite_dirs . push_back ( line ) ;
line = f - > get_line ( ) . strip_edges ( ) ;
}
memdelete ( f ) ;
}
f = FileAccess : : open ( get_project_settings_path ( ) . plus_file ( " recent_dirs " ) , FileAccess : : READ ) ;
if ( f ) {
String line = f - > get_line ( ) . strip_edges ( ) ;
while ( line ! = " " ) {
recent_dirs . push_back ( line ) ;
line = f - > get_line ( ) . strip_edges ( ) ;
}
memdelete ( f ) ;
}
}
2016-04-12 16:45:31 +02:00
void EditorSettings : : list_text_editor_themes ( ) {
String themes = " Default " ;
DirAccess * d = DirAccess : : open ( settings_path + " /text_editor_themes " ) ;
if ( d ) {
d - > list_dir_begin ( ) ;
String file = d - > get_next ( ) ;
while ( file ! = String ( ) ) {
if ( file . extension ( ) = = " tet " & & file . basename ( ) . to_lower ( ) ! = " default " ) {
themes + = " , " + file . basename ( ) ;
}
file = d - > get_next ( ) ;
}
d - > list_dir_end ( ) ;
memdelete ( d ) ;
}
add_property_hint ( PropertyInfo ( Variant : : STRING , " text_editor/color_theme " , PROPERTY_HINT_ENUM , themes ) ) ;
}
void EditorSettings : : load_text_editor_theme ( ) {
if ( get ( " text_editor/color_theme " ) = = " Default " ) {
_load_default_text_editor_theme ( ) ; // sorry for "Settings changed" console spam
return ;
}
String theme_path = get_settings_path ( ) + " /text_editor_themes/ " + get ( " text_editor/color_theme " ) + " .tet " ;
Ref < ConfigFile > cf = memnew ( ConfigFile ) ;
Error err = cf - > load ( theme_path ) ;
if ( err ! = OK ) {
return ;
}
List < String > keys ;
cf - > get_section_keys ( " color_theme " , & keys ) ;
for ( List < String > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
String key = E - > get ( ) ;
String val = cf - > get_value ( " color_theme " , key ) ;
// don't load if it's not already there!
if ( has ( " text_editor/ " + key ) ) {
// make sure it is actually a color
if ( val . is_valid_html_color ( ) & & key . find ( " color " ) > = 0 ) {
props [ " text_editor/ " + key ] . variant = Color : : html ( val ) ; // change manually to prevent "Settings changed" console spam
}
}
}
emit_signal ( " settings_changed " ) ;
// if it doesn't load just use what is currently loaded
}
bool EditorSettings : : import_text_editor_theme ( String p_file ) {
if ( ! p_file . ends_with ( " .tet " ) ) {
return false ;
} else {
if ( p_file . get_file ( ) . to_lower ( ) = = " default.tet " ) {
return false ;
}
DirAccess * d = DirAccess : : open ( settings_path + " /text_editor_themes " ) ;
if ( d ) {
d - > copy ( p_file , settings_path + " /text_editor_themes/ " + p_file . get_file ( ) ) ;
memdelete ( d ) ;
return true ;
}
}
return false ;
}
bool EditorSettings : : save_text_editor_theme ( ) {
String p_file = get ( " text_editor/color_theme " ) ;
if ( p_file . get_file ( ) . to_lower ( ) = = " default " ) {
return false ;
}
String theme_path = get_settings_path ( ) + " /text_editor_themes/ " + p_file + " .tet " ;
return _save_text_editor_theme ( theme_path ) ;
}
bool EditorSettings : : save_text_editor_theme_as ( String p_file ) {
if ( ! p_file . ends_with ( " .tet " ) ) {
p_file + = " .tet " ;
}
if ( p_file . get_file ( ) . to_lower ( ) = = " default.tet " ) {
return false ;
}
if ( _save_text_editor_theme ( p_file ) ) {
// switch to theme is saved in the theme directory
list_text_editor_themes ( ) ;
String theme_name = p_file . substr ( 0 , p_file . length ( ) - 4 ) . get_file ( ) ;
if ( p_file . get_base_dir ( ) = = get_settings_path ( ) + " /text_editor_themes " ) {
set ( " text_editor/color_theme " , theme_name ) ;
load_text_editor_theme ( ) ;
}
return true ;
}
return false ;
}
bool EditorSettings : : _save_text_editor_theme ( String p_file ) {
String theme_section = " color_theme " ;
Ref < ConfigFile > cf = memnew ( ConfigFile ) ; // hex is better?
cf - > set_value ( theme_section , " background_color " , ( ( Color ) get ( " text_editor/background_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " caret_color " , ( ( Color ) get ( " text_editor/caret_color " ) ) . to_html ( ) ) ;
2016-05-23 17:23:05 +02:00
cf - > set_value ( theme_section , " line_number_color " , ( ( Color ) get ( " text_editor/line_number_color " ) ) . to_html ( ) ) ;
2016-04-12 16:45:31 +02:00
cf - > set_value ( theme_section , " text_color " , ( ( Color ) get ( " text_editor/text_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " text_selected_color " , ( ( Color ) get ( " text_editor/text_selected_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " keyword_color " , ( ( Color ) get ( " text_editor/keyword_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " base_type_color " , ( ( Color ) get ( " text_editor/base_type_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " engine_type_color " , ( ( Color ) get ( " text_editor/engine_type_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " function_color " , ( ( Color ) get ( " text_editor/function_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " member_variable_color " , ( ( Color ) get ( " text_editor/member_variable_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " comment_color " , ( ( Color ) get ( " text_editor/comment_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " string_color " , ( ( Color ) get ( " text_editor/string_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " number_color " , ( ( Color ) get ( " text_editor/number_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " symbol_color " , ( ( Color ) get ( " text_editor/symbol_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " selection_color " , ( ( Color ) get ( " text_editor/selection_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " brace_mismatch_color " , ( ( Color ) get ( " text_editor/brace_mismatch_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " current_line_color " , ( ( Color ) get ( " text_editor/current_line_color " ) ) . to_html ( ) ) ;
2016-05-25 17:57:33 +02:00
cf - > set_value ( theme_section , " mark_color " , ( ( Color ) get ( " text_editor/mark_color " ) ) . to_html ( ) ) ;
cf - > set_value ( theme_section , " breakpoint_color " , ( ( Color ) get ( " text_editor/breakpoint_color " ) ) . to_html ( ) ) ;
2016-04-12 16:45:31 +02:00
cf - > set_value ( theme_section , " word_highlighted_color " , ( ( Color ) get ( " text_editor/word_highlighted_color " ) ) . to_html ( ) ) ;
Error err = cf - > save ( p_file ) ;
if ( err = = OK ) {
return true ;
}
return false ;
}
2014-02-10 02:10:30 +01:00
void EditorSettings : : _bind_methods ( ) {
2016-02-27 04:32:00 +01:00
ObjectTypeDB : : bind_method ( _MD ( " erase " , " property " ) , & EditorSettings : : erase ) ;
ObjectTypeDB : : bind_method ( _MD ( " get_settings_path " ) , & EditorSettings : : get_settings_path ) ;
ObjectTypeDB : : bind_method ( _MD ( " get_project_settings_path " ) , & EditorSettings : : get_project_settings_path ) ;
ObjectTypeDB : : bind_method ( _MD ( " set_favorite_dirs " , " dirs " ) , & EditorSettings : : set_favorite_dirs ) ;
ObjectTypeDB : : bind_method ( _MD ( " get_favorite_dirs " ) , & EditorSettings : : get_favorite_dirs ) ;
ObjectTypeDB : : bind_method ( _MD ( " set_recent_dirs " , " dirs " ) , & EditorSettings : : set_recent_dirs ) ;
ObjectTypeDB : : bind_method ( _MD ( " get_recent_dirs " ) , & EditorSettings : : get_recent_dirs ) ;
2014-02-10 02:10:30 +01:00
ADD_SIGNAL ( MethodInfo ( " settings_changed " ) ) ;
}
EditorSettings : : EditorSettings ( ) {
//singleton=this;
last_order = 0 ;
2016-05-28 00:58:28 +02:00
EditorTranslationList * etl = _editor_translations ;
while ( etl - > data ) {
Vector < uint8_t > data ;
data . resize ( etl - > uncomp_size ) ;
Compression : : decompress ( data . ptr ( ) , etl - > uncomp_size , etl - > data , etl - > comp_size , Compression : : MODE_DEFLATE ) ;
FileAccessMemory * fa = memnew ( FileAccessMemory ) ;
fa - > open_custom ( data . ptr ( ) , data . size ( ) ) ;
Ref < Translation > tr = TranslationLoaderPO : : load_translation ( fa , NULL , " translation_ " + String ( etl - > lang ) ) ;
if ( tr . is_valid ( ) ) {
tr - > set_locale ( etl - > lang ) ;
translations . push_back ( tr ) ;
}
etl + + ;
}
2014-02-10 02:10:30 +01:00
_load_defaults ( ) ;
2016-05-28 00:58:28 +02:00
2014-02-10 02:10:30 +01:00
}
EditorSettings : : ~ EditorSettings ( ) {
// singleton=NULL;
}