瀏覽代碼

tools: decouple ProjectBrowser from Project

Daniele Bartolini 2 年之前
父節點
當前提交
49b4f54fc8
共有 3 個文件被更改,包括 93 次插入51 次删除
  1. 72 15
      tools/level_editor/level_editor.vala
  2. 19 34
      tools/level_editor/project_browser.vala
  3. 2 2
      tools/widgets/resource_chooser_button.vala

+ 72 - 15
tools/level_editor/level_editor.vala

@@ -333,17 +333,17 @@ public class LevelEditorApplication : Gtk.Application
 
 	private const GLib.ActionEntry[] action_entries_create =
 	{
-		{ "menu-create",        null,                null, null },
-		{ "menu-primitives",    null,                null, null },
-		{ "primitive-cube",     on_create_primitive, null, null },
-		{ "primitive-sphere",   on_create_primitive, null, null },
-		{ "primitive-cone",     on_create_primitive, null, null },
-		{ "primitive-cylinder", on_create_primitive, null, null },
-		{ "primitive-plane",    on_create_primitive, null, null },
-		{ "camera",             on_create_primitive, null, null },
-		{ "light",              on_create_primitive, null, null },
-		{ "sound-source",       on_create_primitive, null, null },
-		{ "unit-empty",         on_create_unit,      null, null }
+		{ "menu-create",        null,               null, null },
+		{ "menu-primitives",    null,               null, null },
+		{ "primitive-cube",     on_spawn_primitive, null, null },
+		{ "primitive-sphere",   on_spawn_primitive, null, null },
+		{ "primitive-cone",     on_spawn_primitive, null, null },
+		{ "primitive-cylinder", on_spawn_primitive, null, null },
+		{ "primitive-plane",    on_spawn_primitive, null, null },
+		{ "camera",             on_spawn_primitive, null, null },
+		{ "light",              on_spawn_primitive, null, null },
+		{ "sound-source",       on_spawn_primitive, null, null },
+		{ "unit-empty",         on_spawn_unit,      null, null }
 	};
 
 	private const GLib.ActionEntry[] action_entries_camera =
@@ -388,7 +388,12 @@ public class LevelEditorApplication : Gtk.Application
 
 	private const GLib.ActionEntry[] action_entries_project =
 	{
-		{ "delete-file", on_delete_file, "s", null }
+		{ "delete-file",      on_delete_file,      "s",     null },
+		{ "delete-directory", on_delete_directory, "s",     null },
+		{ "create-directory", on_create_directory, "(ss)",  null },
+		{ "create-script",    on_create_script,    "(ssb)", null },
+		{ "create-unit",      on_create_unit,      "(ss)",  null },
+		{ "open-containing",  on_open_containing,  "s",     null }
 	};
 
 	// Command line options
@@ -664,7 +669,7 @@ public class LevelEditorApplication : Gtk.Application
 		_combo.set_active_id("editor");
 
 		_console_view = new ConsoleView(_project, _combo, _preferences_dialog);
-		_project_browser = new ProjectBrowser(this, _project, _project_store);
+		_project_browser = new ProjectBrowser(_project_store);
 		_level_treeview = new LevelTreeView(_database, _level);
 		_level_layers_treeview = new LevelLayersTreeView(_database, _level);
 		_properties_view = new PropertiesView(_level, _project_store);
@@ -2136,7 +2141,7 @@ public class LevelEditorApplication : Gtk.Application
 		dg.destroy();
 	}
 
-	private void on_create_primitive(GLib.SimpleAction action, GLib.Variant? param)
+	private void on_spawn_primitive(GLib.SimpleAction action, GLib.Variant? param)
 	{
 		if (action.name == "primitive-cube")
 			set_placeable("unit", "core/units/primitives/cube");
@@ -2158,7 +2163,7 @@ public class LevelEditorApplication : Gtk.Application
 		activate_action("tool", new GLib.Variant.int32(ToolType.PLACE));
 	}
 
-	private void on_create_unit(GLib.SimpleAction action, GLib.Variant? param)
+	private void on_spawn_unit(GLib.SimpleAction action, GLib.Variant? param)
 	{
 		_level.spawn_empty_unit();
 		_editor.send(DeviceApi.frame());
@@ -2426,6 +2431,58 @@ public class LevelEditorApplication : Gtk.Application
 		}
 	}
 
