Path: blob/master/editor/settings/editor_settings.cpp
9902 views
/**************************************************************************/1/* editor_settings.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "editor_settings.h"3132#include "core/config/project_settings.h"33#include "core/input/input_event.h"34#include "core/input/input_map.h"35#include "core/input/shortcut.h"36#include "core/io/certs_compressed.gen.h"37#include "core/io/dir_access.h"38#include "core/io/file_access.h"39#include "core/io/ip.h"40#include "core/io/resource_loader.h"41#include "core/io/resource_saver.h"42#include "core/object/class_db.h"43#include "core/os/keyboard.h"44#include "core/os/os.h"45#include "core/string/translation_server.h"46#include "core/version.h"47#include "editor/editor_node.h"48#include "editor/file_system/editor_paths.h"49#include "editor/inspector/editor_property_name_processor.h"50#include "editor/project_manager/engine_update_label.h"51#include "editor/translations/editor_translation.h"52#include "modules/regex/regex.h"53#include "scene/gui/color_picker.h"54#include "scene/main/node.h"55#include "scene/main/scene_tree.h"56#include "scene/main/window.h"57#include "scene/resources/animation.h"5859// PRIVATE METHODS6061Ref<EditorSettings> EditorSettings::singleton = nullptr;6263// Properties6465bool EditorSettings::_set(const StringName &p_name, const Variant &p_value) {66_THREAD_SAFE_METHOD_6768bool changed = _set_only(p_name, p_value);69if (changed && initialized) {70changed_settings.insert(p_name);71if (p_name == SNAME("text_editor/external/exec_path")) {72const StringName exec_args_name = "text_editor/external/exec_flags";73const String exec_args_value = _guess_exec_args_for_extenal_editor(p_value);74if (!exec_args_value.is_empty() && _set_only(exec_args_name, exec_args_value)) {75changed_settings.insert(exec_args_name);76}77}78emit_signal(SNAME("settings_changed"));7980if (p_name == SNAME("interface/editor/editor_language")) {81setup_language();82}83}84return true;85}8687bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) {88_THREAD_SAFE_METHOD_8990if (p_name == "shortcuts") {91Array arr = p_value;92for (int i = 0; i < arr.size(); i++) {93Dictionary dict = arr[i];94String shortcut_name = dict["name"];9596Array shortcut_events = dict["shortcuts"];9798Ref<Shortcut> sc;99sc.instantiate();100sc->set_events(shortcut_events);101add_shortcut(shortcut_name, sc);102}103104return false;105} else if (p_name == "builtin_action_overrides") {106Array actions_arr = p_value;107for (int i = 0; i < actions_arr.size(); i++) {108Dictionary action_dict = actions_arr[i];109110String action_name = action_dict["name"];111Array events = action_dict["events"];112113InputMap *im = InputMap::get_singleton();114im->action_erase_events(action_name);115116builtin_action_overrides[action_name].clear();117for (int ev_idx = 0; ev_idx < events.size(); ev_idx++) {118im->action_add_event(action_name, events[ev_idx]);119builtin_action_overrides[action_name].push_back(events[ev_idx]);120}121}122return false;123}124125bool changed = false;126127if (p_value.get_type() == Variant::NIL) {128if (props.has(p_name)) {129props.erase(p_name);130changed = true;131}132} else {133if (props.has(p_name)) {134if (p_value != props[p_name].variant) {135props[p_name].variant = p_value;136changed = true;137}138} else {139props[p_name] = VariantContainer(p_value, last_order++);140changed = true;141}142143if (save_changed_setting) {144if (!props[p_name].save) {145props[p_name].save = true;146changed = true;147}148}149}150151return changed;152}153154bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {155_THREAD_SAFE_METHOD_156157if (p_name == "shortcuts") {158Array save_array;159const HashMap<String, List<Ref<InputEvent>>> &builtin_list = InputMap::get_singleton()->get_builtins();160for (const KeyValue<String, Ref<Shortcut>> &shortcut_definition : shortcuts) {161Ref<Shortcut> sc = shortcut_definition.value;162163if (builtin_list.has(shortcut_definition.key)) {164// This shortcut was auto-generated from built in actions: don't save.165// If the builtin is overridden, it will be saved in the "builtin_action_overrides" section below.166continue;167}168169Array shortcut_events = sc->get_events();170171Dictionary dict;172dict["name"] = shortcut_definition.key;173dict["shortcuts"] = shortcut_events;174175if (!sc->has_meta("original")) {176// Getting the meta when it doesn't exist will return an empty array. If the 'shortcut_events' have been cleared,177// we still want save the shortcut in this case so that shortcuts that the user has customized are not reset,178// even if the 'original' has not been populated yet. This can happen when calling save() from the Project Manager.179save_array.push_back(dict);180continue;181}182183Array original_events = sc->get_meta("original");184185bool is_same = Shortcut::is_event_array_equal(original_events, shortcut_events);186if (is_same) {187continue; // Not changed from default; don't save.188}189190save_array.push_back(dict);191}192r_ret = save_array;193return true;194} else if (p_name == "builtin_action_overrides") {195Array actions_arr;196for (const KeyValue<String, List<Ref<InputEvent>>> &action_override : builtin_action_overrides) {197const List<Ref<InputEvent>> *defaults = InputMap::get_singleton()->get_builtins().getptr(action_override.key);198if (!defaults) {199continue;200}201202List<Ref<InputEvent>> events = action_override.value;203204Dictionary action_dict;205action_dict["name"] = action_override.key;206207// Convert the list to an array, and only keep key events as this is for the editor.208Array events_arr;209for (const Ref<InputEvent> &ie : events) {210Ref<InputEventKey> iek = ie;211if (iek.is_valid()) {212events_arr.append(iek);213}214}215216Array defaults_arr;217for (const Ref<InputEvent> &default_input_event : *defaults) {218if (default_input_event.is_valid()) {219defaults_arr.append(default_input_event);220}221}222223bool same = Shortcut::is_event_array_equal(events_arr, defaults_arr);224225// Don't save if same as default.226if (same) {227continue;228}229230action_dict["events"] = events_arr;231actions_arr.push_back(action_dict);232}233234r_ret = actions_arr;235return true;236}237238const VariantContainer *v = props.getptr(p_name);239if (!v) {240return false;241}242r_ret = v->variant;243return true;244}245246void EditorSettings::_initial_set(const StringName &p_name, const Variant &p_value, bool p_basic) {247set(p_name, p_value);248props[p_name].initial = p_value;249props[p_name].has_default_value = true;250props[p_name].basic = p_basic;251}252253struct _EVCSort {254String name;255Variant::Type type = Variant::Type::NIL;256int order = 0;257bool basic = false;258bool save = false;259bool restart_if_changed = false;260261bool operator<(const _EVCSort &p_vcs) const { return order < p_vcs.order; }262};263264void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {265_THREAD_SAFE_METHOD_266267RBSet<_EVCSort> vclist;268269for (const KeyValue<String, VariantContainer> &E : props) {270const VariantContainer *v = &E.value;271272if (v->hide_from_editor) {273continue;274}275276_EVCSort vc;277vc.name = E.key;278vc.order = v->order;279vc.type = v->variant.get_type();280vc.basic = v->basic;281vc.save = v->save;282if (vc.save) {283if (v->initial.get_type() != Variant::NIL && v->initial == v->variant) {284vc.save = false;285}286}287vc.restart_if_changed = v->restart_if_changed;288289vclist.insert(vc);290}291292for (const _EVCSort &E : vclist) {293uint32_t pusage = PROPERTY_USAGE_NONE;294if (E.save || !optimize_save) {295pusage |= PROPERTY_USAGE_STORAGE;296}297298if (!E.name.begins_with("_") && !E.name.begins_with("projects/")) {299pusage |= PROPERTY_USAGE_EDITOR;300} else {301pusage |= PROPERTY_USAGE_STORAGE; //hiddens must always be saved302}303304PropertyInfo pi(E.type, E.name);305pi.usage = pusage;306if (hints.has(E.name)) {307pi = hints[E.name];308}309310if (E.basic) {311pi.usage |= PROPERTY_USAGE_EDITOR_BASIC_SETTING;312}313314if (E.restart_if_changed) {315pi.usage |= PROPERTY_USAGE_RESTART_IF_CHANGED;316}317318p_list->push_back(pi);319}320321p_list->push_back(PropertyInfo(Variant::ARRAY, "shortcuts", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL)); //do not edit322p_list->push_back(PropertyInfo(Variant::ARRAY, "builtin_action_overrides", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL));323}324325void EditorSettings::_add_property_info_bind(const Dictionary &p_info) {326ERR_FAIL_COND_MSG(!p_info.has("name"), "Property info is missing \"name\" field.");327ERR_FAIL_COND_MSG(!p_info.has("type"), "Property info is missing \"type\" field.");328329if (p_info.has("usage")) {330WARN_PRINT("\"usage\" is not supported in add_property_info().");331}332333PropertyInfo pinfo;334pinfo.name = p_info["name"];335ERR_FAIL_COND(!props.has(pinfo.name));336pinfo.type = Variant::Type(p_info["type"].operator int());337ERR_FAIL_INDEX(pinfo.type, Variant::VARIANT_MAX);338339if (p_info.has("hint")) {340pinfo.hint = PropertyHint(p_info["hint"].operator int());341}342if (p_info.has("hint_string")) {343pinfo.hint_string = p_info["hint_string"];344}345346add_property_hint(pinfo);347}348349// Default configs350bool EditorSettings::has_default_value(const String &p_setting) const {351_THREAD_SAFE_METHOD_352353if (!props.has(p_setting)) {354return false;355}356return props[p_setting].has_default_value;357}358359void EditorSettings::_set_initialized() {360initialized = true;361}362363void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {364_THREAD_SAFE_METHOD_365// Sets up the editor setting with a default value and hint PropertyInfo.366#define EDITOR_SETTING(m_type, m_property_hint, m_name, m_default_value, m_hint_string) \367_initial_set(m_name, m_default_value); \368hints[m_name] = PropertyInfo(m_type, m_name, m_property_hint, m_hint_string);369370#define EDITOR_SETTING_BASIC(m_type, m_property_hint, m_name, m_default_value, m_hint_string) \371_initial_set(m_name, m_default_value, true); \372hints[m_name] = PropertyInfo(m_type, m_name, m_property_hint, m_hint_string);373374#define EDITOR_SETTING_USAGE(m_type, m_property_hint, m_name, m_default_value, m_hint_string, m_usage) \375_initial_set(m_name, m_default_value); \376hints[m_name] = PropertyInfo(m_type, m_name, m_property_hint, m_hint_string, m_usage);377378/* Languages */379380{381String lang_hint = "en";382String host_lang = OS::get_singleton()->get_locale();383384// Skip locales if Text server lack required features.385Vector<String> locales_to_skip;386if (!TS->has_feature(TextServer::FEATURE_BIDI_LAYOUT) || !TS->has_feature(TextServer::FEATURE_SHAPING)) {387locales_to_skip.push_back("ar"); // Arabic388locales_to_skip.push_back("fa"); // Persian389locales_to_skip.push_back("ur"); // Urdu390}391if (!TS->has_feature(TextServer::FEATURE_BIDI_LAYOUT)) {392locales_to_skip.push_back("he"); // Hebrew393}394if (!TS->has_feature(TextServer::FEATURE_SHAPING)) {395locales_to_skip.push_back("bn"); // Bengali396locales_to_skip.push_back("hi"); // Hindi397locales_to_skip.push_back("ml"); // Malayalam398locales_to_skip.push_back("si"); // Sinhala399locales_to_skip.push_back("ta"); // Tamil400locales_to_skip.push_back("te"); // Telugu401}402403if (!locales_to_skip.is_empty()) {404WARN_PRINT("Some locales are not properly supported by selected Text Server and are disabled.");405}406407String best;408int best_score = 0;409for (const String &locale : get_editor_locales()) {410// Skip locales which we can't render properly (see above comment).411// Test against language code without regional variants (e.g. ur_PK).412String lang_code = locale.get_slicec('_', 0);413if (locales_to_skip.has(lang_code)) {414continue;415}416417lang_hint += ",";418lang_hint += locale;419420int score = TranslationServer::get_singleton()->compare_locales(host_lang, locale);421if (score > 0 && score >= best_score) {422best = locale;423best_score = score;424}425}426if (best_score == 0) {427best = "en";428}429430EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_ENUM, "interface/editor/editor_language", best, lang_hint, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING);431}432433// Asset library434_initial_set("asset_library/use_threads", true);435436/* Interface */437438// Editor439EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/localize_settings", true, "")440EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/dock_tab_style", 0, "Text Only,Icon Only,Text and Icon")441EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/ui_layout_direction", 0, "Based on Application Locale,Left-to-Right,Right-to-Left,Based on System Locale", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)442443// Display what the Auto display scale setting effectively corresponds to.444const String display_scale_hint_string = vformat("Auto (%d%%),75%%,100%%,125%%,150%%,175%%,200%%,Custom", Math::round(get_auto_display_scale() * 100));445EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/display_scale", 0, display_scale_hint_string, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)446EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/editor/custom_display_scale", 1.0, "0.5,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)447448String ed_screen_hints = "Auto (Remembers last position):-5,Screen With Mouse Pointer:-4,Screen With Keyboard Focus:-3,Primary Screen:-2";449for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {450ed_screen_hints += ",Screen " + itos(i + 1) + ":" + itos(i);451}452EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/editor_screen", EditorSettings::InitialScreen::INITIAL_SCREEN_AUTO, ed_screen_hints)453454#ifdef WINDOWS_ENABLED455String tablet_hints = "Use Project Settings:-1";456for (int i = 0; i < DisplayServer::get_singleton()->tablet_get_driver_count(); i++) {457String drv_name = DisplayServer::get_singleton()->tablet_get_driver_name(i);458if (EditorPropertyNameProcessor::get_singleton()) {459drv_name = EditorPropertyNameProcessor::get_singleton()->process_name(drv_name, EditorPropertyNameProcessor::STYLE_CAPITALIZED); // Note: EditorPropertyNameProcessor is not available when doctool is used, but this value is not part of docs.460}461tablet_hints += vformat(",%s:%d", drv_name, i);462}463EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/tablet_driver", -1, tablet_hints);464#else465EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/tablet_driver", -1, "Default:-1");466#endif467468String project_manager_screen_hints = "Screen With Mouse Pointer:-4,Screen With Keyboard Focus:-3,Primary Screen:-2";469for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {470project_manager_screen_hints += ",Screen " + itos(i + 1) + ":" + itos(i);471}472EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/project_manager_screen", EditorSettings::InitialScreen::INITIAL_SCREEN_PRIMARY, project_manager_screen_hints)473474{475EngineUpdateLabel::UpdateMode default_update_mode = EngineUpdateLabel::UpdateMode::NEWEST_UNSTABLE;476if (String(GODOT_VERSION_STATUS) == String("stable")) {477default_update_mode = EngineUpdateLabel::UpdateMode::NEWEST_STABLE;478}479EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "network/connection/check_for_updates", int(default_update_mode), "Disable Update Checks,Check Newest Preview,Check Newest Stable,Check Newest Patch"); // Uses EngineUpdateLabel::UpdateMode.480}481482EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/use_embedded_menu", false, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)483EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/use_native_file_dialogs", false, "", PROPERTY_USAGE_DEFAULT)484EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/expand_to_title", true, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)485486EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/main_font_size", 14, "8,48,1")487EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/code_font_size", 14, "8,48,1")488EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/code_font_contextual_ligatures", 1, "Enabled,Disable Contextual Alternates (Coding Ligatures),Use Custom OpenType Feature Set")489_initial_set("interface/editor/code_font_custom_opentype_features", "");490_initial_set("interface/editor/code_font_custom_variations", "");491EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/font_antialiasing", 1, "None,Grayscale,LCD Subpixel")492#ifdef MACOS_ENABLED493EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/font_hinting", 0, "Auto (None),None,Light,Normal")494#else495EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/font_hinting", 0, "Auto (Light),None,Light,Normal")496#endif497EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/font_subpixel_positioning", 1, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel")498EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/font_disable_embedded_bitmaps", true, "");499EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/font_allow_msdf", true, "")500501EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/editor/main_font", "", "*.ttf,*.otf,*.woff,*.woff2,*.pfb,*.pfm")502EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/editor/main_font_bold", "", "*.ttf,*.otf,*.woff,*.woff2,*.pfb,*.pfm")503EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/editor/code_font", "", "*.ttf,*.otf,*.woff,*.woff2,*.pfb,*.pfm")504_initial_set("interface/editor/separate_distraction_mode", false, true);505_initial_set("interface/editor/automatically_open_screenshots", true, true);506EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/single_window_mode", false, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)507_initial_set("interface/editor/mouse_extra_buttons_navigate_history", true);508_initial_set("interface/editor/save_each_scene_on_quit", true, true); // Regression509EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/save_on_focus_loss", false, "")510EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/accept_dialog_cancel_ok_buttons", 0,511vformat("Auto (%s),Cancel First,OK First", DisplayServer::get_singleton()->get_swap_cancel_ok() ? "OK First" : "Cancel First"),512PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);513#ifdef DEV_ENABLED514EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/show_internal_errors_in_toast_notifications", 0, "Auto (Enabled),Enabled,Disabled")515EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/show_update_spinner", 0, "Auto (Enabled),Enabled,Disabled")516#else517EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/show_internal_errors_in_toast_notifications", 0, "Auto (Disabled),Enabled,Disabled")518EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/show_update_spinner", 0, "Auto (Disabled),Enabled,Disabled")519#endif520521_initial_set("interface/editor/keep_screen_on", false, true);522EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/low_processor_mode_sleep_usec", 6900, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)523// Default unfocused usec sleep is for 10 FPS. Allow an unfocused FPS limit524// as low as 1 FPS for those who really need low power usage (but don't need525// to preview particles or shaders while the editor is unfocused). With very526// low FPS limits, the editor can take a small while to become usable after527// being focused again, so this should be used at the user's discretion.528EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/unfocused_low_processor_mode_sleep_usec", 100000, "1,1000000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)529530EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/import_resources_when_unfocused", false, "")531532EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/vsync_mode", 1, "Disabled,Enabled,Adaptive,Mailbox")533EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/update_continuously", false, "")534535bool is_android_editor = false;536#ifdef ANDROID_ENABLED537if (!OS::get_singleton()->has_feature("xr_editor")) {538is_android_editor = true;539}540#endif541EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/editor/collapse_main_menu", is_android_editor, "")542543_initial_set("interface/editors/show_scene_tree_root_selection", true);544_initial_set("interface/editors/derive_script_globals_by_name", true);545_initial_set("docks/scene_tree/ask_before_revoking_unique_name", true);546547// Inspector548EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "interface/inspector/max_array_dictionary_items_per_page", 20, "10,100,1")549EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/show_low_level_opentype_features", false, "")550EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/inspector/float_drag_speed", 5.0, "0.1,100,0.01")551EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/inspector/nested_color_mode", 0, "Containers & Resources,Resources,External Resources")552EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/delimitate_all_container_and_resources", true, "")553EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/inspector/default_property_name_style", EditorPropertyNameProcessor::STYLE_CAPITALIZED, "Raw (e.g. \"z_index\"),Capitalized (e.g. \"Z Index\"),Localized (e.g. \"Z Index\")", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);554// The lowest value is equal to the minimum float step for 32-bit floats.555// The step must be set manually, as changing this setting should not change the step here.556EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/inspector/default_float_step", 0.001, "0.0000001,1,0.0000001", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING);557EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/disable_folding", false, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);558EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/auto_unfold_foreign_scenes", true, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)559EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/horizontal_vector2_editing", false, "")560EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/horizontal_vector_types_editing", true, "")561EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/open_resources_in_current_inspector", true, "")562563PackedStringArray open_in_new_inspector_defaults;564// Required for the script editor to work.565open_in_new_inspector_defaults.push_back("Script");566// Required for the GridMap editor to work.567open_in_new_inspector_defaults.push_back("MeshLibrary");568_initial_set("interface/inspector/resources_to_open_in_new_inspector", open_in_new_inspector_defaults);569570EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/accessibility/accessibility_support", 0, "Auto (When Screen Reader is Running),Always Active,Disabled")571set_restart_if_changed("interface/accessibility/accessibility_support", true);572573EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/inspector/default_color_picker_mode", (int32_t)ColorPicker::MODE_RGB, "RGB,HSV,RAW,OKHSL")574EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/inspector/default_color_picker_shape", (int32_t)ColorPicker::SHAPE_OKHSL_CIRCLE, "HSV Rectangle,HSV Rectangle Wheel,VHS Circle,OKHSL Circle,OK HS Rectangle:5,OK HL Rectangle") // `SHAPE_NONE` is 4.575EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/color_picker_show_intensity", true, "");576577// Theme578EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_ENUM, "interface/theme/follow_system_theme", false, "")579EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_ENUM, "interface/theme/preset", "Default", "Default,Breeze Dark,Godot 2,Gray,Light,Solarized (Dark),Solarized (Light),Black (OLED),Custom")580EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_ENUM, "interface/theme/spacing_preset", "Default", "Compact,Default,Spacious,Custom")581EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/theme/icon_and_font_color", 0, "Auto,Dark,Light")582EDITOR_SETTING_BASIC(Variant::COLOR, PROPERTY_HINT_NONE, "interface/theme/base_color", Color(0.2, 0.23, 0.31), "")583EDITOR_SETTING_BASIC(Variant::COLOR, PROPERTY_HINT_NONE, "interface/theme/accent_color", Color(0.41, 0.61, 0.91), "")584EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/theme/use_system_accent_color", false, "")585EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/theme/contrast", 0.3, "-1,1,0.01")586EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/theme/draw_extra_borders", false, "")587EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/theme/icon_saturation", 1.0, "0,2,0.01")588EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/theme/relationship_line_opacity", 0.1, "0.00,1,0.01")589EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/theme/border_size", 0, "0,2,1")590EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/theme/corner_radius", 3, "0,6,1")591EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/theme/base_spacing", 4, "0,8,1")592EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/theme/additional_spacing", 0, "0,8,1")593EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/theme/custom_theme", "", "*.res,*.tres,*.theme", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)594595// Touchscreen596bool has_touchscreen_ui = DisplayServer::get_singleton()->is_touchscreen_available();597bool is_native_touchscreen = has_touchscreen_ui && !OS::get_singleton()->has_feature("xr_editor"); // Disable some touchscreen settings by default for the XR Editor.598599EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/touchscreen/enable_touch_optimizations", is_native_touchscreen, "")600set_restart_if_changed("interface/touchscreen/enable_touch_optimizations", true);601EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/touchscreen/enable_long_press_as_right_click", is_native_touchscreen, "")602set_restart_if_changed("interface/touchscreen/enable_long_press_as_right_click", true);603604EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/touchscreen/enable_pan_and_scale_gestures", has_touchscreen_ui, "")605set_restart_if_changed("interface/touchscreen/enable_pan_and_scale_gestures", true);606EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/touchscreen/scale_gizmo_handles", has_touchscreen_ui ? 2 : 1, "1,5,1")607set_restart_if_changed("interface/touchscreen/scale_gizmo_handles", true);608609// Only available in the Android/XR editor.610String touch_actions_panel_hints = "Disabled:0,Embedded Panel:1,Floating Panel:2";611EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/touchscreen/touch_actions_panel", 1, touch_actions_panel_hints)612613// Scene tabs614EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/scene_tabs/display_close_button", 1, "Never,If Tab Active,Always"); // TabBar::CloseButtonDisplayPolicy615_initial_set("interface/scene_tabs/show_thumbnail_on_hover", true);616EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "interface/scene_tabs/maximum_width", 350, "0,9999,1", PROPERTY_USAGE_DEFAULT)617_initial_set("interface/scene_tabs/show_script_button", false, true);618_initial_set("interface/scene_tabs/restore_scenes_on_load", true, true);619620// Multi Window621EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/multi_window/enable", true, "");622EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/multi_window/restore_windows_on_load", true, "");623EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "interface/multi_window/maximize_window", false, "");624set_restart_if_changed("interface/multi_window/enable", true);625626/* Filesystem */627628// External Programs629EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/external_programs/raster_image_editor", "", "")630EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/external_programs/vector_image_editor", "", "")631EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/external_programs/audio_editor", "", "")632EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/external_programs/3d_model_editor", "", "")633EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/external_programs/terminal_emulator", "", "")634EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_PLACEHOLDER_TEXT, "filesystem/external_programs/terminal_emulator_flags", "", "Call flags with placeholder: {directory}.");635636// Directories637EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_DIR, "filesystem/directories/autoscan_project_path", "", "")638const String fs_dir_default_project_path = OS::get_singleton()->has_environment("HOME") ? OS::get_singleton()->get_environment("HOME") : OS::get_singleton()->get_system_dir(OS::SYSTEM_DIR_DOCUMENTS);639EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_GLOBAL_DIR, "filesystem/directories/default_project_path", fs_dir_default_project_path, "")640641// On save642_initial_set("filesystem/on_save/compress_binary_resources", true);643_initial_set("filesystem/on_save/safe_save_on_backup_then_rename", true);644645// EditorFileServer646_initial_set("filesystem/file_server/port", 6010);647_initial_set("filesystem/file_server/password", "");648649// File dialog650_initial_set("filesystem/file_dialog/show_hidden_files", false);651EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "filesystem/file_dialog/display_mode", 0, "Thumbnails,List")652EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "filesystem/file_dialog/thumbnail_size", 64, "32,128,16")653654// Quick Open dialog655EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "filesystem/quick_open_dialog/max_results", 100, "0,10000,1", PROPERTY_USAGE_DEFAULT)656_initial_set("filesystem/quick_open_dialog/show_search_highlight", true);657_initial_set("filesystem/quick_open_dialog/enable_fuzzy_matching", true);658EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "filesystem/quick_open_dialog/max_fuzzy_misses", 2, "0,10,1", PROPERTY_USAGE_DEFAULT)659_initial_set("filesystem/quick_open_dialog/include_addons", false);660EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "filesystem/quick_open_dialog/default_display_mode", 0, "Adaptive,Last Used")661662// Import (for glft module)663EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/import/blender/blender_path", "", "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)664EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "filesystem/import/blender/rpc_port", 6011, "0,65535,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)665EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "filesystem/import/blender/rpc_server_uptime", 5, "0,300,1,or_greater,suffix:s", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)666EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/import/fbx/fbx2gltf_path", "", "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)667668// Tools (denoise)669EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_DIR, "filesystem/tools/oidn/oidn_denoise_path", "", "", PROPERTY_USAGE_DEFAULT)670671/* Docks */672673// SceneTree674_initial_set("docks/scene_tree/ask_before_deleting_related_animation_tracks", true);675_initial_set("docks/scene_tree/start_create_dialog_fully_expanded", false);676_initial_set("docks/scene_tree/auto_expand_to_selected", true);677_initial_set("docks/scene_tree/center_node_on_reparent", false);678_initial_set("docks/scene_tree/hide_filtered_out_parents", true);679_initial_set("docks/scene_tree/accessibility_warnings", false);680681// FileSystem682EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "docks/filesystem/thumbnail_size", 64, "32,128,16")683_initial_set("docks/filesystem/always_show_folders", true);684_initial_set("docks/filesystem/textfile_extensions", "txt,md,cfg,ini,log,json,yml,yaml,toml,xml");685_initial_set("docks/filesystem/other_file_extensions", "ico,icns");686687// Property editor688EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "docks/property_editor/auto_refresh_interval", 0.2, "0.01,1,0.001"); // Update 5 times per second by default.689EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "docks/property_editor/subresource_hue_tint", 0.75, "0,1,0.01")690691/* Text editor */692693// Theme694EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_ENUM, "text_editor/theme/color_theme", "Default", "Default,Godot 2,Custom")695696// Theme: Highlighting697const LocalVector<StringName> basic_text_editor_settings = {698"text_editor/theme/highlighting/symbol_color",699"text_editor/theme/highlighting/keyword_color",700"text_editor/theme/highlighting/control_flow_keyword_color",701"text_editor/theme/highlighting/base_type_color",702"text_editor/theme/highlighting/engine_type_color",703"text_editor/theme/highlighting/user_type_color",704"text_editor/theme/highlighting/comment_color",705"text_editor/theme/highlighting/doc_comment_color",706"text_editor/theme/highlighting/string_color",707"text_editor/theme/highlighting/background_color",708"text_editor/theme/highlighting/text_color",709"text_editor/theme/highlighting/line_number_color",710"text_editor/theme/highlighting/safe_line_number_color",711"text_editor/theme/highlighting/caret_color",712"text_editor/theme/highlighting/caret_background_color",713"text_editor/theme/highlighting/text_selected_color",714"text_editor/theme/highlighting/selection_color",715"text_editor/theme/highlighting/brace_mismatch_color",716"text_editor/theme/highlighting/current_line_color",717"text_editor/theme/highlighting/line_length_guideline_color",718"text_editor/theme/highlighting/word_highlighted_color",719"text_editor/theme/highlighting/number_color",720"text_editor/theme/highlighting/function_color",721"text_editor/theme/highlighting/member_variable_color",722"text_editor/theme/highlighting/mark_color",723};724// These values will be overwritten by EditorThemeManager, but can still be seen in some edge cases.725const HashMap<StringName, Color> text_colors = get_godot2_text_editor_theme();726for (const KeyValue<StringName, Color> &text_color : text_colors) {727if (basic_text_editor_settings.has(text_color.key)) {728EDITOR_SETTING_BASIC(Variant::COLOR, PROPERTY_HINT_NONE, text_color.key, text_color.value, "")729} else {730EDITOR_SETTING(Variant::COLOR, PROPERTY_HINT_NONE, text_color.key, text_color.value, "")731}732}733734// The list is based on <https://github.com/KDE/syntax-highlighting/blob/master/data/syntax/alert.xml>.735_initial_set("text_editor/theme/highlighting/comment_markers/critical_list", "ALERT,ATTENTION,CAUTION,CRITICAL,DANGER,SECURITY");736_initial_set("text_editor/theme/highlighting/comment_markers/warning_list", "BUG,DEPRECATED,FIXME,HACK,TASK,TBD,TODO,WARNING");737_initial_set("text_editor/theme/highlighting/comment_markers/notice_list", "INFO,NOTE,NOTICE,TEST,TESTING");738739// Appearance740EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "text_editor/appearance/enable_inline_color_picker", true, "");741742// Appearance: Caret743EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/appearance/caret/type", 0, "Line,Block")744_initial_set("text_editor/appearance/caret/caret_blink", true, true);745EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "text_editor/appearance/caret/caret_blink_interval", 0.5, "0.1,10,0.01")746_initial_set("text_editor/appearance/caret/highlight_current_line", true, true);747_initial_set("text_editor/appearance/caret/highlight_all_occurrences", true, true);748749// Appearance: Guidelines750_initial_set("text_editor/appearance/guidelines/show_line_length_guidelines", true, true);751EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/guidelines/line_length_guideline_soft_column", 80, "20,160,1")752EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/guidelines/line_length_guideline_hard_column", 100, "20,160,1")753754// Appearance: Gutters755_initial_set("text_editor/appearance/gutters/show_line_numbers", true, true);756_initial_set("text_editor/appearance/gutters/line_numbers_zero_padded", false, true);757_initial_set("text_editor/appearance/gutters/highlight_type_safe_lines", true, true);758_initial_set("text_editor/appearance/gutters/show_info_gutter", true, true);759760// Appearance: Minimap761_initial_set("text_editor/appearance/minimap/show_minimap", true, true);762EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/minimap/minimap_width", 80, "50,250,1")763764// Appearance: Lines765_initial_set("text_editor/appearance/lines/code_folding", true, true);766EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/appearance/lines/word_wrap", 0, "None,Boundary")767EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/appearance/lines/autowrap_mode", 3, "Arbitrary:1,Word:2,Word (Smart):3")768769// Appearance: Whitespace770_initial_set("text_editor/appearance/whitespace/draw_tabs", true, true);771_initial_set("text_editor/appearance/whitespace/draw_spaces", false, true);772EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/whitespace/line_spacing", 4, "0,50,1")773774// Behavior775// Behavior: General776_initial_set("text_editor/behavior/general/empty_selection_clipboard", true);777778// Behavior: Navigation779_initial_set("text_editor/behavior/navigation/move_caret_on_right_click", true, true);780_initial_set("text_editor/behavior/navigation/scroll_past_end_of_file", false, true);781_initial_set("text_editor/behavior/navigation/smooth_scrolling", true, true);782EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/behavior/navigation/v_scroll_speed", 80, "1,10000,1")783_initial_set("text_editor/behavior/navigation/drag_and_drop_selection", true, true);784_initial_set("text_editor/behavior/navigation/stay_in_script_editor_on_node_selected", true, true);785_initial_set("text_editor/behavior/navigation/open_script_when_connecting_signal_to_existing_method", true, true);786_initial_set("text_editor/behavior/navigation/use_default_word_separators", true); // Includes ´`~$^=+|<> General punctuation and CJK punctuation.787_initial_set("text_editor/behavior/navigation/use_custom_word_separators", false);788_initial_set("text_editor/behavior/navigation/custom_word_separators", ""); // Custom word separators.789790// Behavior: Indent791EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/behavior/indent/type", 0, "Tabs,Spaces")792EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/behavior/indent/size", 4, "1,64,1") // size of 0 crashes.793_initial_set("text_editor/behavior/indent/auto_indent", true);794_initial_set("text_editor/behavior/indent/indent_wrapped_lines", true);795796// Behavior: Files797_initial_set("text_editor/behavior/files/trim_trailing_whitespace_on_save", false);798_initial_set("text_editor/behavior/files/trim_final_newlines_on_save", true);799_initial_set("text_editor/behavior/files/autosave_interval_secs", 0);800_initial_set("text_editor/behavior/files/restore_scripts_on_load", true);801_initial_set("text_editor/behavior/files/convert_indent_on_save", true);802_initial_set("text_editor/behavior/files/auto_reload_scripts_on_external_change", true);803_initial_set("text_editor/behavior/files/auto_reload_and_parse_scripts_on_save", true);804_initial_set("text_editor/behavior/files/open_dominant_script_on_scene_change", false, true);805_initial_set("text_editor/behavior/files/drop_preload_resources_as_uid", true, true);806807// Behavior: Documentation808_initial_set("text_editor/behavior/documentation/enable_tooltips", true, true);809810// Script list811_initial_set("text_editor/script_list/show_members_overview", true, true);812_initial_set("text_editor/script_list/sort_members_outline_alphabetically", false, true);813_initial_set("text_editor/script_list/script_temperature_enabled", true);814_initial_set("text_editor/script_list/script_temperature_history_size", 15);815_initial_set("text_editor/script_list/highlight_scene_scripts", true);816_initial_set("text_editor/script_list/group_help_pages", true);817EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/script_list/sort_scripts_by", 0, "Name,Path,None");818EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/script_list/list_script_names_as", 0, "Name,Parent Directory And Name,Full Path");819EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "text_editor/external/exec_path", "", "");820EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_PLACEHOLDER_TEXT, "text_editor/external/exec_flags", "{file}", "Call flags with placeholders: {project}, {file}, {col}, {line}.");821822// Completion823EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "text_editor/completion/idle_parse_delay", 1.5, "0.1,10,0.01")824EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "text_editor/completion/idle_parse_delay_with_errors_found", 0.5, "0.1,5,0.01")825_initial_set("text_editor/completion/auto_brace_complete", true, true);826_initial_set("text_editor/completion/code_complete_enabled", true, true);827EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "text_editor/completion/code_complete_delay", 0.3, "0.01,5,0.01,or_greater")828_initial_set("text_editor/completion/put_callhint_tooltip_below_current_line", true);829_initial_set("text_editor/completion/complete_file_paths", true);830_initial_set("text_editor/completion/add_type_hints", true, true);831_initial_set("text_editor/completion/add_string_name_literals", false, true);832_initial_set("text_editor/completion/add_node_path_literals", false, true);833_initial_set("text_editor/completion/use_single_quotes", false, true);834_initial_set("text_editor/completion/colorize_suggestions", true);835836// External editor (ScriptEditorPlugin)837_initial_set("text_editor/external/use_external_editor", false, true);838_initial_set("text_editor/external/exec_path", "");839840// Help841_initial_set("text_editor/help/show_help_index", true);842EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_font_size", 16, "8,48,1")843EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_source_font_size", 15, "8,48,1")844EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_title_font_size", 23, "8,64,1")845EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/help/class_reference_examples", 0, "GDScript,C#,GDScript and C#")846_initial_set("text_editor/help/sort_functions_alphabetically", true);847848/* Editors */849850// GridMap851// GridMapEditor852EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/grid_map/pick_distance", 5000.0, "1,8192,0.1,or_greater");853EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "editors/grid_map/palette_min_width", 230, "100,500,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);854EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "editors/grid_map/preview_size", 64, "16,128,1")855856// 3D857EDITOR_SETTING_BASIC(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/primary_grid_color", Color(0.56, 0.56, 0.56, 0.5), "")858EDITOR_SETTING_BASIC(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/secondary_grid_color", Color(0.38, 0.38, 0.38, 0.5), "")859860// Use a similar color to the 2D editor selection.861EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/selection_box_color", Color(1.0, 0.5, 0), "", PROPERTY_USAGE_DEFAULT)862EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d/active_selection_box_color", Color(1.5, 0.75, 0, 1.0), "", PROPERTY_USAGE_DEFAULT)863EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/instantiated", Color(0.7, 0.7, 0.7, 0.6), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)864EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)865EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/aabb", Color(0.28, 0.8, 0.82), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)866EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/stream_player_3d", Color(0.4, 0.8, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)867EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/camera", Color(0.8, 0.4, 0.8), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)868EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/decal", Color(0.6, 0.5, 1.0), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)869EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/fog_volume", Color(0.5, 0.7, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)870EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/particles", Color(0.8, 0.7, 0.4), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)871EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/particle_attractor", Color(1, 0.7, 0.5), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)872EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/particle_collision", Color(0.5, 0.7, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)873EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/joint_body_a", Color(0.6, 0.8, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)874EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/joint_body_b", Color(0.6, 0.9, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)875EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/lightmap_lines", Color(0.5, 0.6, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)876EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/lightprobe_lines", Color(0.5, 0.6, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)877EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/occluder", Color(0.8, 0.5, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)878EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/reflection_probe", Color(0.6, 1, 0.5), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)879EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/visibility_notifier", Color(0.8, 0.5, 0.7), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)880EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/voxel_gi", Color(0.5, 1, 0.6), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)881EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/path_tilt", Color(1.0, 1.0, 0.4, 0.9), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)882EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/skeleton", Color(1, 0.8, 0.4), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)883EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/selected_bone", Color(0.8, 0.3, 0.0), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)884EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/csg", Color(0.0, 0.4, 1, 0.15), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)885EDITOR_SETTING(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/gridmap_grid", Color(0.8, 0.5, 0.1), "")886EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/spring_bone_joint", Color(0.8, 0.9, 0.6), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)887EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/spring_bone_collision", Color(0.6, 0.8, 0.9), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)888EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/spring_bone_inside_collision", Color(0.9, 0.6, 0.8), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)889_initial_set("editors/3d_gizmos/gizmo_settings/bone_axis_length", (float)0.1);890EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d_gizmos/gizmo_settings/bone_shape", 1, "Wire,Octahedron");891EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_settings/path3d_tilt_disk_size", 0.8, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)892EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d_gizmos/gizmo_settings/lightmap_gi_probe_size", 0.4, "0.0,1.0,0.001,or_greater", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)893894// If a line is a multiple of this, it uses the primary grid color.895// Use a power of 2 value by default as it's more common to use powers of 2 in level design.896EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "editors/3d/primary_grid_steps", 8, "1,100,1")897EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "editors/3d/grid_size", 200, "1,2000,1")898// Higher values produce graphical artifacts when far away unless View Z-Far899// is increased significantly more than it really should need to be.900EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/3d/grid_division_level_max", 2, "-1,3,1")901// Lower values produce graphical artifacts regardless of view clipping planes, so limit to -2 as a lower bound.902EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/3d/grid_division_level_min", 0, "-2,2,1")903// -0.2 seems like a sensible default. -1.0 gives Blender-like behavior, 0.5 gives huge grids.904EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/grid_division_level_bias", -0.2, "-1.0,0.5,0.1")905906_initial_set("editors/3d/grid_xz_plane", true);907_initial_set("editors/3d/grid_xy_plane", false);908_initial_set("editors/3d/grid_yz_plane", false);909910// Use a lower default FOV for the 3D camera compared to the911// Camera3D node as the 3D viewport doesn't span the whole screen.912// This means it's technically viewed from a further distance, which warrants a narrower FOV.913EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/default_fov", 70.0, "1,179,0.1,degrees")914EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/default_z_near", 0.05, "0.01,10,0.01,or_greater,suffix:m")915EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/default_z_far", 4000.0, "0.1,4000,0.1,or_greater,suffix:m")916917// 3D: Navigation918_initial_set("editors/3d/navigation/invert_x_axis", false, true);919_initial_set("editors/3d/navigation/invert_y_axis", false, true);920EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/navigation/navigation_scheme", 0, "Godot:0,Maya:1,Modo:2,Tablet/Trackpad:4,Custom:3")921EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/navigation/orbit_mouse_button", 1, "Left Mouse,Middle Mouse,Right Mouse,Mouse Button 4,Mouse Button 5")922EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/navigation/pan_mouse_button", 1, "Left Mouse,Middle Mouse,Right Mouse,Mouse Button 4,Mouse Button 5")923EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/navigation/zoom_mouse_button", 1, "Left Mouse,Middle Mouse,Right Mouse,Mouse Button 4,Mouse Button 5")924EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/navigation/zoom_style", 0, "Vertical,Horizontal")925926_initial_set("editors/3d/navigation/emulate_numpad", true, true);927_initial_set("editors/3d/navigation/emulate_3_button_mouse", false, true);928_initial_set("editors/3d/navigation/warped_mouse_panning", true, true);929930// 3D: Navigation feel931EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/orbit_sensitivity", 0.25, "0.01,20,0.001")932EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/translation_sensitivity", 1.0, "0.01,20,0.001")933EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/orbit_inertia", 0.0, "0,1,0.001")934EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/translation_inertia", 0.05, "0,1,0.001")935EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/zoom_inertia", 0.05, "0,1,0.001")936_initial_set("editors/3d/navigation/show_viewport_rotation_gizmo", true);937_initial_set("editors/3d/navigation/show_viewport_navigation_gizmo", DisplayServer::get_singleton()->is_touchscreen_available());938939// 3D: Freelook940EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/freelook/freelook_navigation_scheme", 0, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)")941EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_sensitivity", 0.25, "0.01,2,0.001")942EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_inertia", 0.0, "0,1,0.001")943EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_base_speed", 5.0, "0,10,0.01,or_greater")944EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/freelook/freelook_activation_modifier", 0, "None,Shift,Alt,Meta,Ctrl")945_initial_set("editors/3d/freelook/freelook_speed_zoom_link", false);946947// 3D: Manipulator948EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/3d/manipulator_gizmo_size", 80, "16,160,1");949EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/manipulator_gizmo_opacity", 0.9, "0,1,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)950951// 2D952_initial_set("editors/2d/grid_color", Color(1.0, 1.0, 1.0, 0.07), true);953_initial_set("editors/2d/guides_color", Color(0.6, 0.0, 0.8), true);954_initial_set("editors/2d/smart_snapping_line_color", Color(0.9, 0.1, 0.1), true);955EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/2d/bone_width", 5.0, "0.01,20,0.01,or_greater")956_initial_set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.7));957_initial_set("editors/2d/bone_color2", Color(0.6, 0.6, 0.6, 0.7));958_initial_set("editors/2d/bone_selected_color", Color(0.9, 0.45, 0.45, 0.7));959_initial_set("editors/2d/bone_ik_color", Color(0.9, 0.9, 0.45, 0.7));960_initial_set("editors/2d/bone_outline_color", Color(0.35, 0.35, 0.35, 0.5));961EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/2d/bone_outline_size", 2.0, "0.01,8,0.01,or_greater")962_initial_set("editors/2d/viewport_border_color", Color(0.4, 0.4, 1.0, 0.4), true);963_initial_set("editors/2d/use_integer_zoom_by_default", false, true);964EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/2d/zoom_speed_factor", 1.1, "1.01,2,0.01")965EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/2d/ruler_width", 16.0, "12.0,30.0,1.0")966967// Bone mapper (BoneMapEditorPlugin)968_initial_set("editors/bone_mapper/handle_colors/unset", Color(0.3, 0.3, 0.3));969_initial_set("editors/bone_mapper/handle_colors/set", Color(0.1, 0.6, 0.25));970_initial_set("editors/bone_mapper/handle_colors/missing", Color(0.8, 0.2, 0.8));971_initial_set("editors/bone_mapper/handle_colors/error", Color(0.8, 0.2, 0.2));972973// Panning974// Enum should be in sync with ControlScheme in ViewPanner.975EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/panning/2d_editor_panning_scheme", 0, "Scroll Zooms,Scroll Pans");976EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/panning/sub_editors_panning_scheme", 0, "Scroll Zooms,Scroll Pans");977EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/panning/animation_editors_panning_scheme", 1, "Scroll Zooms,Scroll Pans");978_initial_set("editors/panning/simple_panning", false);979_initial_set("editors/panning/warped_mouse_panning", true);980_initial_set("editors/panning/2d_editor_pan_speed", 20, true);981EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "editors/panning/zoom_style", 0, "Vertical,Horizontal");982983// Tiles editor984_initial_set("editors/tiles_editor/display_grid", true);985_initial_set("editors/tiles_editor/highlight_selected_layer", true);986_initial_set("editors/tiles_editor/grid_color", Color(1.0, 0.5, 0.2, 0.5));987988// Polygon editor989_initial_set("editors/polygon_editor/point_grab_radius", has_touchscreen_ui ? 32 : 8);990_initial_set("editors/polygon_editor/show_previous_outline", true);991EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/polygon_editor/auto_bake_delay", 1.5, "-1.0,10.0,0.01");992993// Animation994EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/animation/default_animation_step", Animation::DEFAULT_STEP, "0.0,10.0,0.00000001");995EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/animation/default_fps_mode", 0, "Seconds,FPS");996_initial_set("editors/animation/default_fps_compatibility", true);997_initial_set("editors/animation/autorename_animation_tracks", true);998_initial_set("editors/animation/confirm_insert_track", true, true);999_initial_set("editors/animation/default_create_bezier_tracks", false, true);1000_initial_set("editors/animation/default_create_reset_tracks", true, true);1001_initial_set("editors/animation/onion_layers_past_color", Color(1, 0, 0));1002_initial_set("editors/animation/onion_layers_future_color", Color(0, 1, 0));10031004// Shader editor1005_initial_set("editors/shader_editor/behavior/files/restore_shaders_on_load", true, true);10061007// Visual editors1008EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_ENUM, "editors/visual_editors/color_theme", "Default", "Default,Legacy,Custom")10091010_load_default_visual_shader_editor_theme();10111012EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/visual_editors/minimap_opacity", 0.85, "0.0,1.0,0.01")1013EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/visual_editors/lines_curvature", 0.5, "0.0,1.0,0.01")1014EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/visual_editors/grid_pattern", 1, "Lines,Dots")1015EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/visual_editors/visual_shader/port_preview_size", 160, "100,400,0.01")10161017// Export (EditorExportPlugin)1018_initial_set("export/ssh/ssh", "");1019_initial_set("export/ssh/scp", "");10201021/* Run */10221023// Window placement1024#ifndef ANDROID_ENABLED1025EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/rect", 1, "Top Left,Centered,Custom Position,Force Maximized,Force Fullscreen")1026// Keep the enum values in sync with the `DisplayServer::SCREEN_` enum.1027String screen_hints = "Same as Editor:-5,Previous Screen:-4,Next Screen:-3,Primary Screen:-2"; // Note: Main Window Screen:-1 is not used for the main window.1028for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {1029screen_hints += ",Screen " + itos(i + 1) + ":" + itos(i);1030}1031_initial_set("run/window_placement/rect_custom_position", Vector2());1032EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/screen", -5, screen_hints)1033#endif1034// Should match the ANDROID_WINDOW_* constants in 'platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt'.1035String android_window_hints = "Auto (based on screen size):0,Same as Editor:1,Side-by-side with Editor:2";1036EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/android_window", 0, android_window_hints)10371038String game_embed_mode_hints = "Disabled:-1,Use Per-Project Configuration:0,Embed Game:1,Make Game Workspace Floating:2";1039#ifdef ANDROID_ENABLED1040if (OS::get_singleton()->has_feature("xr_editor")) {1041game_embed_mode_hints = "Disabled:-1";1042} else {1043game_embed_mode_hints = "Disabled:-1,Auto (based on screen size):0,Enabled:1";1044}1045#endif1046int default_game_embed_mode = OS::get_singleton()->has_feature("xr_editor") ? -1 : 0;1047EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/game_embed_mode", default_game_embed_mode, game_embed_mode_hints);10481049// Auto save1050_initial_set("run/auto_save/save_before_running", true, true);10511052// Bottom panel1053EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/bottom_panel/action_on_play", EditorNode::ACTION_ON_PLAY_OPEN_OUTPUT, "Do Nothing,Open Output,Open Debugger")1054EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/bottom_panel/action_on_stop", EditorNode::ACTION_ON_STOP_DO_NOTHING, "Do Nothing,Close Bottom Panel")10551056// Output1057EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "run/output/font_size", 13, "8,48,1")1058_initial_set("run/output/always_clear_output_on_play", true, true);10591060EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "run/output/max_lines", 10000, "100,100000,1")10611062// Platform1063_initial_set("run/platforms/linuxbsd/prefer_wayland", false, true);1064set_restart_if_changed("run/platforms/linuxbsd/prefer_wayland", true);10651066/* Network */10671068// General1069EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "network/connection/network_mode", 0, "Offline,Online");10701071// HTTP Proxy1072_initial_set("network/http_proxy/host", "");1073EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "network/http_proxy/port", 8080, "1,65535,1")10741075// SSL1076EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "network/tls/editor_tls_certificates", _SYSTEM_CERTS_PATH, "*.crt,*.pem", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);1077EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "network/tls/enable_tls_v1.3", true, "")10781079// Debug1080_initial_set("network/debug/remote_host", "127.0.0.1"); // Hints provided in setup_network1081EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "network/debug/remote_port", 6007, "1,65535,1")10821083/* Debugger/profiler */10841085EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "debugger/auto_switch_to_remote_scene_tree", false, "")1086EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "debugger/auto_switch_to_stack_trace", true, "")1087EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "debugger/max_node_selection", 20, "1,100,1")1088EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "debugger/profiler_frame_history_size", 3600, "60,10000,1")1089EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "debugger/profiler_frame_max_functions", 64, "16,512,1")1090EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "debugger/profiler_target_fps", 60, "1,1000,1")1091EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "debugger/remote_scene_tree_refresh_interval", 1.0, "0.1,10,0.01,or_greater")1092EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "debugger/remote_inspect_refresh_interval", 0.2, "0.02,10,0.01,or_greater")1093EDITOR_SETTING_BASIC(Variant::BOOL, PROPERTY_HINT_NONE, "debugger/profile_native_calls", false, "")10941095// Version control (VersionControlEditorPlugin)1096_initial_set("version_control/username", "", true);1097_initial_set("version_control/ssh_public_key_path", "");1098_initial_set("version_control/ssh_private_key_path", "");10991100/* Extra config */11011102EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "input/buffering/agile_event_flushing", false, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)1103EDITOR_SETTING_USAGE(Variant::BOOL, PROPERTY_HINT_NONE, "input/buffering/use_accumulated_input", true, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED | PROPERTY_USAGE_EDITOR_BASIC_SETTING)11041105// TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects.1106EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/sorting_order", 0, "Last Edited,Name,Path")1107EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/directory_naming_convention", 1, "No convention,kebab-case,snake_case,camelCase,PascalCase,Title Case")11081109#if defined(WEB_ENABLED)1110// Web platform only supports `gl_compatibility`.1111const String default_renderer = "gl_compatibility";1112#elif defined(ANDROID_ENABLED)1113// Use more suitable rendering method by default.1114const String default_renderer = "mobile";1115#else1116const String default_renderer = "forward_plus";1117#endif1118EDITOR_SETTING_BASIC(Variant::STRING, PROPERTY_HINT_ENUM, "project_manager/default_renderer", default_renderer, "forward_plus,mobile,gl_compatibility")11191120#undef EDITOR_SETTING1121#undef EDITOR_SETTING_BASIC1122#undef EDITOR_SETTING_USAGE11231124if (p_extra_config.is_valid()) {1125if (p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) {1126Vector<String> list = p_extra_config->get_value("init_projects", "list");1127for (int i = 0; i < list.size(); i++) {1128String proj_name = list[i].replace("/", "::");1129set("projects/" + proj_name, list[i]);1130}1131}11321133if (p_extra_config->has_section("presets")) {1134Vector<String> keys = p_extra_config->get_section_keys("presets");11351136for (const String &key : keys) {1137Variant val = p_extra_config->get_value("presets", key);1138set(key, val);1139}1140}1141}1142}11431144void EditorSettings::_load_default_visual_shader_editor_theme() {1145// Connection type colors1146_initial_set("editors/visual_editors/connection_colors/scalar_color", Color(0.55, 0.55, 0.55));1147_initial_set("editors/visual_editors/connection_colors/vector2_color", Color(0.44, 0.43, 0.64));1148_initial_set("editors/visual_editors/connection_colors/vector3_color", Color(0.337, 0.314, 0.71));1149_initial_set("editors/visual_editors/connection_colors/vector4_color", Color(0.7, 0.65, 0.147));1150_initial_set("editors/visual_editors/connection_colors/boolean_color", Color(0.243, 0.612, 0.349));1151_initial_set("editors/visual_editors/connection_colors/transform_color", Color(0.71, 0.357, 0.64));1152_initial_set("editors/visual_editors/connection_colors/sampler_color", Color(0.659, 0.4, 0.137));11531154// Node category colors (used for the node headers)1155_initial_set("editors/visual_editors/category_colors/output_color", Color(0.26, 0.10, 0.15));1156_initial_set("editors/visual_editors/category_colors/color_color", Color(0.5, 0.5, 0.1));1157_initial_set("editors/visual_editors/category_colors/conditional_color", Color(0.208, 0.522, 0.298));1158_initial_set("editors/visual_editors/category_colors/input_color", Color(0.502, 0.2, 0.204));1159_initial_set("editors/visual_editors/category_colors/scalar_color", Color(0.1, 0.5, 0.6));1160_initial_set("editors/visual_editors/category_colors/textures_color", Color(0.5, 0.3, 0.1));1161_initial_set("editors/visual_editors/category_colors/transform_color", Color(0.5, 0.3, 0.5));1162_initial_set("editors/visual_editors/category_colors/utility_color", Color(0.2, 0.2, 0.2));1163_initial_set("editors/visual_editors/category_colors/vector_color", Color(0.2, 0.2, 0.5));1164_initial_set("editors/visual_editors/category_colors/special_color", Color(0.098, 0.361, 0.294));1165_initial_set("editors/visual_editors/category_colors/particle_color", Color(0.12, 0.358, 0.8));1166}11671168String EditorSettings::_guess_exec_args_for_extenal_editor(const String &p_path) {1169Ref<RegEx> regex;1170regex.instantiate();11711172const String editor_pattern = R"([\\/]((?:jetbrains\s*)?rider(?:\s*(eap|\d{4}\.\d+|\d{4}\.\d+\s*dev)?)?|visual\s*studio\s*code|subl(ime\s*text)?|sublime_text|(g)?vim|emacs|atom|geany|kate|code|(vs)?codium)(?:\.app|\.exe|\.bat|\.sh)?)";1173regex->compile(editor_pattern);1174Ref<RegExMatch> editor_match = regex->search(p_path.to_lower());11751176if (editor_match.is_null()) {1177return String();1178}11791180const String editor = editor_match->get_string(1).to_lower();1181String new_exec_flags = "{file}";11821183if (editor.begins_with("rider")) {1184new_exec_flags = "{project} --line {line} {file}";1185} else if (editor == "subl" || editor == "sublime text" || editor == "sublime_text") {1186new_exec_flags = "{project} {file}:{line}:{col}";1187} else if (editor == "vim" || editor == "gvim") {1188new_exec_flags = "\"+call cursor({line}, {col})\" {file}";1189} else if (editor == "emacs") {1190new_exec_flags = "emacs +{line}:{col} {file}";1191} else if (editor == "atom") {1192new_exec_flags = "{file}:{line}";1193} else if (editor == "geany" || editor == "kate") {1194new_exec_flags = "{file} --line {line} --column {col}";1195} else if (editor == "code" || editor == "visual studio code" || editor == "codium" || editor == "vscodium") {1196new_exec_flags = "{project} --goto {file}:{line}:{col}";1197}11981199return new_exec_flags;1200}12011202const String EditorSettings::_get_project_metadata_path() const {1203return EditorPaths::get_singleton()->get_project_settings_dir().path_join("project_metadata.cfg");1204}12051206#ifndef DISABLE_DEPRECATED1207void EditorSettings::_remove_deprecated_settings() {1208erase("network/connection/engine_version_update_mode");1209erase("run/output/always_open_output_on_play");1210erase("run/output/always_close_output_on_stop");1211erase("text_editor/theme/line_spacing"); // See GH-106137.1212}1213#endif12141215// PUBLIC METHODS12161217EditorSettings *EditorSettings::get_singleton() {1218return singleton.ptr();1219}12201221String EditorSettings::get_existing_settings_path() {1222const String config_dir = EditorPaths::get_singleton()->get_config_dir();1223int minor = GODOT_VERSION_MINOR;1224String filename;12251226do {1227if (GODOT_VERSION_MAJOR == 4 && minor < 3) {1228// Minor version is used since 4.3, so special case to load older settings.1229filename = vformat("editor_settings-%d.tres", GODOT_VERSION_MAJOR);1230minor = -1;1231} else {1232filename = vformat("editor_settings-%d.%d.tres", GODOT_VERSION_MAJOR, minor);1233minor--;1234}1235} while (minor >= 0 && !FileAccess::exists(config_dir.path_join(filename)));1236return config_dir.path_join(filename);1237}12381239String EditorSettings::get_newest_settings_path() {1240const String config_file_name = vformat("editor_settings-%d.%d.tres", GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR);1241return EditorPaths::get_singleton()->get_config_dir().path_join(config_file_name);1242}12431244void EditorSettings::create() {1245// IMPORTANT: create() *must* create a valid EditorSettings singleton,1246// as the rest of the engine code will assume it. As such, it should never1247// return (incl. via ERR_FAIL) without initializing the singleton member.12481249if (singleton.ptr()) {1250ERR_PRINT("Can't recreate EditorSettings as it already exists.");1251return;1252}12531254String config_file_path;1255Ref<ConfigFile> extra_config = memnew(ConfigFile);12561257if (!EditorPaths::get_singleton()) {1258ERR_PRINT("Bug (please report): EditorPaths haven't been initialized, EditorSettings cannot be created properly.");1259goto fail;1260}12611262if (EditorPaths::get_singleton()->is_self_contained()) {1263Error err = extra_config->load(EditorPaths::get_singleton()->get_self_contained_file());1264if (err != OK) {1265ERR_PRINT("Can't load extra config from path: " + EditorPaths::get_singleton()->get_self_contained_file());1266}1267}12681269if (EditorPaths::get_singleton()->are_paths_valid()) {1270// Validate editor config file.1271ERR_FAIL_COND(!DirAccess::dir_exists_absolute(EditorPaths::get_singleton()->get_config_dir()));12721273config_file_path = get_existing_settings_path();1274if (!FileAccess::exists(config_file_path)) {1275config_file_path = get_newest_settings_path();1276goto fail;1277}12781279singleton = ResourceLoader::load(config_file_path, "EditorSettings");1280if (singleton.is_null()) {1281ERR_PRINT("Could not load editor settings from path: " + config_file_path);1282config_file_path = get_newest_settings_path();1283goto fail;1284}12851286singleton->set_path(get_newest_settings_path()); // Settings can be loaded from older version file, so make sure it's newest.1287singleton->save_changed_setting = true;12881289print_verbose("EditorSettings: Load OK!");12901291singleton->setup_language();1292singleton->setup_network();1293singleton->load_favorites_and_recent_dirs();1294singleton->update_text_editor_themes_list();1295#ifndef DISABLE_DEPRECATED1296singleton->_remove_deprecated_settings();1297#endif12981299return;1300}13011302fail:1303// patch init projects1304String exe_path = OS::get_singleton()->get_executable_path().get_base_dir();13051306if (extra_config->has_section("init_projects")) {1307Vector<String> list = extra_config->get_value("init_projects", "list");1308for (int i = 0; i < list.size(); i++) {1309list.write[i] = exe_path.path_join(list[i]);1310}1311extra_config->set_value("init_projects", "list", list);1312}13131314singleton.instantiate();1315singleton->set_path(config_file_path, true);1316singleton->save_changed_setting = true;1317singleton->_load_defaults(extra_config);1318singleton->setup_language();1319singleton->setup_network();1320singleton->update_text_editor_themes_list();1321}13221323void EditorSettings::setup_language() {1324String lang = _EDITOR_GET("interface/editor/editor_language");13251326if (lang == "en") {1327TranslationServer::get_singleton()->set_locale(lang);1328return; // Default, nothing to do.1329}1330// Load editor translation for configured/detected locale.1331load_editor_translations(lang);1332load_property_translations(lang);13331334// Load class reference translation.1335load_doc_translations(lang);13361337// Load extractable translation for projects.1338load_extractable_translations(lang);13391340TranslationServer::get_singleton()->set_locale(lang);1341}13421343void EditorSettings::setup_network() {1344List<IPAddress> local_ip;1345IP::get_singleton()->get_local_addresses(&local_ip);1346String hint;1347String current = has_setting("network/debug/remote_host") ? get("network/debug/remote_host") : "";1348String selected = "127.0.0.1";13491350// Check that current remote_host is a valid interface address and populate hints.1351for (const IPAddress &ip : local_ip) {1352// link-local IPv6 addresses don't work, skipping them1353if (String(ip).begins_with("fe80:0:0:0:")) { // fe80::/641354continue;1355}1356// Same goes for IPv4 link-local (APIPA) addresses.1357if (String(ip).begins_with("169.254.")) { // 169.254.0.0/161358continue;1359}1360// Select current IP (found)1361if (ip == current) {1362selected = String(ip);1363}1364if (!hint.is_empty()) {1365hint += ",";1366}1367hint += String(ip);1368}13691370// Add hints with valid IP addresses to remote_host property.1371add_property_hint(PropertyInfo(Variant::STRING, "network/debug/remote_host", PROPERTY_HINT_ENUM, hint));1372// Fix potentially invalid remote_host due to network change.1373set("network/debug/remote_host", selected);1374}13751376void EditorSettings::save() {1377//_THREAD_SAFE_METHOD_13781379if (!singleton.ptr()) {1380return;1381}13821383Error err = ResourceSaver::save(singleton);13841385if (err != OK) {1386ERR_PRINT("Error saving editor settings to " + singleton->get_path());1387} else {1388singleton->changed_settings.clear();1389print_verbose("EditorSettings: Save OK!");1390}1391}13921393PackedStringArray EditorSettings::get_changed_settings() const {1394PackedStringArray arr;1395for (const String &setting : changed_settings) {1396arr.push_back(setting);1397}13981399return arr;1400}14011402bool EditorSettings::check_changed_settings_in_group(const String &p_setting_prefix) const {1403for (const String &setting : changed_settings) {1404if (setting.begins_with(p_setting_prefix)) {1405return true;1406}1407}14081409return false;1410}14111412void EditorSettings::mark_setting_changed(const String &p_setting) {1413changed_settings.insert(p_setting);1414}14151416void EditorSettings::destroy() {1417if (!singleton.ptr()) {1418return;1419}1420save();1421singleton = Ref<EditorSettings>();1422}14231424void EditorSettings::set_optimize_save(bool p_optimize) {1425optimize_save = p_optimize;1426}14271428// Properties14291430void EditorSettings::set_setting(const String &p_setting, const Variant &p_value) {1431_THREAD_SAFE_METHOD_1432set(p_setting, p_value);1433}14341435Variant EditorSettings::get_setting(const String &p_setting) const {1436_THREAD_SAFE_METHOD_1437if (ProjectSettings::get_singleton()->has_editor_setting_override(p_setting)) {1438return ProjectSettings::get_singleton()->get_editor_setting_override(p_setting);1439}1440return get(p_setting);1441}14421443bool EditorSettings::has_setting(const String &p_setting) const {1444_THREAD_SAFE_METHOD_14451446return props.has(p_setting);1447}14481449void EditorSettings::erase(const String &p_setting) {1450_THREAD_SAFE_METHOD_14511452props.erase(p_setting);1453}14541455void EditorSettings::raise_order(const String &p_setting) {1456_THREAD_SAFE_METHOD_14571458ERR_FAIL_COND(!props.has(p_setting));1459props[p_setting].order = ++last_order;1460}14611462void EditorSettings::set_restart_if_changed(const StringName &p_setting, bool p_restart) {1463_THREAD_SAFE_METHOD_14641465if (!props.has(p_setting)) {1466return;1467}1468props[p_setting].restart_if_changed = p_restart;1469}14701471void EditorSettings::set_basic(const StringName &p_setting, bool p_basic) {1472_THREAD_SAFE_METHOD_14731474if (!props.has(p_setting)) {1475return;1476}1477props[p_setting].basic = p_basic;1478}14791480void EditorSettings::set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current) {1481_THREAD_SAFE_METHOD_14821483if (!props.has(p_setting)) {1484return;1485}1486props[p_setting].initial = p_value;1487props[p_setting].has_default_value = true;1488if (p_update_current) {1489set(p_setting, p_value);1490}1491}14921493Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_restart_if_changed, bool p_basic) {1494ERR_FAIL_NULL_V_MSG(EditorSettings::get_singleton(), p_default, "EditorSettings not instantiated yet.");14951496Variant ret = p_default;1497if (EditorSettings::get_singleton()->has_setting(p_setting)) {1498ret = EDITOR_GET(p_setting);1499} else {1500EditorSettings::get_singleton()->set_manually(p_setting, p_default);1501}1502EditorSettings::get_singleton()->set_restart_if_changed(p_setting, p_restart_if_changed);1503EditorSettings::get_singleton()->set_basic(p_setting, p_basic);15041505if (!EditorSettings::get_singleton()->has_default_value(p_setting)) {1506EditorSettings::get_singleton()->set_initial_value(p_setting, p_default);1507}15081509return ret;1510}15111512Variant _EDITOR_GET(const String &p_setting) {1513ERR_FAIL_COND_V(!EditorSettings::get_singleton() || !EditorSettings::get_singleton()->has_setting(p_setting), Variant());1514return EditorSettings::get_singleton()->get_setting(p_setting);1515}15161517bool EditorSettings::_property_can_revert(const StringName &p_name) const {1518const VariantContainer *property = props.getptr(p_name);1519if (property) {1520return property->has_default_value;1521}1522return false;1523}15241525bool EditorSettings::_property_get_revert(const StringName &p_name, Variant &r_property) const {1526const VariantContainer *value = props.getptr(p_name);1527if (value && value->has_default_value) {1528r_property = value->initial;1529return true;1530}1531return false;1532}15331534void EditorSettings::add_property_hint(const PropertyInfo &p_hint) {1535_THREAD_SAFE_METHOD_15361537hints[p_hint.name] = p_hint;1538}15391540// Metadata15411542void EditorSettings::set_project_metadata(const String &p_section, const String &p_key, const Variant &p_data) {1543const String path = _get_project_metadata_path();15441545if (project_metadata.is_null()) {1546project_metadata.instantiate();15471548Error err = project_metadata->load(path);1549if (err != OK && err != ERR_FILE_NOT_FOUND) {1550ERR_PRINT("Cannot load project metadata from file '" + path + "'.");1551}1552}1553project_metadata->set_value(p_section, p_key, p_data);15541555Error err = project_metadata->save(path);1556ERR_FAIL_COND_MSG(err != OK, "Cannot save project metadata to file '" + path + "'.");1557}15581559Variant EditorSettings::get_project_metadata(const String &p_section, const String &p_key, const Variant &p_default) const {1560if (project_metadata.is_null()) {1561project_metadata.instantiate();15621563const String path = _get_project_metadata_path();1564Error err = project_metadata->load(path);1565ERR_FAIL_COND_V_MSG(err != OK && err != ERR_FILE_NOT_FOUND, p_default, "Cannot load project metadata from file '" + path + "'.");1566}1567return project_metadata->get_value(p_section, p_key, p_default);1568}15691570void EditorSettings::set_favorites(const Vector<String> &p_favorites) {1571favorites = p_favorites;1572String favorites_file;1573if (Engine::get_singleton()->is_project_manager_hint()) {1574favorites_file = EditorPaths::get_singleton()->get_config_dir().path_join("favorite_dirs");1575} else {1576favorites_file = EditorPaths::get_singleton()->get_project_settings_dir().path_join("favorites");1577}1578Ref<FileAccess> f = FileAccess::open(favorites_file, FileAccess::WRITE);1579if (f.is_valid()) {1580for (int i = 0; i < favorites.size(); i++) {1581f->store_line(favorites[i]);1582}1583}1584}15851586void EditorSettings::set_favorite_properties(const HashMap<String, PackedStringArray> &p_favorite_properties) {1587favorite_properties = p_favorite_properties;1588String favorite_properties_file = EditorPaths::get_singleton()->get_project_settings_dir().path_join("favorite_properties");15891590Ref<ConfigFile> cf;1591cf.instantiate();1592for (const KeyValue<String, PackedStringArray> &kv : p_favorite_properties) {1593cf->set_value(kv.key, "properties", kv.value);1594}1595cf->save(favorite_properties_file);1596}15971598Vector<String> EditorSettings::get_favorites() const {1599return favorites;1600}16011602HashMap<String, PackedStringArray> EditorSettings::get_favorite_properties() const {1603return favorite_properties;1604}16051606void EditorSettings::set_recent_dirs(const Vector<String> &p_recent_dirs) {1607recent_dirs = p_recent_dirs;1608String recent_dirs_file;1609if (Engine::get_singleton()->is_project_manager_hint()) {1610recent_dirs_file = EditorPaths::get_singleton()->get_config_dir().path_join("recent_dirs");1611} else {1612recent_dirs_file = EditorPaths::get_singleton()->get_project_settings_dir().path_join("recent_dirs");1613}1614Ref<FileAccess> f = FileAccess::open(recent_dirs_file, FileAccess::WRITE);1615if (f.is_valid()) {1616for (int i = 0; i < recent_dirs.size(); i++) {1617f->store_line(recent_dirs[i]);1618}1619}1620}16211622Vector<String> EditorSettings::get_recent_dirs() const {1623return recent_dirs;1624}16251626void EditorSettings::load_favorites_and_recent_dirs() {1627String favorites_file;1628String favorite_properties_file;1629String recent_dirs_file;1630if (Engine::get_singleton()->is_project_manager_hint()) {1631favorites_file = EditorPaths::get_singleton()->get_config_dir().path_join("favorite_dirs");1632favorite_properties_file = EditorPaths::get_singleton()->get_config_dir().path_join("favorite_properties");1633recent_dirs_file = EditorPaths::get_singleton()->get_config_dir().path_join("recent_dirs");1634} else {1635favorites_file = EditorPaths::get_singleton()->get_project_settings_dir().path_join("favorites");1636favorite_properties_file = EditorPaths::get_singleton()->get_project_settings_dir().path_join("favorite_properties");1637recent_dirs_file = EditorPaths::get_singleton()->get_project_settings_dir().path_join("recent_dirs");1638}16391640/// File Favorites16411642Ref<FileAccess> f = FileAccess::open(favorites_file, FileAccess::READ);1643if (f.is_valid()) {1644String line = f->get_line().strip_edges();1645while (!line.is_empty()) {1646favorites.append(line);1647line = f->get_line().strip_edges();1648}1649}16501651/// Inspector Favorites16521653Ref<ConfigFile> cf;1654cf.instantiate();1655if (cf->load(favorite_properties_file) == OK) {1656Vector<String> secs = cf->get_sections();16571658for (String &E : secs) {1659PackedStringArray properties = PackedStringArray(cf->get_value(E, "properties"));1660if (EditorNode::get_editor_data().is_type_recognized(E) || ResourceLoader::exists(E, "Script")) {1661for (const String &property : properties) {1662if (!favorite_properties[E].has(property)) {1663favorite_properties[E].push_back(property);1664}1665}1666}1667}1668}16691670/// Recent Directories16711672f = FileAccess::open(recent_dirs_file, FileAccess::READ);1673if (f.is_valid()) {1674String line = f->get_line().strip_edges();1675while (!line.is_empty()) {1676recent_dirs.push_back(line);1677line = f->get_line().strip_edges();1678}1679}1680}16811682HashMap<StringName, Color> EditorSettings::get_godot2_text_editor_theme() {1683// Godot 2 is only a dark theme; it doesn't have a light theme counterpart.1684HashMap<StringName, Color> colors;1685colors["text_editor/theme/highlighting/symbol_color"] = Color(0.73, 0.87, 1.0);1686colors["text_editor/theme/highlighting/keyword_color"] = Color(1.0, 1.0, 0.7);1687colors["text_editor/theme/highlighting/control_flow_keyword_color"] = Color(1.0, 0.85, 0.7);1688colors["text_editor/theme/highlighting/base_type_color"] = Color(0.64, 1.0, 0.83);1689colors["text_editor/theme/highlighting/engine_type_color"] = Color(0.51, 0.83, 1.0);1690colors["text_editor/theme/highlighting/user_type_color"] = Color(0.42, 0.67, 0.93);1691colors["text_editor/theme/highlighting/comment_color"] = Color(0.4, 0.4, 0.4);1692colors["text_editor/theme/highlighting/doc_comment_color"] = Color(0.5, 0.6, 0.7);1693colors["text_editor/theme/highlighting/string_color"] = Color(0.94, 0.43, 0.75);1694colors["text_editor/theme/highlighting/background_color"] = Color(0.13, 0.12, 0.15);1695colors["text_editor/theme/highlighting/completion_background_color"] = Color(0.17, 0.16, 0.2);1696colors["text_editor/theme/highlighting/completion_selected_color"] = Color(0.26, 0.26, 0.27);1697colors["text_editor/theme/highlighting/completion_existing_color"] = Color(0.87, 0.87, 0.87, 0.13);1698colors["text_editor/theme/highlighting/completion_scroll_color"] = Color(1, 1, 1, 0.29);1699colors["text_editor/theme/highlighting/completion_scroll_hovered_color"] = Color(1, 1, 1, 0.4);1700colors["text_editor/theme/highlighting/completion_font_color"] = Color(0.67, 0.67, 0.67);1701colors["text_editor/theme/highlighting/text_color"] = Color(0.67, 0.67, 0.67);1702colors["text_editor/theme/highlighting/line_number_color"] = Color(0.67, 0.67, 0.67, 0.4);1703colors["text_editor/theme/highlighting/safe_line_number_color"] = Color(0.67, 0.78, 0.67, 0.6);1704colors["text_editor/theme/highlighting/caret_color"] = Color(0.67, 0.67, 0.67);1705colors["text_editor/theme/highlighting/caret_background_color"] = Color(0, 0, 0);1706colors["text_editor/theme/highlighting/text_selected_color"] = Color(0, 0, 0, 0);1707colors["text_editor/theme/highlighting/selection_color"] = Color(0.41, 0.61, 0.91, 0.35);1708colors["text_editor/theme/highlighting/brace_mismatch_color"] = Color(1, 0.2, 0.2);1709colors["text_editor/theme/highlighting/current_line_color"] = Color(0.3, 0.5, 0.8, 0.15);1710colors["text_editor/theme/highlighting/line_length_guideline_color"] = Color(0.3, 0.5, 0.8, 0.1);1711colors["text_editor/theme/highlighting/word_highlighted_color"] = Color(0.8, 0.9, 0.9, 0.15);1712colors["text_editor/theme/highlighting/number_color"] = Color(0.92, 0.58, 0.2);1713colors["text_editor/theme/highlighting/function_color"] = Color(0.4, 0.64, 0.81);1714colors["text_editor/theme/highlighting/member_variable_color"] = Color(0.9, 0.31, 0.35);1715colors["text_editor/theme/highlighting/mark_color"] = Color(1.0, 0.4, 0.4, 0.4);1716colors["text_editor/theme/highlighting/warning_color"] = Color(1.0, 0.8, 0.4, 0.1);1717colors["text_editor/theme/highlighting/bookmark_color"] = Color(0.08, 0.49, 0.98);1718colors["text_editor/theme/highlighting/breakpoint_color"] = Color(0.9, 0.29, 0.3);1719colors["text_editor/theme/highlighting/executing_line_color"] = Color(0.98, 0.89, 0.27);1720colors["text_editor/theme/highlighting/code_folding_color"] = Color(0.8, 0.8, 0.8, 0.8);1721colors["text_editor/theme/highlighting/folded_code_region_color"] = Color(0.68, 0.46, 0.77, 0.2);1722colors["text_editor/theme/highlighting/search_result_color"] = Color(0.05, 0.25, 0.05, 1);1723colors["text_editor/theme/highlighting/search_result_border_color"] = Color(0.41, 0.61, 0.91, 0.38);1724colors["text_editor/theme/highlighting/gdscript/function_definition_color"] = Color(0.4, 0.9, 1.0);17251726colors["text_editor/theme/highlighting/gdscript/global_function_color"] = Color(0.64, 0.64, 0.96);1727colors["text_editor/theme/highlighting/gdscript/node_path_color"] = Color(0.72, 0.77, 0.49);1728colors["text_editor/theme/highlighting/gdscript/node_reference_color"] = Color(0.39, 0.76, 0.35);1729colors["text_editor/theme/highlighting/gdscript/annotation_color"] = Color(1.0, 0.7, 0.45);1730colors["text_editor/theme/highlighting/gdscript/string_name_color"] = Color(1.0, 0.76, 0.65);1731colors["text_editor/theme/highlighting/comment_markers/critical_color"] = Color(0.77, 0.35, 0.35);1732colors["text_editor/theme/highlighting/comment_markers/warning_color"] = Color(0.72, 0.61, 0.48);1733colors["text_editor/theme/highlighting/comment_markers/notice_color"] = Color(0.56, 0.67, 0.51);1734return colors;1735}17361737bool EditorSettings::is_default_text_editor_theme(const String &p_theme_name) {1738return p_theme_name == "default" || p_theme_name == "godot 2" || p_theme_name == "custom";1739}17401741void EditorSettings::update_text_editor_themes_list() {1742String themes = "Default,Godot 2,Custom";17431744Ref<DirAccess> d = DirAccess::open(EditorPaths::get_singleton()->get_text_editor_themes_dir());1745if (d.is_null()) {1746return;1747}17481749PackedStringArray custom_themes;1750d->list_dir_begin();1751String file = d->get_next();1752while (!file.is_empty()) {1753if (file.get_extension() == "tet" && !is_default_text_editor_theme(file.get_basename().to_lower())) {1754custom_themes.push_back(file.get_basename());1755}1756file = d->get_next();1757}1758d->list_dir_end();17591760if (!custom_themes.is_empty()) {1761custom_themes.sort();1762themes += "," + String(",").join(custom_themes);1763}1764add_property_hint(PropertyInfo(Variant::STRING, "text_editor/theme/color_theme", PROPERTY_HINT_ENUM, themes));1765}17661767Vector<String> EditorSettings::get_script_templates(const String &p_extension, const String &p_custom_path) {1768Vector<String> templates;1769String template_dir = EditorPaths::get_singleton()->get_script_templates_dir();1770if (!p_custom_path.is_empty()) {1771template_dir = p_custom_path;1772}1773Ref<DirAccess> d = DirAccess::open(template_dir);1774if (d.is_valid()) {1775d->list_dir_begin();1776String file = d->get_next();1777while (!file.is_empty()) {1778if (file.get_extension() == p_extension) {1779templates.push_back(file.get_basename());1780}1781file = d->get_next();1782}1783d->list_dir_end();1784}1785return templates;1786}17871788String EditorSettings::get_editor_layouts_config() const {1789return EditorPaths::get_singleton()->get_config_dir().path_join("editor_layouts.cfg");1790}17911792float EditorSettings::get_auto_display_scale() {1793#ifdef LINUXBSD_ENABLED1794if (DisplayServer::get_singleton()->get_name() == "Wayland") {1795float main_window_scale = DisplayServer::get_singleton()->screen_get_scale(DisplayServer::SCREEN_OF_MAIN_WINDOW);17961797if (DisplayServer::get_singleton()->get_screen_count() == 1 || Math::fract(main_window_scale) != 0) {1798// If we have a single screen or the screen of the window is fractional, all1799// bets are off. At this point, let's just return the current's window scale,1800// which is special-cased to the scale of `SCREEN_OF_MAIN_WINDOW`.1801return main_window_scale;1802}18031804// If the above branch didn't fire, fractional scaling isn't going to work1805// properly anyways (we're need the ability to change the UI scale at runtime).1806// At this point it's more convenient to "supersample" like we do with other1807// platforms, hoping that the user is only using integer-scaled screens.1808return DisplayServer::get_singleton()->screen_get_max_scale();1809}1810#endif18111812#if defined(MACOS_ENABLED) || defined(ANDROID_ENABLED)1813return DisplayServer::get_singleton()->screen_get_max_scale();1814#else1815const int screen = DisplayServer::get_singleton()->window_get_current_screen();18161817if (DisplayServer::get_singleton()->screen_get_size(screen) == Vector2i()) {1818// Invalid screen size, skip.1819return 1.0;1820}18211822// Use the smallest dimension to use a correct display scale on portrait displays.1823const int smallest_dimension = MIN(DisplayServer::get_singleton()->screen_get_size(screen).x, DisplayServer::get_singleton()->screen_get_size(screen).y);1824if (DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && smallest_dimension >= 1400) {1825// hiDPI display.1826return 2.0;1827} else if (smallest_dimension >= 1700) {1828// Likely a hiDPI display, but we aren't certain due to the returned DPI.1829// Use an intermediate scale to handle this situation.1830return 1.5;1831} else if (smallest_dimension <= 800) {1832// Small loDPI display. Use a smaller display scale so that editor elements fit more easily.1833// Icons won't look great, but this is better than having editor elements overflow from its window.1834return 0.75;1835}1836return 1.0;1837#endif1838}18391840// Shortcuts18411842void EditorSettings::_add_shortcut_default(const String &p_name, const Ref<Shortcut> &p_shortcut) {1843shortcuts[p_name] = p_shortcut;1844}18451846void EditorSettings::add_shortcut(const String &p_name, const Ref<Shortcut> &p_shortcut) {1847shortcuts[p_name] = p_shortcut;1848shortcuts[p_name]->set_meta("customized", true);1849}18501851bool EditorSettings::is_shortcut(const String &p_name, const Ref<InputEvent> &p_event) const {1852HashMap<String, Ref<Shortcut>>::ConstIterator E = shortcuts.find(p_name);1853ERR_FAIL_COND_V_MSG(!E, false, "Unknown Shortcut: " + p_name + ".");18541855return E->value->matches_event(p_event);1856}18571858Ref<Shortcut> EditorSettings::get_shortcut(const String &p_name) const {1859HashMap<String, Ref<Shortcut>>::ConstIterator SC = shortcuts.find(p_name);1860if (SC) {1861return SC->value;1862}18631864// If no shortcut with the provided name is found in the list, check the built-in shortcuts.1865// Use the first item in the action list for the shortcut event, since a shortcut can only have 1 linked event.18661867Ref<Shortcut> sc;1868HashMap<String, List<Ref<InputEvent>>>::ConstIterator builtin_override = builtin_action_overrides.find(p_name);1869if (builtin_override) {1870sc.instantiate();1871sc->set_events_list(&builtin_override->value);1872sc->set_name(InputMap::get_singleton()->get_builtin_display_name(p_name));1873}18741875// If there was no override, check the default builtins to see if it has an InputEvent for the provided name.1876if (sc.is_null()) {1877HashMap<String, List<Ref<InputEvent>>>::ConstIterator builtin_default = InputMap::get_singleton()->get_builtins_with_feature_overrides_applied().find(p_name);1878if (builtin_default) {1879sc.instantiate();1880sc->set_events_list(&builtin_default->value);1881sc->set_name(InputMap::get_singleton()->get_builtin_display_name(p_name));1882}1883}18841885if (sc.is_valid()) {1886// Add the shortcut to the list.1887shortcuts[p_name] = sc;1888return sc;1889}18901891return Ref<Shortcut>();1892}18931894void EditorSettings::get_shortcut_list(List<String> *r_shortcuts) {1895for (const KeyValue<String, Ref<Shortcut>> &E : shortcuts) {1896r_shortcuts->push_back(E.key);1897}1898}18991900Ref<Shortcut> ED_GET_SHORTCUT(const String &p_path) {1901ERR_FAIL_NULL_V_MSG(EditorSettings::get_singleton(), nullptr, "EditorSettings not instantiated yet.");19021903Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);19041905ERR_FAIL_COND_V_MSG(sc.is_null(), sc, "Used ED_GET_SHORTCUT with invalid shortcut: " + p_path);19061907return sc;1908}19091910void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_keycode, bool p_physical) {1911if (!EditorSettings::get_singleton()) {1912return;1913}19141915Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);1916ERR_FAIL_COND_MSG(sc.is_null(), "Used ED_SHORTCUT_OVERRIDE with invalid shortcut: " + p_path);19171918PackedInt32Array arr;1919arr.push_back((int32_t)p_keycode);19201921ED_SHORTCUT_OVERRIDE_ARRAY(p_path, p_feature, arr, p_physical);1922}19231924void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, const PackedInt32Array &p_keycodes, bool p_physical) {1925if (!EditorSettings::get_singleton()) {1926return;1927}19281929Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);1930ERR_FAIL_COND_MSG(sc.is_null(), "Used ED_SHORTCUT_OVERRIDE_ARRAY with invalid shortcut: " + p_path);19311932// Only add the override if the OS supports the provided feature.1933if (!OS::get_singleton()->has_feature(p_feature)) {1934if (!(p_feature == "macos" && (OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")))) {1935return;1936}1937}19381939Array events;19401941for (int i = 0; i < p_keycodes.size(); i++) {1942Key keycode = (Key)p_keycodes[i];19431944if (OS::get_singleton()->has_feature("macos") || OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")) {1945// Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS1946if (keycode == Key::KEY_DELETE) {1947keycode = KeyModifierMask::META | Key::BACKSPACE;1948}1949}19501951Ref<InputEventKey> ie;1952if (keycode != Key::NONE) {1953ie = InputEventKey::create_reference(keycode, p_physical);1954events.push_back(ie);1955}1956}19571958// Override the existing shortcut only if it wasn't customized by the user.1959if (!sc->has_meta("customized")) {1960sc->set_events(events);1961}19621963sc->set_meta("original", events.duplicate(true));1964}19651966Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode, bool p_physical) {1967PackedInt32Array arr;1968arr.push_back((int32_t)p_keycode);1969return ED_SHORTCUT_ARRAY(p_path, p_name, arr, p_physical);1970}19711972Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, const PackedInt32Array &p_keycodes, bool p_physical) {1973Array events;19741975for (int i = 0; i < p_keycodes.size(); i++) {1976Key keycode = (Key)p_keycodes[i];19771978if (OS::get_singleton()->has_feature("macos") || OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")) {1979// Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS1980if (keycode == Key::KEY_DELETE) {1981keycode = KeyModifierMask::META | Key::BACKSPACE;1982}1983}19841985Ref<InputEventKey> ie;1986if (keycode != Key::NONE) {1987ie = InputEventKey::create_reference(keycode, p_physical);1988events.push_back(ie);1989}1990}19911992if (!EditorSettings::get_singleton()) {1993Ref<Shortcut> sc;1994sc.instantiate();1995sc->set_name(p_name);1996sc->set_events(events);1997sc->set_meta("original", events.duplicate(true));1998return sc;1999}20002001Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);2002if (sc.is_valid()) {2003sc->set_name(p_name); //keep name (the ones that come from disk have no name)2004sc->set_meta("original", events.duplicate(true)); //to compare against changes2005return sc;2006}20072008sc.instantiate();2009sc->set_name(p_name);2010sc->set_events(events);2011sc->set_meta("original", events.duplicate(true)); //to compare against changes2012EditorSettings::get_singleton()->_add_shortcut_default(p_path, sc);20132014return sc;2015}20162017void EditorSettings::set_builtin_action_override(const String &p_name, const TypedArray<InputEvent> &p_events) {2018List<Ref<InputEvent>> event_list;20192020// Override the whole list, since events may have their order changed or be added, removed or edited.2021InputMap::get_singleton()->action_erase_events(p_name);2022for (int i = 0; i < p_events.size(); i++) {2023event_list.push_back(p_events[i]);2024InputMap::get_singleton()->action_add_event(p_name, p_events[i]);2025}20262027// Check if the provided event array is same as built-in. If it is, it does not need to be added to the overrides.2028// Note that event order must also be the same.2029bool same_as_builtin = true;2030HashMap<String, List<Ref<InputEvent>>>::ConstIterator builtin_default = InputMap::get_singleton()->get_builtins_with_feature_overrides_applied().find(p_name);2031if (builtin_default) {2032const List<Ref<InputEvent>> &builtin_events = builtin_default->value;20332034// In the editor we only care about key events.2035List<Ref<InputEventKey>> builtin_key_events;2036for (Ref<InputEventKey> iek : builtin_events) {2037if (iek.is_valid()) {2038builtin_key_events.push_back(iek);2039}2040}20412042if (p_events.size() == builtin_key_events.size()) {2043int event_idx = 0;20442045// Check equality of each event.2046for (const Ref<InputEventKey> &E : builtin_key_events) {2047if (!E->is_match(p_events[event_idx])) {2048same_as_builtin = false;2049break;2050}2051event_idx++;2052}2053} else {2054same_as_builtin = false;2055}2056}20572058if (same_as_builtin && builtin_action_overrides.has(p_name)) {2059builtin_action_overrides.erase(p_name);2060} else {2061builtin_action_overrides[p_name] = event_list;2062}20632064// Update the shortcut (if it is used somewhere in the editor) to be the first event of the new list.2065if (shortcuts.has(p_name)) {2066shortcuts[p_name]->set_events_list(&event_list);2067}2068}20692070const Array EditorSettings::get_builtin_action_overrides(const String &p_name) const {2071HashMap<String, List<Ref<InputEvent>>>::ConstIterator AO = builtin_action_overrides.find(p_name);2072if (AO) {2073Array event_array;20742075List<Ref<InputEvent>> events_list = AO->value;2076for (const Ref<InputEvent> &E : events_list) {2077event_array.push_back(E);2078}2079return event_array;2080}20812082return Array();2083}20842085void EditorSettings::notify_changes() {2086_THREAD_SAFE_METHOD_20872088SceneTree *sml = Object::cast_to<SceneTree>(OS::get_singleton()->get_main_loop());20892090if (!sml) {2091return;2092}20932094Node *root = sml->get_root()->get_child(0);20952096if (!root) {2097return;2098}2099root->propagate_notification(NOTIFICATION_EDITOR_SETTINGS_CHANGED);2100}21012102void EditorSettings::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const {2103const String pf = p_function;2104if (p_idx == 0) {2105if (pf == "has_setting" || pf == "set_setting" || pf == "get_setting" || pf == "erase" ||2106pf == "set_initial_value" || pf == "set_as_basic" || pf == "mark_setting_changed") {2107for (const KeyValue<String, VariantContainer> &E : props) {2108if (E.value.hide_from_editor) {2109continue;2110}21112112r_options->push_back(E.key.quote());2113}2114} else if (pf == "get_project_metadata" && project_metadata.is_valid()) {2115Vector<String> sections = project_metadata->get_sections();2116for (const String §ion : sections) {2117r_options->push_back(section.quote());2118}2119} else if (pf == "set_builtin_action_override") {2120for (const Variant &action : InputMap::get_singleton()->get_actions()) {2121r_options->push_back(String(action).quote());2122}2123}2124}2125Object::get_argument_options(p_function, p_idx, r_options);2126}21272128void EditorSettings::_bind_methods() {2129ClassDB::bind_method(D_METHOD("has_setting", "name"), &EditorSettings::has_setting);2130ClassDB::bind_method(D_METHOD("set_setting", "name", "value"), &EditorSettings::set_setting);2131ClassDB::bind_method(D_METHOD("get_setting", "name"), &EditorSettings::get_setting);2132ClassDB::bind_method(D_METHOD("erase", "property"), &EditorSettings::erase);2133ClassDB::bind_method(D_METHOD("set_initial_value", "name", "value", "update_current"), &EditorSettings::set_initial_value);2134ClassDB::bind_method(D_METHOD("add_property_info", "info"), &EditorSettings::_add_property_info_bind);21352136ClassDB::bind_method(D_METHOD("set_project_metadata", "section", "key", "data"), &EditorSettings::set_project_metadata);2137ClassDB::bind_method(D_METHOD("get_project_metadata", "section", "key", "default"), &EditorSettings::get_project_metadata, DEFVAL(Variant()));21382139ClassDB::bind_method(D_METHOD("set_favorites", "dirs"), &EditorSettings::set_favorites);2140ClassDB::bind_method(D_METHOD("get_favorites"), &EditorSettings::get_favorites);2141ClassDB::bind_method(D_METHOD("set_recent_dirs", "dirs"), &EditorSettings::set_recent_dirs);2142ClassDB::bind_method(D_METHOD("get_recent_dirs"), &EditorSettings::get_recent_dirs);21432144ClassDB::bind_method(D_METHOD("set_builtin_action_override", "name", "actions_list"), &EditorSettings::set_builtin_action_override);21452146ClassDB::bind_method(D_METHOD("check_changed_settings_in_group", "setting_prefix"), &EditorSettings::check_changed_settings_in_group);2147ClassDB::bind_method(D_METHOD("get_changed_settings"), &EditorSettings::get_changed_settings);2148ClassDB::bind_method(D_METHOD("mark_setting_changed", "setting"), &EditorSettings::mark_setting_changed);21492150ADD_SIGNAL(MethodInfo("settings_changed"));21512152BIND_CONSTANT(NOTIFICATION_EDITOR_SETTINGS_CHANGED);2153}21542155EditorSettings::EditorSettings() {2156last_order = 0;21572158_load_defaults();2159callable_mp(this, &EditorSettings::_set_initialized).call_deferred();2160}216121622163