summaryrefslogtreecommitdiff
path: root/editor/editor_autoload_settings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/editor_autoload_settings.cpp')
-rw-r--r--editor/editor_autoload_settings.cpp113
1 files changed, 75 insertions, 38 deletions
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
index 281d614ea9..b37b06748d 100644
--- a/editor/editor_autoload_settings.cpp
+++ b/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"
@@ -52,7 +53,7 @@ void EditorAutoloadSettings::_notification(int p_what) {
file_dialog->add_filter("*." + E);
}
- for (const AutoLoadInfo &info : autoload_cache) {
+ for (const AutoloadInfo &info : autoload_cache) {
if (info.node && info.in_editor) {
get_tree()->get_root()->call_deferred(SNAME("add_child"), info.node);
}
@@ -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;
}
}
@@ -122,7 +145,7 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
for (const String &E : keywords) {
if (E == p_name) {
if (r_error) {
- *r_error = TTR("Invalid name.") + " " + TTR("Keyword cannot be used as an AutoLoad name.");
+ *r_error = TTR("Invalid name.") + " " + TTR("Keyword cannot be used as an Autoload name.");
}
return false;
@@ -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() {
@@ -227,7 +260,7 @@ void EditorAutoloadSettings::_autoload_edited() {
path = "*" + path;
}
- undo_redo->create_action(TTR("Toggle AutoLoad Globals"));
+ undo_redo->create_action(TTR("Toggle Autoload Globals"));
undo_redo->add_do_property(ProjectSettings::get_singleton(), base, path);
undo_redo->add_undo_property(ProjectSettings::get_singleton(), base, ProjectSettings::get_singleton()->get(base));
@@ -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);
}
@@ -378,13 +410,13 @@ Node *EditorAutoloadSettings::_create_autoload(const String &p_path) {
Object *obj = ClassDB::instantiate(ibt);
- ERR_FAIL_COND_V_MSG(!obj, nullptr, "Cannot instance script for AutoLoad, expected 'Node' inheritance, got: " + String(ibt) + ".");
+ ERR_FAIL_COND_V_MSG(!obj, nullptr, "Cannot instance script for Autoload, expected 'Node' inheritance, got: " + String(ibt) + ".");
n = Object::cast_to<Node>(obj);
n->set_script(script);
}
- ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in AutoLoad not a node or script: " + p_path + ".");
+ ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in Autoload not a node or script: " + p_path + ".");
return n;
}
@@ -396,10 +428,10 @@ void EditorAutoloadSettings::update_autoload() {
updating_autoload = true;
- Map<String, AutoLoadInfo> to_remove;
- List<AutoLoadInfo *> to_add;
+ Map<String, AutoloadInfo> to_remove;
+ List<AutoloadInfo *> to_add;
- for (const AutoLoadInfo &info : autoload_cache) {
+ for (const AutoloadInfo &info : autoload_cache) {
to_remove.insert(info.name, info);
}
@@ -423,7 +455,7 @@ void EditorAutoloadSettings::update_autoload() {
continue;
}
- AutoLoadInfo info;
+ AutoloadInfo info;
info.is_singleton = path.begins_with("*");
if (info.is_singleton) {
@@ -436,7 +468,7 @@ void EditorAutoloadSettings::update_autoload() {
bool need_to_add = true;
if (to_remove.has(name)) {
- AutoLoadInfo &old_info = to_remove[name];
+ AutoloadInfo &old_info = to_remove[name];
if (old_info.path == info.path) {
// Still the same resource, check status
info.node = old_info.node;
@@ -478,8 +510,8 @@ void EditorAutoloadSettings::update_autoload() {
}
// Remove deleted/changed autoloads
- for (KeyValue<String, AutoLoadInfo> &E : to_remove) {
- AutoLoadInfo &info = E.value;
+ for (KeyValue<String, AutoloadInfo> &E : to_remove) {
+ AutoloadInfo &info = E.value;
if (info.is_singleton) {
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
ScriptServer::get_language(i)->remove_named_global_constant(info.name);
@@ -500,7 +532,7 @@ void EditorAutoloadSettings::update_autoload() {
// Load new/changed autoloads
List<Node *> nodes_to_add;
- for (AutoLoadInfo *info : to_add) {
+ for (AutoloadInfo *info : to_add) {
info->node = _create_autoload(info->path);
ERR_CONTINUE(!info->node);
@@ -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;
@@ -632,8 +672,8 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
int order = ProjectSettings::get_singleton()->get_order("autoload/" + name);
- AutoLoadInfo aux;
- List<AutoLoadInfo>::Element *E = nullptr;
+ AutoloadInfo aux;
+ List<AutoloadInfo>::Element *E = nullptr;
if (!move_to_back) {
aux.order = order;
@@ -649,7 +689,7 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
for (int i = 0; i < autoloads.size(); i++) {
aux.order = ProjectSettings::get_singleton()->get_order("autoload/" + autoloads[i]);
- List<AutoLoadInfo>::Element *I = autoload_cache.find(aux);
+ List<AutoloadInfo>::Element *I = autoload_cache.find(aux);
if (move_to_back) {
autoload_cache.move_to_back(I);
@@ -664,7 +704,7 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
int i = 0;
- for (const AutoLoadInfo &F : autoload_cache) {
+ for (const AutoloadInfo &F : autoload_cache) {
orders.write[i++] = F.order;
}
@@ -676,7 +716,7 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
i = 0;
- for (const AutoLoadInfo &F : autoload_cache) {
+ for (const AutoloadInfo &F : autoload_cache) {
undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", "autoload/" + F.name, orders[i++]);
undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", "autoload/" + F.name, F.order);
}
@@ -697,18 +737,18 @@ bool EditorAutoloadSettings::autoload_add(const String &p_name, const String &p_
String error;
if (!_autoload_name_is_valid(name, &error)) {
- EditorNode::get_singleton()->show_warning(TTR("Can't add AutoLoad:") + "\n" + error);
+ EditorNode::get_singleton()->show_warning(TTR("Can't add Autoload:") + "\n" + error);
return false;
}
const String &path = p_path;
if (!FileAccess::exists(path)) {
- EditorNode::get_singleton()->show_warning(TTR("Can't add AutoLoad:") + "\n" + vformat(TTR("%s is an invalid path. File does not exist."), path));
+ EditorNode::get_singleton()->show_warning(TTR("Can't add Autoload:") + "\n" + vformat(TTR("%s is an invalid path. File does not exist."), path));
return false;
}
if (!path.begins_with("res://")) {
- EditorNode::get_singleton()->show_warning(TTR("Can't add AutoLoad:") + "\n" + vformat(TTR("%s is an invalid path. Not in resource path (res://)."), path));
+ EditorNode::get_singleton()->show_warning(TTR("Can't add Autoload:") + "\n" + vformat(TTR("%s is an invalid path. Not in resource path (res://)."), path));
return false;
}
@@ -716,7 +756,7 @@ bool EditorAutoloadSettings::autoload_add(const String &p_name, const String &p_
UndoRedo *undo_redo = EditorNode::get_undo_redo();
- undo_redo->create_action(TTR("Add AutoLoad"));
+ undo_redo->create_action(TTR("Add Autoload"));
// Singleton autoloads are represented with a leading "*" in their path.
undo_redo->add_do_property(ProjectSettings::get_singleton(), name, "*" + path);
@@ -791,7 +831,7 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
continue;
}
- AutoLoadInfo info;
+ AutoloadInfo info;
info.is_singleton = path.begins_with("*");
if (info.is_singleton) {
@@ -812,7 +852,7 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
autoload_cache.push_back(info);
}
- for (AutoLoadInfo &info : autoload_cache) {
+ for (AutoloadInfo &info : autoload_cache) {
info.node = _create_autoload(info.path);
if (info.node) {
@@ -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);
@@ -921,7 +958,7 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
}
EditorAutoloadSettings::~EditorAutoloadSettings() {
- for (const AutoLoadInfo &info : autoload_cache) {
+ for (const AutoloadInfo &info : autoload_cache) {
if (info.node && !info.in_editor) {
memdelete(info.node);
}