+	private void on_delete_directory(GLib.SimpleAction action, GLib.Variant? param)
+	{
+		string dir_name = param.get_string();
+
+		var path = GLib.Path.build_filename(_project.source_dir(), dir_name);
+		try {
+			_project.delete_tree(GLib.File.new_for_path(path));
+		} catch (Error e) {
+			loge(e.message);
+		}
+	}
+
+	private void on_create_directory(GLib.SimpleAction action, GLib.Variant? param)
+	{
+		string parent_dir_name = (string)param.get_child_value(0);
+		string dir_name = (string)param.get_child_value(1);
+
+		logi("parent_dir_name %s dir_name %s".printf(parent_dir_name, dir_name));
+
+		var path = GLib.Path.build_filename(_project.source_dir(), parent_dir_name, dir_name);
+		try {
+			GLib.File.new_for_path(path).make_directory();
+		} catch (Error e) {
+			loge(e.message);
+		}
+	}
+
+	private void on_create_script(GLib.SimpleAction action, GLib.Variant? param)
+	{
+		string dir_name = (string)param.get_child_value(0);
+		string script_name = (string)param.get_child_value(1);
+		bool empty = (bool)param.get_child_value(2);
+
+		_project.create_script(dir_name, script_name, empty);
+	}
+
+	private void on_create_unit(GLib.SimpleAction action, GLib.Variant? param)
+	{
+		string dir_name = (string)param.get_child_value(0);
+		string unit_name = (string)param.get_child_value(1);
+
+		_project.create_unit(dir_name, unit_name);
+	}
+
+	private void on_open_containing(GLib.SimpleAction action, GLib.Variant? param)
+	{
+		string parent_name = param.get_string();
+
+		var path = GLib.Path.build_filename(_project.source_dir(), parent_name);
+		open_directory(GLib.File.new_for_path(path).get_path());
+	}
+
 	public void set_autosave_timer(uint minutes)
 	{
 		if (_save_timer_id > 0)

+ 19 - 34
tools/level_editor/project_browser.vala

@@ -20,7 +20,6 @@ private bool row_should_be_hidden(string type, string name)
 public class ProjectBrowser : Gtk.Box
 {
 	// Data
-	public Project _project;
 	public ProjectStore _project_store;
 
 	// Widgets
@@ -33,12 +32,11 @@ public class ProjectBrowser : Gtk.Box
 	// Signals
 	public signal void resource_selected(string type, string name);
 
-	public ProjectBrowser(Gtk.Application app, Project? project, ProjectStore project_store)
+	public ProjectBrowser(ProjectStore project_store)
 	{
 		Object(orientation: Gtk.Orientation.VERTICAL, spacing: 0);
 
 		// Data
-		_project = project;
 		_project_store = project_store;
 
 		// Widgets
@@ -177,18 +175,15 @@ public class ProjectBrowser : Gtk.Box
 		// Actions.
 		GLib.ActionEntry[] action_entries =
 		{
-			{ "project-browser-reveal", on_reveal, "s", null }
+			{ "reveal-resource", on_reveal, "(ss)", null }
 		};
-		app.add_action_entries(action_entries, this);
+		GLib.Application.get_default().add_action_entries(action_entries, this);
 	}
 
 	private void on_reveal(GLib.SimpleAction action, GLib.Variant? param)
 	{
-		string resource_path = param.get_string();
-		string? type = resource_type(resource_path);
-		string? name = resource_name(type, resource_path);
-		if (type == null || name == null)
-			return;
+		string type = (string)param.get_child_value(0);
+		string name = (string)param.get_child_value(1);
 
 		Gtk.TreePath store_path;
 		if (_project_store.path_for_resource_type_name(out store_path, type, name)) {
@@ -223,8 +218,7 @@ public class ProjectBrowser : Gtk.Box
 
 					mi = new Gtk.MenuItem.with_label("Import...");
 					mi.activate.connect(() => {
-							Gtk.Application app = ((Gtk.Window)this.get_toplevel()).application;
-							app.activate_action("import", new GLib.Variant.string((string)name));
+							GLib.Application.get_default().activate_action("import", new GLib.Variant.string((string)name));
 						});
 					menu.add(mi);
 
@@ -255,7 +249,8 @@ public class ProjectBrowser : Gtk.Box
 									return;
 								}
 
-								_project.create_script((string)name, sb.text, true);
+								var tuple = new GLib.Variant.tuple({(string)name, sb.text, true});
+								GLib.Application.get_default().activate_action("create-script", tuple);
 							}
 
 							dg.destroy();
@@ -286,7 +281,8 @@ public class ProjectBrowser : Gtk.Box
 									return;
 								}
 
-								_project.create_script((string)name, sb.text, false);
+								var tuple = new GLib.Variant.tuple({(string)name, sb.text, false});
+								GLib.Application.get_default().activate_action("create-script", tuple);
 							}
 
 							dg.destroy();
