Browse Source

Removing a Resource also deletes imported files.

Andreas Haas 8 years ago
parent
commit
155402dc1b

+ 46 - 0
core/io/resource_import.cpp

@@ -199,6 +199,52 @@ String ResourceFormatImporter::get_internal_resource_path(const String &p_path)
 	return pat.path;
 }
 
+void ResourceFormatImporter::get_internal_resource_path_list(const String &p_path, List<String> *r_paths) {
+
+	Error err;
+	FileAccess *f = FileAccess::open(p_path + ".import", FileAccess::READ, &err);
+
+	if (!f)
+		return;
+
+	VariantParser::StreamFile stream;
+	stream.f = f;
+
+	String assign;
+	Variant value;
+	VariantParser::Tag next_tag;
+
+	int lines = 0;
+	String error_text;
+	while (true) {
+
+		assign = Variant();
+		next_tag.fields.clear();
+		next_tag.name = String();
+
+		err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, NULL, true);
+		if (err == ERR_FILE_EOF) {
+			memdelete(f);
+			return;
+		} else if (err != OK) {
+			ERR_PRINTS("ResourceFormatImporter::get_internal_resource_path_list - " + p_path + ".import:" + itos(lines) + " error: " + error_text);
+			memdelete(f);
+			return;
+		}
+
+		if (assign != String()) {
+			if (assign.begins_with("path.")) {
+				r_paths->push_back(value);
+			} else if (assign == "path") {
+				r_paths->push_back(value);
+			}
+		} else if (next_tag.name != "remap") {
+			break;
+		}
+	}
+	memdelete(f);
+}
+
 String ResourceFormatImporter::get_resource_type(const String &p_path) const {
 
 	PathAndType pat;

+ 1 - 0
core/io/resource_import.h

@@ -59,6 +59,7 @@ public:
 	virtual bool can_be_imported(const String &p_path) const;
 
 	String get_internal_resource_path(const String &p_path) const;
+	void get_internal_resource_path_list(const String &p_path, List<String> *r_paths);
 
 	void add_importer(const Ref<ResourceImporter> &p_importer) { importers.insert(p_importer); }
 	void remove_importer(const Ref<ResourceImporter> &p_importer) { importers.erase(p_importer); }

+ 15 - 0
editor/editor_file_system.cpp

@@ -339,6 +339,7 @@ bool EditorFileSystem::_update_scan_actions() {
 
 				int idx = ia.dir->find_file_index(ia.file);
 				ERR_CONTINUE(idx == -1);
+				_delete_internal_files(ia.dir->files[idx]->file);
 				memdelete(ia.dir->files[idx]);
 				ia.dir->files.remove(idx);
 
@@ -832,6 +833,19 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
 	}
 }
 
+void EditorFileSystem::_delete_internal_files(String p_file) {
+	if (FileAccess::exists(p_file + ".import")) {
+		List<String> paths;
+		ResourceFormatImporter::get_singleton()->get_internal_resource_path_list(p_file, &paths);
+		DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+		for (List<String>::Element *E = paths.front(); E; E = E->next()) {
+			da->remove(E->get());
+		}
+		da->remove(p_file + ".import");
+		memdelete(da);
+	}
+}
+
 void EditorFileSystem::_thread_func_sources(void *_userdata) {
 
 	EditorFileSystem *efs = (EditorFileSystem *)_userdata;
@@ -1186,6 +1200,7 @@ void EditorFileSystem::update_file(const String &p_file) {
 
 	if (!FileAccess::exists(p_file)) {
 		//was removed
+		_delete_internal_files(p_file);
 		memdelete(fs->files[cpos]);
 		fs->files.remove(cpos);
 		call_deferred("emit_signal", "filesystem_changed"); //update later

+ 2 - 0
editor/editor_file_system.h

@@ -168,6 +168,8 @@ class EditorFileSystem : public Node {
 
 	void _scan_fs_changes(EditorFileSystemDirectory *p_dir, const ScanProgress &p_progress);
 
+	void _delete_internal_files(String p_file);
+
 	Set<String> valid_extensions;
 	Set<String> import_extensions;