Browse Source

Merge pull request #56420 from nathanfranke/project-creation

Automatically create folder in project manager create and import
Rémi Verschelde 1 year ago
parent
commit
8af66a72b5

+ 3 - 0
doc/classes/EditorSettings.xml

@@ -883,6 +883,9 @@
 		<member name="project_manager/default_renderer" type="String" setter="" getter="">
 			The renderer type that will be checked off by default when creating a new project. Accepted strings are "forward_plus", "mobile" or "gl_compatibility".
 		</member>
+		<member name="project_manager/directory_naming_convention" type="int" setter="" getter="">
+			Directory naming convention for the project manager. Options are "No convention" (project name is directory name), "kebab-case" (default), "snake_case", "camelCase", "PascalCase", or "Title Case".
+		</member>
 		<member name="project_manager/sorting_order" type="int" setter="" getter="">
 			The sorting order to use in the project manager. When changing the sorting order in the project manager, this setting is set permanently in the editor settings.
 		</member>

+ 1 - 0
editor/editor_settings.cpp

@@ -838,6 +838,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 
 	// TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects.
 	EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/sorting_order", 0, "Last Edited,Name,Path")
+	EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/directory_naming_convention", 1, "No convention,kebab-case,snake_case,camelCase,PascalCase,Title Case")
 
 #if defined(WEB_ENABLED)
 	// Web platform only supports `gl_compatibility`.

+ 4 - 3
editor/project_manager.cpp

@@ -618,14 +618,15 @@ void ProjectManager::_new_project() {
 }
 
 void ProjectManager::_rename_project() {
-	const HashSet<String> &selected_list = project_list->get_selected_project_keys();
+	const Vector<ProjectList::Item> &selected_list = project_list->get_selected_projects();
 
 	if (selected_list.size() == 0) {
 		return;
 	}
 
-	for (const String &E : selected_list) {
-		project_dialog->set_project_path(E);
+	for (const ProjectList::Item &E : selected_list) {
+		project_dialog->set_project_name(E.project_name);
+		project_dialog->set_project_path(E.path);
 		project_dialog->set_mode(ProjectDialog::MODE_RENAME);
 		project_dialog->show_dialog();
 	}

File diff suppressed because it is too large
+ 452 - 436
editor/project_manager/project_dialog.cpp


+ 34 - 24
editor/project_manager/project_dialog.h

@@ -34,6 +34,7 @@
 #include "scene/gui/dialogs.h"
 
 class Button;
+class CheckButton;
 class EditorFileDialog;
 class LineEdit;
 class OptionButton;
@@ -65,11 +66,11 @@ private:
 	Mode mode = MODE_NEW;
 	bool is_folder_empty = true;
 
-	Button *browse = nullptr;
+	CheckButton *create_dir = nullptr;
+	Button *project_browse = nullptr;
 	Button *install_browse = nullptr;
-	Button *create_dir = nullptr;
 	VBoxContainer *name_container = nullptr;
-	VBoxContainer *path_container = nullptr;
+	VBoxContainer *project_path_container = nullptr;
 	VBoxContainer *install_path_container = nullptr;
 
 	VBoxContainer *renderer_container = nullptr;
@@ -78,54 +79,63 @@ private:
 	Ref<ButtonGroup> renderer_button_group;
 
 	Label *msg = nullptr;
-	LineEdit *project_path = nullptr;
 	LineEdit *project_name = nullptr;
+	LineEdit *project_path = nullptr;
 	LineEdit *install_path = nullptr;
-	TextureRect *status_rect = nullptr;
+	TextureRect *project_status_rect = nullptr;
 	TextureRect *install_status_rect = nullptr;
 
 	OptionButton *vcs_metadata_selection = nullptr;
 
-	EditorFileDialog *fdialog = nullptr;
+	EditorFileDialog *fdialog_project = nullptr;
 	EditorFileDialog *fdialog_install = nullptr;
 	AcceptDialog *dialog_error = nullptr;
 
 	String zip_path;
 	String zip_title;
-	String fav_dir;
 
-	String created_folder_path;
+	void _set_message(const String &p_msg, MessageType p_type, InputType input_type = PROJECT_PATH);
+	void _validate_path();
 
-	void _set_message(const String &p_msg, MessageType p_type = MESSAGE_SUCCESS, InputType input_type = PROJECT_PATH);
+	// Project path for MODE_NEW and MODE_INSTALL. Install path for MODE_IMPORT.
+	// Install path is only visible when importing a ZIP.
+	String _get_target_path();
+	void _set_target_path(const String &p_text);
 
-	String _test_path();
-	void _update_path(const String &p_path);
-	void _path_text_changed(const String &p_path);
-	void _path_selected(const String &p_path);
-	void _file_selected(const String &p_path);
-	void _install_path_selected(const String &p_path);
+	// Calculated from project name / ZIP name.
+	String auto_dir;
+
+	// Updates `auto_dir`. If the target path dir name is equal to `auto_dir` (the default state), the target path is also updated.
+	void _update_target_auto_dir();
 
-	void _browse_path();
+	// While `create_dir` is disabled, stores the last target path dir name, or an empty string if equal to `auto_dir`.
+	String last_custom_target_dir;
+	void _create_dir_toggled(bool p_pressed);
+
+	void _project_name_changed();
+	void _project_path_changed();
+	void _install_path_changed();
+
+	void _browse_project_path();
 	void _browse_install_path();
-	void _create_folder();
 
-	void _text_changed(const String &p_text);
-	void _nonempty_confirmation_ok_pressed();
+	void _project_path_selected(const String &p_path);
+	void _install_path_selected(const String &p_path);
+
 	void _renderer_selected();
-	void _remove_created_folder();
+	void _nonempty_confirmation_ok_pressed();
 
 	void ok_pressed() override;
-	void cancel_pressed() override;
 
 protected:
-	void _notification(int p_what);
 	static void _bind_methods();
 
 public:
-	void set_zip_path(const String &p_path);
-	void set_zip_title(const String &p_title);
 	void set_mode(Mode p_mode);
+	void set_project_name(const String &p_name);
 	void set_project_path(const String &p_path);
+	void set_zip_path(const String &p_path);
+	void set_zip_title(const String &p_title);
 
 	void ask_for_path_and_show();
 	void show_dialog();

Some files were not shown because too many files changed in this diff