@@ -319,10 +315,11 @@ public class ProjectBrowser : Gtk.Box
 									dg.destroy();
 									return;
 								}
-
-								_project.create_unit((string)name, sb.text);
 							}
 
+							var tuple = new GLib.Variant.tuple({(string)name, sb.text});
+							GLib.Application.get_default().activate_action("create-unit", tuple);
+
 							dg.destroy();
 						});
 					menu.add(mi);
@@ -354,12 +351,8 @@ public class ProjectBrowser : Gtk.Box
 									return;
 								}
 
-								GLib.File file = GLib.File.new_for_path(GLib.Path.build_filename(_project.source_dir(), (string)name, sb.text));
-								try {
-									file.make_directory();
-								} catch (Error e) {
-									loge(e.message);
-								}
+								var tuple = new GLib.Variant.tuple({(string)name, sb.text});
+								GLib.Application.get_default().activate_action("create-directory", tuple);
 							}
 
 							dg.destroy();
@@ -389,12 +382,7 @@ public class ProjectBrowser : Gtk.Box
 								if (rt != (int)ResponseType.YES)
 									return;
 
-								GLib.File file = GLib.File.new_for_path(GLib.Path.build_filename(_project.source_dir(), (string)name));
-								try {
-									_project.delete_tree(file);
-								} catch (Error e) {
-									loge(e.message);
-								}
+								GLib.Application.get_default().activate_action("delete-directory", new GLib.Variant.string((string)name));
 							});
 						menu.add(mi);
 					}
@@ -407,8 +395,7 @@ public class ProjectBrowser : Gtk.Box
 
 					mi = new Gtk.MenuItem.with_label("Delete File");
 					mi.activate.connect(() => {
-							Gtk.Application app = ((Gtk.Window)this.get_toplevel()).application;
-							app.activate_action("delete-file", new GLib.Variant.string(resource_path((string)type, (string)name)));
+							GLib.Application.get_default().activate_action("delete-file", new GLib.Variant.string(resource_path((string)type, (string)name)));
 						});
 					menu.add(mi);
 
@@ -419,8 +406,7 @@ public class ProjectBrowser : Gtk.Box
 								Value parent_name;
 								_tree_view.model.get_value(parent, ProjectStore.Column.NAME, out parent_name);
 
-								GLib.File file = GLib.File.new_for_path(GLib.Path.build_filename(_project.source_dir(), (string)parent_name));
-								open_directory(file.get_path());
+								GLib.Application.get_default().activate_action("open-containing", new GLib.Variant.string((string)parent_name));
 							}
 						});
 					menu.add(mi);
@@ -444,8 +430,7 @@ public class ProjectBrowser : Gtk.Box
 					Value name;
 					_tree_view.model.get_value(iter, ProjectStore.Column.NAME, out name);
 
-					Gtk.Application app = ((Gtk.Window)this.get_toplevel()).application;
-					app.activate_action("open-resource", resource_path((string)type, (string)name));
+					GLib.Application.get_default().activate_action("open-resource", resource_path((string)type, (string)name));
 				}
 			}
 		}

+ 2 - 2
tools/widgets/resource_chooser_button.vala

@@ -97,8 +97,8 @@ public class ResourceChooserButton : Gtk.Box
 
 	private void on_revealer_clicked()
 	{
-		Gtk.Application app = ((Gtk.Window)this.get_toplevel()).application;
-		app.activate_action("project-browser-reveal", new GLib.Variant.string(_name.text + "." + _type));
+		var tuple = new GLib.Variant.tuple({_type, _name.text});
+		GLib.Application.get_default().activate_action("reveal-resource", tuple);
 	}
 
 	private bool type_filter(string type, string name)