|
@@ -1714,105 +1714,112 @@ HashSet<StringName> EditorFileSystem::_get_scene_groups(const String &p_path) {
|
|
|
|
|
|
void EditorFileSystem::update_file(const String &p_file) {
|
|
|
ERR_FAIL_COND(p_file.is_empty());
|
|
|
- EditorFileSystemDirectory *fs = nullptr;
|
|
|
- int cpos = -1;
|
|
|
+ update_files({ p_file });
|
|
|
+}
|
|
|
|
|
|
- if (!_find_file(p_file, &fs, cpos)) {
|
|
|
- if (!fs) {
|
|
|
- return;
|
|
|
+void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
|
|
|
+ for (const String &file : p_script_paths) {
|
|
|
+ ERR_CONTINUE(file.is_empty());
|
|
|
+ EditorFileSystemDirectory *fs = nullptr;
|
|
|
+ int cpos = -1;
|
|
|
+
|
|
|
+ if (!_find_file(file, &fs, cpos)) {
|
|
|
+ if (!fs) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (!FileAccess::exists(p_file)) {
|
|
|
- //was removed
|
|
|
- _delete_internal_files(p_file);
|
|
|
- if (cpos != -1) { // Might've never been part of the editor file system (*.* files deleted in Open dialog).
|
|
|
- if (fs->files[cpos]->uid != ResourceUID::INVALID_ID) {
|
|
|
- if (ResourceUID::get_singleton()->has_id(fs->files[cpos]->uid)) {
|
|
|
- ResourceUID::get_singleton()->remove_id(fs->files[cpos]->uid);
|
|
|
+ if (!FileAccess::exists(file)) {
|
|
|
+ //was removed
|
|
|
+ _delete_internal_files(file);
|
|
|
+ if (cpos != -1) { // Might've never been part of the editor file system (*.* files deleted in Open dialog).
|
|
|
+ if (fs->files[cpos]->uid != ResourceUID::INVALID_ID) {
|
|
|
+ if (ResourceUID::get_singleton()->has_id(fs->files[cpos]->uid)) {
|
|
|
+ ResourceUID::get_singleton()->remove_id(fs->files[cpos]->uid);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- if (ClassDB::is_parent_class(fs->files[cpos]->type, SNAME("Script"))) {
|
|
|
- _queue_update_script_class(p_file);
|
|
|
- }
|
|
|
- if (fs->files[cpos]->type == SNAME("PackedScene")) {
|
|
|
- _queue_update_scene_groups(p_file);
|
|
|
+ if (ClassDB::is_parent_class(fs->files[cpos]->type, SNAME("Script"))) {
|
|
|
+ _queue_update_script_class(file);
|
|
|
+ }
|
|
|
+ if (fs->files[cpos]->type == SNAME("PackedScene")) {
|
|
|
+ _queue_update_scene_groups(file);
|
|
|
+ }
|
|
|
+
|
|
|
+ memdelete(fs->files[cpos]);
|
|
|
+ fs->files.remove_at(cpos);
|
|
|
}
|
|
|
|
|
|
- memdelete(fs->files[cpos]);
|
|
|
- fs->files.remove_at(cpos);
|
|
|
+ _update_pending_script_classes();
|
|
|
+ _update_pending_scene_groups();
|
|
|
+ call_deferred(SNAME("emit_signal"), "filesystem_changed"); //update later
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- _update_pending_script_classes();
|
|
|
- _update_pending_scene_groups();
|
|
|
- call_deferred(SNAME("emit_signal"), "filesystem_changed"); //update later
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- String type = ResourceLoader::get_resource_type(p_file);
|
|
|
- if (type.is_empty() && textfile_extensions.has(p_file.get_extension())) {
|
|
|
- type = "TextFile";
|
|
|
- }
|
|
|
- String script_class = ResourceLoader::get_resource_script_class(p_file);
|
|
|
+ String type = ResourceLoader::get_resource_type(file);
|
|
|
+ if (type.is_empty() && textfile_extensions.has(file.get_extension())) {
|
|
|
+ type = "TextFile";
|
|
|
+ }
|
|
|
+ String script_class = ResourceLoader::get_resource_script_class(file);
|
|
|
|
|
|
- ResourceUID::ID uid = ResourceLoader::get_resource_uid(p_file);
|
|
|
+ ResourceUID::ID uid = ResourceLoader::get_resource_uid(file);
|
|
|
|
|
|
- if (cpos == -1) {
|
|
|
- // The file did not exist, it was added.
|
|
|
- int idx = 0;
|
|
|
- String file_name = p_file.get_file();
|
|
|
+ if (cpos == -1) {
|
|
|
+ // The file did not exist, it was added.
|
|
|
+ int idx = 0;
|
|
|
+ String file_name = file.get_file();
|
|
|
|
|
|
- for (int i = 0; i < fs->files.size(); i++) {
|
|
|
- if (p_file.filenocasecmp_to(fs->files[i]->file) < 0) {
|
|
|
- break;
|
|
|
+ for (int i = 0; i < fs->files.size(); i++) {
|
|
|
+ if (file.filenocasecmp_to(fs->files[i]->file) < 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ idx++;
|
|
|
}
|
|
|
- idx++;
|
|
|
- }
|
|
|
|
|
|
- EditorFileSystemDirectory::FileInfo *fi = memnew(EditorFileSystemDirectory::FileInfo);
|
|
|
- fi->file = file_name;
|
|
|
- fi->import_modified_time = 0;
|
|
|
- fi->import_valid = type == "TextFile" ? true : ResourceLoader::is_import_valid(p_file);
|
|
|
+ EditorFileSystemDirectory::FileInfo *fi = memnew(EditorFileSystemDirectory::FileInfo);
|
|
|
+ fi->file = file_name;
|
|
|
+ fi->import_modified_time = 0;
|
|
|
+ fi->import_valid = type == "TextFile" ? true : ResourceLoader::is_import_valid(file);
|
|
|
|
|
|
- if (idx == fs->files.size()) {
|
|
|
- fs->files.push_back(fi);
|
|
|
+ if (idx == fs->files.size()) {
|
|
|
+ fs->files.push_back(fi);
|
|
|
+ } else {
|
|
|
+ fs->files.insert(idx, fi);
|
|
|
+ }
|
|
|
+ cpos = idx;
|
|
|
} else {
|
|
|
- fs->files.insert(idx, fi);
|
|
|
+ //the file exists and it was updated, and was not added in this step.
|
|
|
+ //this means we must force upon next restart to scan it again, to get proper type and dependencies
|
|
|
+ late_update_files.insert(file);
|
|
|
+ _save_late_updated_files(); //files need to be updated in the re-scan
|
|
|
}
|
|
|
- cpos = idx;
|
|
|
- } else {
|
|
|
- //the file exists and it was updated, and was not added in this step.
|
|
|
- //this means we must force upon next restart to scan it again, to get proper type and dependencies
|
|
|
- late_update_files.insert(p_file);
|
|
|
- _save_late_updated_files(); //files need to be updated in the re-scan
|
|
|
- }
|
|
|
|
|
|
- fs->files[cpos]->type = type;
|
|
|
- fs->files[cpos]->resource_script_class = script_class;
|
|
|
- fs->files[cpos]->uid = uid;
|
|
|
- fs->files[cpos]->script_class_name = _get_global_script_class(type, p_file, &fs->files[cpos]->script_class_extends, &fs->files[cpos]->script_class_icon_path);
|
|
|
- fs->files[cpos]->import_group_file = ResourceLoader::get_import_group_file(p_file);
|
|
|
- fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file);
|
|
|
- fs->files[cpos]->deps = _get_dependencies(p_file);
|
|
|
- fs->files[cpos]->import_valid = type == "TextFile" ? true : ResourceLoader::is_import_valid(p_file);
|
|
|
+ fs->files[cpos]->type = type;
|
|
|
+ fs->files[cpos]->resource_script_class = script_class;
|
|
|
+ fs->files[cpos]->uid = uid;
|
|
|
+ fs->files[cpos]->script_class_name = _get_global_script_class(type, file, &fs->files[cpos]->script_class_extends, &fs->files[cpos]->script_class_icon_path);
|
|
|
+ fs->files[cpos]->import_group_file = ResourceLoader::get_import_group_file(file);
|
|
|
+ fs->files[cpos]->modified_time = FileAccess::get_modified_time(file);
|
|
|
+ fs->files[cpos]->deps = _get_dependencies(file);
|
|
|
+ fs->files[cpos]->import_valid = type == "TextFile" ? true : ResourceLoader::is_import_valid(file);
|
|
|
|
|
|
- if (uid != ResourceUID::INVALID_ID) {
|
|
|
- if (ResourceUID::get_singleton()->has_id(uid)) {
|
|
|
- ResourceUID::get_singleton()->set_id(uid, p_file);
|
|
|
- } else {
|
|
|
- ResourceUID::get_singleton()->add_id(uid, p_file);
|
|
|
- }
|
|
|
+ if (uid != ResourceUID::INVALID_ID) {
|
|
|
+ if (ResourceUID::get_singleton()->has_id(uid)) {
|
|
|
+ ResourceUID::get_singleton()->set_id(uid, file);
|
|
|
+ } else {
|
|
|
+ ResourceUID::get_singleton()->add_id(uid, file);
|
|
|
+ }
|
|
|
|
|
|
- ResourceUID::get_singleton()->update_cache();
|
|
|
- }
|
|
|
- // Update preview
|
|
|
- EditorResourcePreview::get_singleton()->check_for_invalidation(p_file);
|
|
|
+ ResourceUID::get_singleton()->update_cache();
|
|
|
+ }
|
|
|
+ // Update preview
|
|
|
+ EditorResourcePreview::get_singleton()->check_for_invalidation(file);
|
|
|
|
|
|
- if (ClassDB::is_parent_class(fs->files[cpos]->type, SNAME("Script"))) {
|
|
|
- _queue_update_script_class(p_file);
|
|
|
- }
|
|
|
- if (fs->files[cpos]->type == SNAME("PackedScene")) {
|
|
|
- _queue_update_scene_groups(p_file);
|
|
|
+ if (ClassDB::is_parent_class(fs->files[cpos]->type, SNAME("Script"))) {
|
|
|
+ _queue_update_script_class(file);
|
|
|
+ }
|
|
|
+ if (fs->files[cpos]->type == SNAME("PackedScene")) {
|
|
|
+ _queue_update_scene_groups(file);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
_update_pending_script_classes();
|