Add "Add Script" option to project autoload settings
This commit is contained in:
parent
d5076439e4
commit
073abe4b9c
@ -35,6 +35,7 @@
|
|||||||
#include "editor/editor_file_dialog.h"
|
#include "editor/editor_file_dialog.h"
|
||||||
#include "editor/editor_node.h"
|
#include "editor/editor_node.h"
|
||||||
#include "editor/editor_scale.h"
|
#include "editor/editor_scale.h"
|
||||||
|
#include "editor/filesystem_dock.h"
|
||||||
#include "project_settings_editor.h"
|
#include "project_settings_editor.h"
|
||||||
#include "scene/main/window.h"
|
#include "scene/main/window.h"
|
||||||
#include "scene/resources/packed_scene.h"
|
#include "scene/resources/packed_scene.h"
|
||||||
@ -63,6 +64,28 @@ void EditorAutoloadSettings::_notification(int p_what) {
|
|||||||
case NOTIFICATION_THEME_CHANGED: {
|
case NOTIFICATION_THEME_CHANGED: {
|
||||||
browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")));
|
browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")));
|
||||||
} break;
|
} 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,6 +157,15 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EditorAutoloadSettings::_autoload_add() {
|
void EditorAutoloadSettings::_autoload_add() {
|
||||||
|
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())) {
|
if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_text())) {
|
||||||
autoload_add_path->set_text("");
|
autoload_add_path->set_text("");
|
||||||
}
|
}
|
||||||
@ -141,6 +173,7 @@ void EditorAutoloadSettings::_autoload_add() {
|
|||||||
autoload_add_name->set_text("");
|
autoload_add_name->set_text("");
|
||||||
add_autoload->set_disabled(true);
|
add_autoload->set_disabled(true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EditorAutoloadSettings::_autoload_selected() {
|
void EditorAutoloadSettings::_autoload_selected() {
|
||||||
TreeItem *ti = tree->get_selected();
|
TreeItem *ti = tree->get_selected();
|
||||||
@ -351,14 +384,13 @@ void EditorAutoloadSettings::_autoload_text_submitted(const String p_name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EditorAutoloadSettings::_autoload_path_text_changed(const String p_path) {
|
void EditorAutoloadSettings::_autoload_path_text_changed(const String p_path) {
|
||||||
add_autoload->set_disabled(
|
add_autoload->set_disabled(!_autoload_name_is_valid(autoload_add_name->get_text(), nullptr));
|
||||||
p_path.is_empty() || !_autoload_name_is_valid(autoload_add_name->get_text(), nullptr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorAutoloadSettings::_autoload_text_changed(const String p_name) {
|
void EditorAutoloadSettings::_autoload_text_changed(const String p_name) {
|
||||||
String error_string;
|
String error_string;
|
||||||
bool is_name_valid = _autoload_name_is_valid(p_name, &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_text(error_string);
|
||||||
error_message->set_visible(!autoload_add_name->get_text().is_empty() && !is_name_valid);
|
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;
|
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) {
|
Variant EditorAutoloadSettings::get_drag_data_fw(const Point2 &p_point, Control *p_control) {
|
||||||
if (autoload_cache.size() <= 1) {
|
if (autoload_cache.size() <= 1) {
|
||||||
return false;
|
return false;
|
||||||
@ -833,11 +873,6 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
autoload_changed = "autoload_changed";
|
|
||||||
|
|
||||||
updating_autoload = false;
|
|
||||||
selected_autoload = "";
|
|
||||||
|
|
||||||
HBoxContainer *hbc = memnew(HBoxContainer);
|
HBoxContainer *hbc = memnew(HBoxContainer);
|
||||||
add_child(hbc);
|
add_child(hbc);
|
||||||
|
|
||||||
@ -854,6 +889,8 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
|
|||||||
autoload_add_path = memnew(LineEdit);
|
autoload_add_path = memnew(LineEdit);
|
||||||
hbc->add_child(autoload_add_path);
|
hbc->add_child(autoload_add_path);
|
||||||
autoload_add_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
|
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));
|
autoload_add_path->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed));
|
||||||
|
|
||||||
browse_button = memnew(Button);
|
browse_button = memnew(Button);
|
||||||
|
@ -47,7 +47,8 @@ class EditorAutoloadSettings : public VBoxContainer {
|
|||||||
BUTTON_DELETE
|
BUTTON_DELETE
|
||||||
};
|
};
|
||||||
|
|
||||||
String autoload_changed;
|
String path = "res://";
|
||||||
|
String autoload_changed = "autoload_changed";
|
||||||
|
|
||||||
struct AutoloadInfo {
|
struct AutoloadInfo {
|
||||||
String name;
|
String name;
|
||||||
@ -64,17 +65,16 @@ class EditorAutoloadSettings : public VBoxContainer {
|
|||||||
|
|
||||||
List<AutoloadInfo> autoload_cache;
|
List<AutoloadInfo> autoload_cache;
|
||||||
|
|
||||||
bool updating_autoload;
|
bool updating_autoload = false;
|
||||||
int number_of_autoloads;
|
|
||||||
String selected_autoload;
|
String selected_autoload;
|
||||||
|
|
||||||
Tree *tree;
|
Tree *tree = nullptr;
|
||||||
LineEdit *autoload_add_name;
|
LineEdit *autoload_add_name = nullptr;
|
||||||
Button *add_autoload;
|
Button *add_autoload = nullptr;
|
||||||
LineEdit *autoload_add_path;
|
LineEdit *autoload_add_path = nullptr;
|
||||||
Label *error_message;
|
Label *error_message = nullptr;
|
||||||
Button *browse_button;
|
Button *browse_button = nullptr;
|
||||||
EditorFileDialog *file_dialog;
|
EditorFileDialog *file_dialog = nullptr;
|
||||||
|
|
||||||
bool _autoload_name_is_valid(const String &p_name, String *r_error = 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);
|
void _autoload_file_callback(const String &p_path);
|
||||||
Node *_create_autoload(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);
|
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;
|
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);
|
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control);
|
||||||
|
@ -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) {
|
void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) {
|
||||||
if (p_mode == file_list_display_mode) {
|
if (p_mode == file_list_display_mode) {
|
||||||
return;
|
return;
|
||||||
|
@ -320,6 +320,8 @@ public:
|
|||||||
void navigate_to_path(const String &p_path);
|
void navigate_to_path(const String &p_path);
|
||||||
void focus_on_filter();
|
void focus_on_filter();
|
||||||
|
|
||||||
|
ScriptCreateDialog *get_script_create_dialog() const;
|
||||||
|
|
||||||
void fix_dependencies(const String &p_for_file);
|
void fix_dependencies(const String &p_for_file);
|
||||||
|
|
||||||
int get_split_offset() { return split_box->get_split_offset(); }
|
int get_split_offset() { return split_box->get_split_offset(); }
|
||||||
|
Loading…
Reference in New Issue
Block a user