Browse Source

Automatically display the installer after downloading an asset

- To make things easier to follow, display the asset name in
  confirmation dialogs.
- Display the number of conflicting files in the asset extraction dialog.

This reduces the number of clicks required to install an asset.

(cherry picked from commit 2708fcf13d611a9be6e15f6bd578b0f54d8bccbf)
Hugo Locurcio 4 years ago
parent
commit
9343ee5c2b

+ 30 - 8
editor/editor_asset_installer.cpp

@@ -112,7 +112,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
 
 	unzFile pkg = unzOpen2(p_path.utf8().get_data(), &io);
 	if (!pkg) {
-		error->set_text(TTR("Error opening package file, not in ZIP format."));
+		error->set_text(vformat(TTR("Error opening asset file for \"%s\" (not in ZIP format)."), asset_name));
 		return;
 	}
 
@@ -196,6 +196,8 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
 	root->set_editable(0, true);
 	Map<String, TreeItem *> dir_map;
 
+	int num_file_conflicts = 0;
+
 	for (Set<String>::Element *E = files_sorted.front(); E; E = E->next()) {
 		String path = E->get();
 		int depth = p_depth;
@@ -254,8 +256,9 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
 
 			String res_path = "res://" + path;
 			if (FileAccess::exists(res_path)) {
+				num_file_conflicts += 1;
 				ti->set_custom_color(0, get_color("error_color", "Editor"));
-				ti->set_tooltip(0, vformat(TTR("%s (Already Exists)"), res_path));
+				ti->set_tooltip(0, vformat(TTR("%s (already exists)"), res_path));
 				ti->set_checked(0, false);
 			} else {
 				ti->set_tooltip(0, res_path);
@@ -266,6 +269,13 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
 
 		status_map[E->get()] = ti;
 	}
+
+	if (num_file_conflicts >= 1) {
+		asset_contents->set_text(vformat(TTR("Contents of asset \"%s\" - %d file(s) conflict with your project:"), asset_name, num_file_conflicts));
+	} else {
+		asset_contents->set_text(vformat(TTR("Contents of asset \"%s\" - No files conflict with your project:"), asset_name));
+	}
+
 	popup_centered_ratio();
 	updating = false;
 }
@@ -276,7 +286,7 @@ void EditorAssetInstaller::ok_pressed() {
 
 	unzFile pkg = unzOpen2(package_path.utf8().get_data(), &io);
 	if (!pkg) {
-		error->set_text(TTR("Error opening package file, not in ZIP format."));
+		error->set_text(vformat(TTR("Error opening asset file for \"%s\" (not in ZIP format)."), asset_name));
 		return;
 	}
 
@@ -343,10 +353,10 @@ void EditorAssetInstaller::ok_pressed() {
 	unzClose(pkg);
 
 	if (failed_files.size()) {
-		String msg = TTR("The following files failed extraction from package:") + "\n\n";
+		String msg = vformat(TTR("The following files failed extraction from asset \"%s\":"), asset_name) + "\n\n";
 		for (int i = 0; i < failed_files.size(); i++) {
 			if (i > 15) {
-				msg += "\n" + vformat(TTR("And %s more files."), itos(failed_files.size() - i));
+				msg += "\n" + vformat(TTR("(and %s more files)"), itos(failed_files.size() - i));
 				break;
 			}
 			msg += failed_files[i];
@@ -356,12 +366,20 @@ void EditorAssetInstaller::ok_pressed() {
 		}
 	} else {
 		if (EditorNode::get_singleton() != nullptr) {
-			EditorNode::get_singleton()->show_warning(TTR("Package installed successfully!"), TTR("Success!"));
+			EditorNode::get_singleton()->show_warning(vformat(TTR("Asset \"%s\" installed successfully!"), asset_name), TTR("Success!"));
 		}
 	}
 	EditorFileSystem::get_singleton()->scan_changes();
 }
 
+void EditorAssetInstaller::set_asset_name(const String &p_asset_name) {
+	asset_name = p_asset_name;
+}
+
+String EditorAssetInstaller::get_asset_name() const {
+	return asset_name;
+}
+
 void EditorAssetInstaller::_bind_methods() {
 	ClassDB::bind_method("_item_edited", &EditorAssetInstaller::_item_edited);
 }
@@ -370,14 +388,18 @@ EditorAssetInstaller::EditorAssetInstaller() {
 	VBoxContainer *vb = memnew(VBoxContainer);
 	add_child(vb);
 
+	asset_contents = memnew(Label);
+	vb->add_child(asset_contents);
+
 	tree = memnew(Tree);
-	vb->add_margin_child(TTR("Package Contents:"), tree, true);
+	tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	tree->connect("item_edited", this, "_item_edited");
+	vb->add_child(tree);
 
 	error = memnew(AcceptDialog);
 	add_child(error);
 	get_ok()->set_text(TTR("Install"));
-	set_title(TTR("Package Installer"));
+	set_title(TTR("Asset Installer"));
 
 	updating = false;
 

+ 6 - 0
editor/editor_asset_installer.h

@@ -37,7 +37,9 @@ class EditorAssetInstaller : public ConfirmationDialog {
 	GDCLASS(EditorAssetInstaller, ConfirmationDialog);
 
 	Tree *tree;
+	Label *asset_contents;
 	String package_path;
+	String asset_name;
 	AcceptDialog *error;
 	Map<String, TreeItem *> status_map;
 	bool updating;
@@ -51,6 +53,10 @@ protected:
 
 public:
 	void open(const String &p_path, int p_depth = 0);
+
+	void set_asset_name(const String &p_asset_name);
+	String get_asset_name() const;
+
 	EditorAssetInstaller();
 };
 

+ 5 - 0
editor/plugins/asset_library_editor_plugin.cpp

@@ -374,6 +374,9 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int
 	progress->set_modulate(Color(0, 0, 0, 0));
 
 	set_process(false);
+
+	// Automatically prompt for installation once the download is completed.
+	_install();
 }
 
 void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asset_id, const Ref<Texture> &p_preview, const String &p_download_url, const String &p_sha256_hash) {
@@ -460,6 +463,7 @@ void EditorAssetLibraryItemDownload::_install() {
 		return;
 	}
 
+	asset_installer->set_asset_name(title->get_text());
 	asset_installer->open(file, 1);
 }
 
@@ -1276,6 +1280,7 @@ void EditorAssetLibrary::_asset_file_selected(const String &p_file) {
 	}
 
 	asset_installer = memnew(EditorAssetInstaller);
+	asset_installer->set_asset_name(p_file.get_basename());
 	add_child(asset_installer);
 	asset_installer->open(p_file);
 }