Просмотр исходного кода

tools: add ability to delete files and folders from project browser

Daniele Bartolini 5 лет назад
Родитель
Сommit
2d776d4225

+ 20 - 0
tools/level_editor/project.vala

@@ -956,5 +956,25 @@ end
 
 			src.destroy();
 		}
+
+		public void delete_tree(GLib.File file) throws Error
+		{
+			GLib.FileEnumerator fe = file.enumerate_children("standard::*"
+				, GLib.FileQueryInfoFlags.NOFOLLOW_SYMLINKS
+				);
+
+			GLib.FileInfo info = null;
+			while ((info = fe.next_file()) != null)
+			{
+				GLib.File subfile = file.resolve_relative_path(info.get_name());
+
+				if (info.get_file_type() == GLib.FileType.DIRECTORY)
+					delete_tree(subfile);
+				else
+					subfile.delete();
+			}
+
+			file.delete();
+		}
 	}
 }

+ 60 - 15
tools/level_editor/project_browser.vala

@@ -187,18 +187,27 @@ namespace Crown
 					_tree_view.model.get_iter(out iter, path);
 
 					Value type;
+					Value name;
 					_tree_view.model.get_value(iter, ProjectStore.Column.TYPE, out type);
+					_tree_view.model.get_value(iter, ProjectStore.Column.NAME, out name);
 
 					if (type == "<folder>")
 					{
 						Gtk.Menu menu = new Gtk.Menu();
 						Gtk.MenuItem mi;
 
-						mi = new Gtk.MenuItem.with_label("New Folder...");
+						mi = new Gtk.MenuItem.with_label("Import...");
 						mi.activate.connect(() => {
-							Value name;
-							_tree_view.model.get_value(iter, ProjectStore.Column.NAME, out name);
+							GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)name);
+							_project.import(file.get_path(), (Gtk.Window)this.get_toplevel());
+						});
+						menu.add(mi);
 
+						mi = new Gtk.SeparatorMenuItem();
+						menu.add(mi);
+
+						mi = new Gtk.MenuItem.with_label("New Folder...");
+						mi.activate.connect(() => {
 							Gtk.Dialog dg = new Gtk.Dialog.with_buttons("Folder Name"
 								, null
 								, DialogFlags.MODAL
@@ -217,9 +226,9 @@ namespace Crown
 
 							if (dg.run() == (int)ResponseType.OK)
 							{
+								GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)name, sb.text);
 								try
 								{
-									GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)name, sb.text);
 									file.make_directory();
 								}
 								catch (Error e)
@@ -232,24 +241,60 @@ namespace Crown
 						});
 						menu.add(mi);
 
-						mi = new Gtk.MenuItem.with_label("Import...");
-						mi.activate.connect(() => {
-							Value name;
-							_tree_view.model.get_value(iter, ProjectStore.Column.NAME, out name);
-
-							GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)name);
-							_project.import(file.get_path(), (Gtk.Window)this.get_toplevel());
-						});
-						menu.add(mi);
+						if ((string)name != ProjectStore.ROOT_FOLDER)
+						{
+							mi = new Gtk.MenuItem.with_label("Delete Folder");
+							mi.activate.connect(() => {
+								Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)this.get_toplevel()
+									, Gtk.DialogFlags.MODAL
+									, Gtk.MessageType.WARNING
+									, Gtk.ButtonsType.NONE
+									, "Delete Folder " + (string)name + "?"
+									);
+								md.add_button("_Cancel", ResponseType.CANCEL);
+								md.add_button("_Delete", ResponseType.YES);
+								md.set_default_response(ResponseType.CANCEL);
+								int rt = md.run();
+								md.destroy();
+
+								if (rt == (int)ResponseType.CANCEL)
+									return;
+
+								GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)name);
+								try
+								{
+									_project.delete_tree(file);
+								}
+								catch (Error e)
+								{
+									// _console_view.loge("editor", e.message);
+								}
+							});
+							menu.add(mi);
+						}
 
 						menu.show_all();
 						menu.popup(null, null, null, ev.button, ev.time);
 					}
-					else
+					else // If file
 					{
 						Gtk.Menu menu = new Gtk.Menu();
 						Gtk.MenuItem mi;
 
+						mi = new Gtk.MenuItem.with_label("Delete File");
+						mi.activate.connect(() => {
+							GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)name + "." + (string)type);
+							try
+							{
+								file.delete();
+							}
+							catch (Error e)
+							{
+								// _console_view.loge("editor", e.message);
+							}
+						});
+						menu.add(mi);
+
 						mi = new Gtk.MenuItem.with_label("Open Containing Folder...");
 						mi.activate.connect(() => {
 							Gtk.TreeIter parent;
@@ -258,9 +303,9 @@ namespace Crown
 								Value parent_name;
 								_tree_view.model.get_value(parent, ProjectStore.Column.NAME, out parent_name);
 
+								GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)parent_name);
 								try
 								{
-									GLib.File file = GLib.File.new_build_filename(_project.source_dir(), (string)parent_name);
 									GLib.AppInfo.launch_default_for_uri("file://" + file.get_path(), null);
 								}
 								catch (Error e)

+ 20 - 7
tools/level_editor/project_store.vala

@@ -10,6 +10,8 @@ namespace Crown
 {
 	public class ProjectStore
 	{
+		public const string ROOT_FOLDER = "";
+
 		public enum Column
 		{
 			NAME,
@@ -59,7 +61,7 @@ namespace Crown
 				, null
 				, -1
 				, Column.NAME
-				, ""
+				, ROOT_FOLDER
 				, Column.TYPE
 				, "<folder>"
 				, Column.SEGMENT
@@ -67,14 +69,14 @@ namespace Crown
 				, -1
 				);
 
-			_folders[""] = new Gtk.TreeRowReference(_tree_store, _tree_store.get_path(iter));
+			_folders[ROOT_FOLDER] = new Gtk.TreeRowReference(_tree_store, _tree_store.get_path(iter));
 		}
 
 		private string folder(string name)
 		{
 			int last_slash = name.last_index_of_char('/');
 			if (last_slash == -1)
-				return "";
+				return ROOT_FOLDER;
 			return name.substring(0, last_slash);
 		}
 
@@ -148,12 +150,12 @@ namespace Crown
 		{
 			if (_folders.has_key(folder))
 			{
-				Gtk.TreeIter parent_iter;
-				_tree_store.get_iter(out parent_iter, _folders[folder].get_path());
-				return parent_iter;
+				Gtk.TreeIter iter;
+				_tree_store.get_iter(out iter, _folders[folder].get_path());
+				return iter;
 			}
 
-			return make_tree_internal(folder, 0, _folders[""]);
+			return make_tree_internal(folder, 0, _folders[ROOT_FOLDER]);
 		}
 
 		private void on_project_file_added(string type, string name)
@@ -242,6 +244,17 @@ namespace Crown
 
 		private void on_project_tree_removed(string name)
 		{
+			if (name == ROOT_FOLDER)
+				return;
+
+			if (!_folders.has_key(name))
+				return;
+
+			Gtk.TreeIter iter;
+			_tree_store.get_iter(out iter, _folders[name].get_path());
+			_tree_store.remove(ref iter);
+
+			_folders.unset(name);
 		}
 
 	}