diff options
-rw-r--r-- | core/object/script_language.cpp | 7 | ||||
-rw-r--r-- | core/object/script_language.h | 14 | ||||
-rw-r--r-- | core/object/script_language_extension.cpp | 1 | ||||
-rw-r--r-- | core/object/script_language_extension.h | 1 | ||||
-rw-r--r-- | doc/classes/ProjectSettings.xml | 7 | ||||
-rw-r--r-- | doc/classes/ScriptLanguage.xml | 10 | ||||
-rw-r--r-- | doc/classes/ScriptLanguageExtension.xml | 5 | ||||
-rw-r--r-- | editor/editor_autoload_settings.cpp | 2 | ||||
-rw-r--r-- | editor/editor_node.cpp | 31 | ||||
-rw-r--r-- | editor/editor_node.h | 7 | ||||
-rw-r--r-- | editor/register_editor_types.cpp | 4 | ||||
-rw-r--r-- | editor/script_create_dialog.cpp | 63 | ||||
-rw-r--r-- | editor/script_create_dialog.h | 3 | ||||
-rw-r--r-- | modules/mono/csharp_script.cpp | 4 | ||||
-rw-r--r-- | modules/mono/csharp_script.h | 1 |
15 files changed, 103 insertions, 57 deletions
diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp index 3b9b1f9094..d358a8d2a0 100644 --- a/core/object/script_language.cpp +++ b/core/object/script_language.cpp @@ -535,6 +535,13 @@ TypedArray<int> ScriptLanguage::CodeCompletionOption::get_option_cached_characte return charac; } +void ScriptLanguage::_bind_methods() { + BIND_ENUM_CONSTANT(SCRIPT_NAME_CASING_AUTO); + BIND_ENUM_CONSTANT(SCRIPT_NAME_CASING_PASCAL_CASE); + BIND_ENUM_CONSTANT(SCRIPT_NAME_CASING_SNAKE_CASE); + BIND_ENUM_CONSTANT(SCRIPT_NAME_CASING_KEBAB_CASE); +} + bool PlaceHolderScriptInstance::set(const StringName &p_name, const Variant &p_value) { if (script->is_placeholder_fallback_enabled()) { return false; diff --git a/core/object/script_language.h b/core/object/script_language.h index 4217bc9f96..95e9d2b4af 100644 --- a/core/object/script_language.h +++ b/core/object/script_language.h @@ -193,6 +193,10 @@ public: class ScriptLanguage : public Object { GDCLASS(ScriptLanguage, Object) + +protected: + static void _bind_methods(); + public: virtual String get_name() const = 0; @@ -224,6 +228,13 @@ public: TEMPLATE_PROJECT }; + enum ScriptNameCasing { + SCRIPT_NAME_CASING_AUTO, + SCRIPT_NAME_CASING_PASCAL_CASE, + SCRIPT_NAME_CASING_SNAKE_CASE, + SCRIPT_NAME_CASING_KEBAB_CASE, + }; + struct ScriptTemplate { String inherit = "Object"; String name; @@ -260,6 +271,7 @@ public: virtual bool can_make_function() const { return true; } virtual Error open_in_external_editor(const Ref<Script> &p_script, int p_line, int p_col) { return ERR_UNAVAILABLE; } virtual bool overrides_external_editor() { return false; } + virtual ScriptNameCasing preferred_file_name_casing() const { return SCRIPT_NAME_CASING_SNAKE_CASE; } // Keep enums in sync with: // scene/gui/code_edit.h - CodeEdit::CodeCompletionKind @@ -405,6 +417,8 @@ public: virtual ~ScriptLanguage() {} }; +VARIANT_ENUM_CAST(ScriptLanguage::ScriptNameCasing); + extern uint8_t script_encryption_key[32]; class PlaceHolderScriptInstance : public ScriptInstance { diff --git a/core/object/script_language_extension.cpp b/core/object/script_language_extension.cpp index 3a9b171f28..ec99c7cf4e 100644 --- a/core/object/script_language_extension.cpp +++ b/core/object/script_language_extension.cpp @@ -112,6 +112,7 @@ void ScriptLanguageExtension::_bind_methods() { GDVIRTUAL_BIND(_can_make_function); GDVIRTUAL_BIND(_open_in_external_editor, "script", "line", "column"); GDVIRTUAL_BIND(_overrides_external_editor); + GDVIRTUAL_BIND(_preferred_file_name_casing); GDVIRTUAL_BIND(_complete_code, "code", "path", "owner"); GDVIRTUAL_BIND(_lookup_code, "code", "symbol", "path", "owner"); diff --git a/core/object/script_language_extension.h b/core/object/script_language_extension.h index aa0788b8bf..18105ec8cd 100644 --- a/core/object/script_language_extension.h +++ b/core/object/script_language_extension.h @@ -376,6 +376,7 @@ public: EXBIND0RC(bool, can_make_function) EXBIND3R(Error, open_in_external_editor, const Ref<Script> &, int, int) EXBIND0R(bool, overrides_external_editor) + EXBIND0RC(ScriptNameCasing, preferred_file_name_casing) GDVIRTUAL3RC(Dictionary, _complete_code, const String &, const String &, Object *) diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 7c3dfeda4c..6e864316f1 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -948,13 +948,16 @@ The format of the default signal callback name when a signal connects to the same node that emits it (in the Signal Connection Dialog). The following substitutions are available: [code]{NodeName}[/code], [code]{nodeName}[/code], [code]{node_name}[/code], [code]{SignalName}[/code], [code]{signalName}[/code], and [code]{signal_name}[/code]. </member> <member name="editor/naming/node_name_casing" type="int" setter="" getter="" default="0"> - When creating node names automatically, set the type of casing in this project. This is mostly an editor setting. + When creating node names automatically, set the type of casing to use in this project. This is mostly an editor setting. </member> <member name="editor/naming/node_name_num_separator" type="int" setter="" getter="" default="0"> What to use to separate node name from number. This is mostly an editor setting. </member> <member name="editor/naming/scene_name_casing" type="int" setter="" getter="" default="2"> - When generating file names from scene root node, set the type of casing in this project. This is mostly an editor setting. + When generating scene file names from scene root node, set the type of casing to use in this project. This is mostly an editor setting. + </member> + <member name="editor/naming/script_name_casing" type="int" setter="" getter="" default="0"> + When generating script file names from the selected node, set the type of casing to use in this project. This is mostly an editor setting. </member> <member name="editor/run/main_run_args" type="String" setter="" getter="" default=""""> The command-line arguments to append to Godot's own command line when running the project. This doesn't affect the editor itself. diff --git a/doc/classes/ScriptLanguage.xml b/doc/classes/ScriptLanguage.xml index 51134012c7..0a1b801f9b 100644 --- a/doc/classes/ScriptLanguage.xml +++ b/doc/classes/ScriptLanguage.xml @@ -6,4 +6,14 @@ </description> <tutorials> </tutorials> + <constants> + <constant name="SCRIPT_NAME_CASING_AUTO" value="0" enum="ScriptNameCasing"> + </constant> + <constant name="SCRIPT_NAME_CASING_PASCAL_CASE" value="1" enum="ScriptNameCasing"> + </constant> + <constant name="SCRIPT_NAME_CASING_SNAKE_CASE" value="2" enum="ScriptNameCasing"> + </constant> + <constant name="SCRIPT_NAME_CASING_KEBAB_CASE" value="3" enum="ScriptNameCasing"> + </constant> + </constants> </class> diff --git a/doc/classes/ScriptLanguageExtension.xml b/doc/classes/ScriptLanguageExtension.xml index 87d82d8af7..a453866e27 100644 --- a/doc/classes/ScriptLanguageExtension.xml +++ b/doc/classes/ScriptLanguageExtension.xml @@ -267,6 +267,11 @@ <description> </description> </method> + <method name="_preferred_file_name_casing" qualifiers="virtual const"> + <return type="int" enum="ScriptLanguage.ScriptNameCasing" /> + <description> + </description> + </method> <method name="_profiling_get_accumulated_data" qualifiers="virtual"> <return type="int" /> <param index="0" name="info_array" type="ScriptLanguageExtensionProfilingInfo*" /> diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index 0e46990b41..a615acf9f8 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -166,7 +166,7 @@ void EditorAutoloadSettings::_autoload_add() { if (!fpath.ends_with("/")) { fpath = fpath.get_base_dir(); } - dialog->config("Node", fpath.path_join(vformat("%s.gd", autoload_add_name->get_text().to_snake_case())), false, false); + dialog->config("Node", fpath.path_join(vformat("%s.gd", autoload_add_name->get_text())), false, false); dialog->popup_centered(); } else { if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_text())) { diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 44c9afebb6..7de3f58997 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -3089,17 +3089,40 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } -String EditorNode::adjust_scene_name_casing(const String &root_name) { +String EditorNode::adjust_scene_name_casing(const String &p_root_name) { switch (GLOBAL_GET("editor/naming/scene_name_casing").operator int()) { case SCENE_NAME_CASING_AUTO: // Use casing of the root node. break; case SCENE_NAME_CASING_PASCAL_CASE: - return root_name.to_pascal_case(); + return p_root_name.replace("-", "_").to_pascal_case(); case SCENE_NAME_CASING_SNAKE_CASE: - return root_name.replace("-", "_").to_snake_case(); + return p_root_name.replace("-", "_").to_snake_case(); + case SCENE_NAME_CASING_KEBAB_CASE: + return p_root_name.to_snake_case().replace("_", "-"); } - return root_name; + return p_root_name; +} + +String EditorNode::adjust_script_name_casing(const String &p_file_name, ScriptLanguage::ScriptNameCasing p_auto_casing) { + int editor_casing = GLOBAL_GET("editor/naming/script_name_casing"); + if (editor_casing == ScriptLanguage::SCRIPT_NAME_CASING_AUTO) { + // Use the script language's preferred casing. + editor_casing = p_auto_casing; + } + + switch (editor_casing) { + case ScriptLanguage::SCRIPT_NAME_CASING_AUTO: + // Script language has no preference, so do not adjust. + break; + case ScriptLanguage::SCRIPT_NAME_CASING_PASCAL_CASE: + return p_file_name.replace("-", "_").to_pascal_case(); + case ScriptLanguage::SCRIPT_NAME_CASING_SNAKE_CASE: + return p_file_name.replace("-", "_").to_snake_case(); + case ScriptLanguage::SCRIPT_NAME_CASING_KEBAB_CASE: + return p_file_name.to_snake_case().replace("_", "-"); + } + return p_file_name; } void EditorNode::_request_screenshot() { diff --git a/editor/editor_node.h b/editor/editor_node.h index d44f7b3bb4..b479626648 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -31,6 +31,7 @@ #ifndef EDITOR_NODE_H #define EDITOR_NODE_H +#include "core/object/script_language.h" #include "core/templates/safe_refcount.h" #include "editor/editor_data.h" #include "editor/editor_folding.h" @@ -135,7 +136,8 @@ public: enum SceneNameCasing { SCENE_NAME_CASING_AUTO, SCENE_NAME_CASING_PASCAL_CASE, - SCENE_NAME_CASING_SNAKE_CASE + SCENE_NAME_CASING_SNAKE_CASE, + SCENE_NAME_CASING_KEBAB_CASE, }; struct ExecuteThreadArgs { @@ -689,7 +691,8 @@ public: static VSplitContainer *get_top_split() { return singleton->top_split; } static EditorBottomPanel *get_bottom_panel() { return singleton->bottom_panel; } - static String adjust_scene_name_casing(const String &root_name); + static String adjust_scene_name_casing(const String &p_root_name); + static String adjust_script_name_casing(const String &p_file_name, ScriptLanguage::ScriptNameCasing p_auto_casing); static bool has_unsaved_changes() { return singleton->unsaved_cache; } static void disambiguate_filenames(const Vector<String> p_full_paths, Vector<String> &r_filenames); diff --git a/editor/register_editor_types.cpp b/editor/register_editor_types.cpp index ab8aa4b68f..610ad3efdf 100644 --- a/editor/register_editor_types.cpp +++ b/editor/register_editor_types.cpp @@ -30,6 +30,7 @@ #include "register_editor_types.h" +#include "core/object/script_language.h" #include "editor/debugger/debug_adapter/debug_adapter_server.h" #include "editor/editor_command_palette.h" #include "editor/editor_feature_profile.h" @@ -269,7 +270,8 @@ void register_editor_types() { GLOBAL_DEF("editor/naming/default_signal_callback_name", "_on_{node_name}_{signal_name}"); GLOBAL_DEF("editor/naming/default_signal_callback_to_self_name", "_on_{signal_name}"); - GLOBAL_DEF(PropertyInfo(Variant::INT, "editor/naming/scene_name_casing", PROPERTY_HINT_ENUM, "Auto,PascalCase,snake_case"), EditorNode::SCENE_NAME_CASING_SNAKE_CASE); + GLOBAL_DEF(PropertyInfo(Variant::INT, "editor/naming/scene_name_casing", PROPERTY_HINT_ENUM, "Auto,PascalCase,snake_case,kebab-case"), EditorNode::SCENE_NAME_CASING_SNAKE_CASE); + GLOBAL_DEF(PropertyInfo(Variant::INT, "editor/naming/script_name_casing", PROPERTY_HINT_ENUM, "Auto,PascalCase,snake_case,kebab-case"), ScriptLanguage::SCRIPT_NAME_CASING_AUTO); GLOBAL_DEF("editor/import/reimport_missing_imported_files", true); GLOBAL_DEF("editor/import/use_multiple_threads", true); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index d111fe8f36..6ca128138e 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -125,7 +125,6 @@ void ScriptCreateDialog::_notification(int p_what) { for (int i = 0; i < language_menu->get_item_count(); i++) { if (language_menu->get_item_text(i) == last_language) { language_menu->select(i); - current_language = i; break; } } @@ -146,8 +145,8 @@ void ScriptCreateDialog::_notification(int p_what) { void ScriptCreateDialog::_path_hbox_sorted() { if (is_visible()) { - int filename_start_pos = initial_bp.rfind("/") + 1; - int filename_end_pos = initial_bp.length(); + int filename_start_pos = file_path->get_text().rfind("/") + 1; + int filename_end_pos = file_path->get_text().length(); if (!is_built_in) { file_path->select(filename_start_pos, filename_end_pos); @@ -166,26 +165,30 @@ bool ScriptCreateDialog::_can_be_built_in() { return (supports_built_in && built_in_enabled); } +String ScriptCreateDialog::_adjust_file_path(const String &p_base_path) const { + if (p_base_path.is_empty()) { + return p_base_path; + } + + String base_dir = p_base_path.get_base_dir(); + String file_name = p_base_path.get_file().get_basename(); + file_name = EditorNode::adjust_script_name_casing(file_name, language->preferred_file_name_casing()); + String extension = language->get_extension(); + return base_dir.path_join(file_name + "." + extension); +} + void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_path, bool p_built_in_enabled, bool p_load_enabled) { parent_name->set_text(p_base_name); parent_name->deselect(); built_in_name->set_text(""); - if (!p_base_path.is_empty()) { - initial_bp = p_base_path.get_basename(); - file_path->set_text(initial_bp + "." + ScriptServer::get_language(language_menu->get_selected())->get_extension()); - current_language = language_menu->get_selected(); - } else { - initial_bp = ""; - file_path->set_text(""); - } + file_path->set_text(p_base_path); file_path->deselect(); built_in_enabled = p_built_in_enabled; load_enabled = p_load_enabled; - _language_changed(current_language); - _path_changed(file_path->get_text()); + _language_changed(language_menu->get_selected()); } void ScriptCreateDialog::set_inheritance_base_type(const String &p_base) { @@ -388,38 +391,9 @@ void ScriptCreateDialog::_language_changed(int l) { is_built_in = false; } - String selected_ext = "." + language->get_extension(); String path = file_path->get_text(); - String extension = ""; - if (!path.is_empty()) { - if (path.contains(".")) { - extension = path.get_extension(); - } - - if (extension.length() == 0) { - // Add extension if none. - path += selected_ext; - _path_changed(path); - } else { - // Change extension by selected language. - List<String> extensions; - // Get all possible extensions for script. - for (int m = 0; m < language_menu->get_item_count(); m++) { - ScriptServer::get_language(m)->get_recognized_extensions(&extensions); - } - - for (const String &E : extensions) { - if (E.nocasecmp_to(extension) == 0) { - path = path.get_basename() + selected_ext; - _path_changed(path); - break; - } - } - } - } else { - path = "class" + selected_ext; - _path_changed(path); - } + path = _adjust_file_path(path); + _path_changed(path); file_path->set_text(path); EditorSettings::get_singleton()->set_project_metadata("script_setup", "last_selected_language", language_menu->get_item_text(language_menu->get_selected())); @@ -896,7 +870,6 @@ ScriptCreateDialog::ScriptCreateDialog() { if (default_language >= 0) { language_menu->select(default_language); } - current_language = default_language; language_menu->connect("item_selected", callable_mp(this, &ScriptCreateDialog::_language_changed)); diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h index 66301ea3b9..c8f043b420 100644 --- a/editor/script_create_dialog.h +++ b/editor/script_create_dialog.h @@ -71,7 +71,6 @@ class ScriptCreateDialog : public ConfirmationDialog { bool is_browsing_parent = false; String path_error; String template_inactive_message; - String initial_bp; bool is_new_script_created = true; bool is_path_valid = false; bool supports_built_in = false; @@ -82,7 +81,6 @@ class ScriptCreateDialog : public ConfirmationDialog { bool is_using_templates = true; bool built_in_enabled = true; bool load_enabled = true; - int current_language; int default_language; bool re_check_path = false; @@ -117,6 +115,7 @@ class ScriptCreateDialog : public ConfirmationDialog { Vector<ScriptLanguage::ScriptTemplate> _get_user_templates(const ScriptLanguage *p_language, const StringName &p_object, const String &p_dir, const ScriptLanguage::TemplateLocation &p_origin) const; ScriptLanguage::ScriptTemplate _parse_template(const ScriptLanguage *p_language, const String &p_path, const String &p_filename, const ScriptLanguage::TemplateLocation &p_origin, const String &p_inherits) const; String _get_script_origin_label(const ScriptLanguage::TemplateLocation &p_origin) const; + String _adjust_file_path(const String &p_base_path) const; protected: void _notification(int p_what); diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 9ccaa27e84..93fb5f1dc6 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -405,6 +405,10 @@ bool CSharpLanguage::supports_builtin_mode() const { return false; } +ScriptLanguage::ScriptNameCasing CSharpLanguage::preferred_file_name_casing() const { + return SCRIPT_NAME_CASING_PASCAL_CASE; +} + #ifdef TOOLS_ENABLED struct VariantCsName { Variant::Type variant_type; diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index 99e6ebf2e3..7821420620 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -518,6 +518,7 @@ public: virtual String _get_indentation() const; /* TODO? */ void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const override {} /* TODO */ void add_global_constant(const StringName &p_variable, const Variant &p_value) override {} + virtual ScriptNameCasing preferred_file_name_casing() const override; /* SCRIPT GLOBAL CLASS FUNCTIONS */ virtual bool handles_global_class_type(const String &p_type) const override; |