Browse Source

Add "Add Script" option to project autoload settings

Yuri Roubinsky 3 years ago
parent
commit
073abe4b9c

+ 50 - 13
editor/editor_autoload_settings.cpp

@@ -35,6 +35,7 @@
 #include "editor/editor_file_dialog.h"
 #include "editor/editor_node.h"
 #include "editor/editor_scale.h"
+#include "editor/filesystem_dock.h"
 #include "project_settings_editor.h"
 #include "scene/main/window.h"
 #include "scene/resources/packed_scene.h"
@@ -63,6 +64,28 @@ void EditorAutoloadSettings::_notification(int p_what) {
 		case NOTIFICATION_THEME_CHANGED: {
 			browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")));
 		} break;
+
+		case NOTIFICATION_VISIBILITY_CHANGED: {
+			FileSystemDock *dock = FileSystemDock::get_singleton();
+
+			if (dock != nullptr) {
+				ScriptCreateDialog *dialog = dock->get_script_create_dialog();
+
+				if (dialog != nullptr) {
+					Callable script_created = callable_mp(this, &EditorAutoloadSettings::_script_created);
+
+					if (is_visible_in_tree()) {
+						if (!dialog->is_connected(SNAME("script_created"), script_created)) {
+							dialog->connect("script_created", script_created);
+						}
+					} else {
+						if (dialog->is_connected(SNAME("script_created"), script_created)) {
+							dialog->disconnect("script_created", script_created);
+						}
+					}
+				}
+			}
+		} break;
 	}
 }
 
@@ -134,12 +157,22 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
 }
 
 void EditorAutoloadSettings::_autoload_add() {
-	if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_text())) {
-		autoload_add_path->set_text("");
-	}
+	if (autoload_add_path->get_text().is_empty()) {
+		ScriptCreateDialog *dialog = FileSystemDock::get_singleton()->get_script_create_dialog();
+		String fpath = path;
+		if (!fpath.ends_with("/")) {
+			fpath = fpath.get_base_dir();
+		}
+		dialog->config("Node", fpath.plus_file(vformat("%s.gd", autoload_add_name->get_text().camelcase_to_underscore())), false, false);
+		dialog->popup_centered();
+	} else {
+		if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_text())) {
+			autoload_add_path->set_text("");
+		}
 
-	autoload_add_name->set_text("");
-	add_autoload->set_disabled(true);
+		autoload_add_name->set_text("");
+		add_autoload->set_disabled(true);
+	}
 }
 
 void EditorAutoloadSettings::_autoload_selected() {
@@ -351,14 +384,13 @@ void EditorAutoloadSettings::_autoload_text_submitted(const String p_name) {
 }
 
 void EditorAutoloadSettings::_autoload_path_text_changed(const String p_path) {
-	add_autoload->set_disabled(
-			p_path.is_empty() || !_autoload_name_is_valid(autoload_add_name->get_text(), nullptr));
+	add_autoload->set_disabled(!_autoload_name_is_valid(autoload_add_name->get_text(), nullptr));
 }
 
 void EditorAutoloadSettings::_autoload_text_changed(const String p_name) {
 	String error_string;
 	bool is_name_valid = _autoload_name_is_valid(p_name, &error_string);
-	add_autoload->set_disabled(autoload_add_path->get_text().is_empty() || !is_name_valid);
+	add_autoload->set_disabled(!is_name_valid);
 	error_message->set_text(error_string);
 	error_message->set_visible(!autoload_add_name->get_text().is_empty() && !is_name_valid);
 }
@@ -540,6 +572,14 @@ void EditorAutoloadSettings::update_autoload() {
 	updating_autoload = false;
 }
 
+void EditorAutoloadSettings::_script_created(Ref<Script> p_script) {
+	FileSystemDock::get_singleton()->get_script_create_dialog()->hide();
+	path = p_script->get_path().get_base_dir();
+	autoload_add_path->set_text(p_script->get_path());
+	autoload_add_name->set_text(p_script->get_path().get_file().get_basename().capitalize().replace(" ", ""));
+	_autoload_add();
+}
+
 Variant EditorAutoloadSettings::get_drag_data_fw(const Point2 &p_point, Control *p_control) {
 	if (autoload_cache.size() <= 1) {
 		return false;
@@ -833,11 +873,6 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
 		}
 	}
 
-	autoload_changed = "autoload_changed";
-
-	updating_autoload = false;
-	selected_autoload = "";
-
 	HBoxContainer *hbc = memnew(HBoxContainer);
 	add_child(hbc);
 
@@ -854,6 +889,8 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
 	autoload_add_path = memnew(LineEdit);
 	hbc->add_child(autoload_add_path);
 	autoload_add_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	autoload_add_path->set_clear_button_enabled(true);
+	autoload_add_path->set_placeholder(vformat(TTR(R"(Set path or press "%s" to create a script.)"), TTR("Add")));
 	autoload_add_path->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed));
 
 	browse_button = memnew(Button);

+ 12 - 10
editor/editor_autoload_settings.h

@@ -47,7 +47,8 @@ class EditorAutoloadSettings : public VBoxContainer {
 		BUTTON_DELETE
 	};
 
-	String autoload_changed;
+	String path = "res://";
+	String autoload_changed = "autoload_changed";
 
 	struct AutoloadInfo {
 		String name;
@@ -64,17 +65,16 @@ class EditorAutoloadSettings : public VBoxContainer {
 
 	List<AutoloadInfo> autoload_cache;
 
-	bool updating_autoload;
-	int number_of_autoloads;
+	bool updating_autoload = false;
 	String selected_autoload;
 
-	Tree *tree;
-	LineEdit *autoload_add_name;
-	Button *add_autoload;
-	LineEdit *autoload_add_path;
-	Label *error_message;
-	Button *browse_button;
-	EditorFileDialog *file_dialog;
+	Tree *tree = nullptr;
+	LineEdit *autoload_add_name = nullptr;
+	Button *add_autoload = nullptr;
+	LineEdit *autoload_add_path = nullptr;
+	Label *error_message = nullptr;
+	Button *browse_button = nullptr;
+	EditorFileDialog *file_dialog = nullptr;
 
 	bool _autoload_name_is_valid(const String &p_name, String *r_error = nullptr);
 
@@ -90,6 +90,8 @@ class EditorAutoloadSettings : public VBoxContainer {
 	void _autoload_file_callback(const String &p_path);
 	Node *_create_autoload(const String &p_path);
 
+	void _script_created(Ref<Script> p_script);
+
 	Variant get_drag_data_fw(const Point2 &p_point, Control *p_control);
 	bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control) const;
 	void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control);

+ 4 - 0
editor/filesystem_dock.cpp

@@ -2087,6 +2087,10 @@ void FileSystemDock::focus_on_filter() {
 	}
 }
 
+ScriptCreateDialog *FileSystemDock::get_script_create_dialog() const {
+	return make_script_dialog;
+}
+
 void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) {
 	if (p_mode == file_list_display_mode) {
 		return;

+ 2 - 0
editor/filesystem_dock.h

@@ -320,6 +320,8 @@ public:
 	void navigate_to_path(const String &p_path);
 	void focus_on_filter();
 
+	ScriptCreateDialog *get_script_create_dialog() const;
+
 	void fix_dependencies(const String &p_for_file);
 
 	int get_split_offset() { return split_box->get_split_offset(); }