Rework creating new folders in editor

This commit is contained in:
kobewi 2024-09-16 15:52:51 +02:00
parent a75bacebef
commit ad99c79472
6 changed files with 54 additions and 53 deletions

View File

@ -31,6 +31,7 @@
#include "directory_create_dialog.h" #include "directory_create_dialog.h"
#include "core/io/dir_access.h" #include "core/io/dir_access.h"
#include "editor/editor_file_system.h"
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/gui/editor_validation_panel.h" #include "editor/gui/editor_validation_panel.h"
#include "editor/themes/editor_scale.h" #include "editor/themes/editor_scale.h"
@ -100,15 +101,7 @@ void DirectoryCreateDialog::ok_pressed() {
const String error = _validate_path(path); const String error = _validate_path(path);
ERR_FAIL_COND_MSG(!error.is_empty(), error); ERR_FAIL_COND_MSG(!error.is_empty(), error);
Error err; Error err = EditorFileSystem::get_singleton()->make_dir_recursive(path, base_dir);
Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
err = da->change_dir(base_dir);
ERR_FAIL_COND_MSG(err != OK, "Cannot open directory '" + base_dir + "'.");
print_verbose("Making folder " + path + " in " + base_dir);
err = da->make_dir_recursive(path);
if (err == OK) { if (err == OK) {
emit_signal(SNAME("dir_created"), base_dir.path_join(path)); emit_signal(SNAME("dir_created"), base_dir.path_join(path));
} else { } else {

View File

@ -32,6 +32,7 @@
#include "core/config/project_settings.h" #include "core/config/project_settings.h"
#include "core/extension/gdextension_manager.h" #include "core/extension/gdextension_manager.h"
#include "core/io/dir_access.h"
#include "core/io/file_access.h" #include "core/io/file_access.h"
#include "core/io/resource_saver.h" #include "core/io/resource_saver.h"
#include "core/object/worker_thread_pool.h" #include "core/object/worker_thread_pool.h"
@ -3067,33 +3068,51 @@ void EditorFileSystem::move_group_file(const String &p_path, const String &p_new
} }
} }
void EditorFileSystem::add_new_directory(const String &p_path) { Error EditorFileSystem::make_dir_recursive(const String &p_path, const String &p_base_path) {
String path = p_path.get_base_dir(); Error err;
EditorFileSystemDirectory *parent = filesystem; Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
int base = p_path.count("/"); if (!p_base_path.is_empty()) {
int max_bit = base + 1; err = da->change_dir(p_base_path);
ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot open base directory '" + p_base_path + "'.");
while (path != "res://") {
EditorFileSystemDirectory *dir = get_filesystem_path(path);
if (dir) {
parent = dir;
break;
}
path = path.get_base_dir();
base--;
} }
for (int i = base; i < max_bit; i++) { if (da->dir_exists(p_path)) {
return ERR_ALREADY_EXISTS;
}
err = da->make_dir_recursive(p_path);
if (err != OK) {
return err;
}
const String path = da->get_current_dir();
EditorFileSystemDirectory *parent = get_filesystem_path(path);
ERR_FAIL_NULL_V(parent, ERR_FILE_NOT_FOUND);
const PackedStringArray folders = p_path.trim_prefix(path).trim_suffix("/").split("/");
bool first = true;
for (const String &folder : folders) {
const int current = parent->find_dir_index(folder);
if (current > -1) {
parent = parent->get_subdir(current);
continue;
}
EditorFileSystemDirectory *efd = memnew(EditorFileSystemDirectory); EditorFileSystemDirectory *efd = memnew(EditorFileSystemDirectory);
efd->parent = parent; efd->parent = parent;
efd->name = p_path.get_slice("/", i); efd->name = folder;
parent->subdirs.push_back(efd); parent->subdirs.push_back(efd);
if (i == base) { if (first) {
parent->subdirs.sort_custom<DirectoryComparator>(); parent->subdirs.sort_custom<DirectoryComparator>();
first = false;
} }
parent = efd; parent = efd;
} }
emit_signal(SNAME("filesystem_changed"));
return OK;
} }
ResourceUID::ID EditorFileSystem::_resource_saver_get_resource_id_for_path(const String &p_path, bool p_generate) { ResourceUID::ID EditorFileSystem::_resource_saver_get_resource_id_for_path(const String &p_path, bool p_generate) {

View File

@ -370,7 +370,7 @@ public:
bool is_group_file(const String &p_path) const; bool is_group_file(const String &p_path) const;
void move_group_file(const String &p_path, const String &p_new_path); void move_group_file(const String &p_path, const String &p_new_path);
void add_new_directory(const String &p_path); Error make_dir_recursive(const String &p_path, const String &p_base_path = String());
static bool _should_skip_directory(const String &p_path); static bool _should_skip_directory(const String &p_path);

View File

@ -647,8 +647,7 @@ void FileSystemDock::_notification(int p_what) {
} }
if (do_redraw) { if (do_redraw) {
_update_file_list(true); update_all();
_update_tree(get_uncollapsed_paths());
} }
if (EditorThemeManager::is_generated_theme_outdated()) { if (EditorThemeManager::is_generated_theme_outdated()) {
@ -1300,13 +1299,7 @@ void FileSystemDock::_fs_changed() {
scanning_vb->hide(); scanning_vb->hide();
split_box->show(); split_box->show();
if (tree->is_visible()) { update_all();
_update_tree(get_uncollapsed_paths());
}
if (file_list_vb->is_visible()) {
_update_file_list(true);
}
if (!select_after_scan.is_empty()) { if (!select_after_scan.is_empty()) {
_navigate_to_path(select_after_scan); _navigate_to_path(select_after_scan);
@ -1318,15 +1311,6 @@ void FileSystemDock::_fs_changed() {
set_process(false); set_process(false);
} }
void FileSystemDock::_directory_created(const String &p_path) {
if (!DirAccess::exists(p_path)) {
return;
}
EditorFileSystem::get_singleton()->add_new_directory(p_path);
_update_tree(get_uncollapsed_paths());
_update_file_list(true);
}
void FileSystemDock::_set_scanning_mode() { void FileSystemDock::_set_scanning_mode() {
button_hist_prev->set_disabled(true); button_hist_prev->set_disabled(true);
button_hist_next->set_disabled(true); button_hist_next->set_disabled(true);
@ -2697,6 +2681,16 @@ void FileSystemDock::fix_dependencies(const String &p_for_file) {
deps_editor->edit(p_for_file); deps_editor->edit(p_for_file);
} }
void FileSystemDock::update_all() {
if (tree->is_visible()) {
_update_tree(get_uncollapsed_paths());
}
if (file_list_vb->is_visible()) {
_update_file_list(true);
}
}
void FileSystemDock::focus_on_path() { void FileSystemDock::focus_on_path() {
current_path_line_edit->grab_focus(); current_path_line_edit->grab_focus();
current_path_line_edit->select_all(); current_path_line_edit->select_all();
@ -3118,9 +3112,7 @@ void FileSystemDock::_folder_color_index_pressed(int p_index, PopupMenu *p_menu)
} }
_update_folder_colors_setting(); _update_folder_colors_setting();
update_all();
_update_tree(get_uncollapsed_paths());
_update_file_list(true);
emit_signal(SNAME("folder_color_changed")); emit_signal(SNAME("folder_color_changed"));
} }
@ -3793,8 +3785,7 @@ void FileSystemDock::set_file_sort(FileSortOption p_file_sort) {
file_sort = p_file_sort; file_sort = p_file_sort;
// Update everything needed. // Update everything needed.
_update_tree(get_uncollapsed_paths()); update_all();
_update_file_list(true);
} }
void FileSystemDock::_file_sort_popup(int p_id) { void FileSystemDock::_file_sort_popup(int p_id) {
@ -4184,7 +4175,6 @@ FileSystemDock::FileSystemDock() {
make_dir_dialog = memnew(DirectoryCreateDialog); make_dir_dialog = memnew(DirectoryCreateDialog);
add_child(make_dir_dialog); add_child(make_dir_dialog);
make_dir_dialog->connect("dir_created", callable_mp(this, &FileSystemDock::_directory_created));
make_scene_dialog = memnew(SceneCreateDialog); make_scene_dialog = memnew(SceneCreateDialog);
add_child(make_scene_dialog); add_child(make_scene_dialog);

View File

@ -260,7 +260,6 @@ private:
void _toggle_file_display(); void _toggle_file_display();
void _set_file_display(bool p_active); void _set_file_display(bool p_active);
void _fs_changed(); void _fs_changed();
void _directory_created(const String &p_path);
void _select_file(const String &p_path, bool p_select_in_favorites = false); void _select_file(const String &p_path, bool p_select_in_favorites = false);
void _tree_activate_file(); void _tree_activate_file();
@ -405,6 +404,7 @@ public:
ScriptCreateDialog *get_script_create_dialog() const; ScriptCreateDialog *get_script_create_dialog() const;
void fix_dependencies(const String &p_for_file); void fix_dependencies(const String &p_for_file);
void update_all();
int get_h_split_offset() const { return split_box_offset_h; } int get_h_split_offset() const { return split_box_offset_h; }
void set_h_split_offset(int p_offset) { split_box_offset_h = p_offset; } void set_h_split_offset(int p_offset) { split_box_offset_h = p_offset; }

View File

@ -191,7 +191,6 @@ void EditorDirDialog::_make_dir_confirm(const String &p_path) {
} }
new_dir_path = p_path + "/"; new_dir_path = p_path + "/";
EditorFileSystem::get_singleton()->scan_changes(); // We created a dir, so rescan changes.
} }
void EditorDirDialog::_bind_methods() { void EditorDirDialog::_bind_methods() {