Procházet zdrojové kódy

Make ResourceBrowser popover

Daniele Bartolini před 9 roky
rodič
revize
64730fd32c

+ 3 - 3
tools/level_editor/level_editor.vala

@@ -117,7 +117,7 @@ namespace Crown
 			{ "light",                null,  "Light",            null,             null, on_create_light     },
 			{ "menu-engine",          null,  "En_gine",          null,             null, null                },
 			{ "menu-view",            null,  "View",             null,             null, null                },
-			{ "resource-browser",     null,  "Resource Browser", null,             null, on_resource_browser },
+			{ "resource-browser",     null,  "Resource Browser", "<ctrl>P",        null, on_resource_browser },
 			{ "restart",              null,  "_Restart",         null,             null, on_engine_restart   },
 			{ "reload-lua",           null,  "Reload Lua",       "F7",             null, on_reload_lua       },
 			{ "menu-run",             null,  "_Run",             null,             null, null                },
@@ -312,10 +312,10 @@ namespace Crown
 			_file_filter.set_filter_name("Level (*.level)");
 			_file_filter.add_pattern("*.level");
 
-			_resource_browser = new ResourceBrowser(_source_dir, _bundle_dir);
+			_resource_browser = new ResourceBrowser(toolbar, _source_dir, _bundle_dir);
 			_resource_browser.resource_selected.connect(on_resource_browser_resource_selected);
-			_resource_browser.transient_for = this;
 			_resource_browser.delete_event.connect(() => { _resource_browser.hide(); return true; });
+			_resource_browser.modal = true;
 
 			this.destroy.connect(this.on_destroy);
 			this.delete_event.connect(this.on_delete_event);

+ 59 - 22
tools/level_editor/resource_browser.vala

@@ -7,7 +7,7 @@ using Gtk;
 
 namespace Crown
 {
-	public class ResourceBrowser : Gtk.Window
+	public class ResourceBrowser : Gtk.Popover
 	{
 		// Project paths
 		private string _source_dir;
@@ -22,6 +22,7 @@ namespace Crown
 		private Gtk.TreeStore _tree_store;
 		private Gtk.TreeModelFilter _tree_filter;
 		private Gtk.TreeView _tree_view;
+		private Gtk.TreeSelection _tree_selection;
 		private Gtk.ScrolledWindow _scrolled_window;
 		private Gtk.Box _box;
 
@@ -30,9 +31,9 @@ namespace Crown
 		// Signals
 		public signal void resource_selected(PlaceableType placeable_type, string name);
 
-		public ResourceBrowser(string source_dir, string bundle_dir)
+		public ResourceBrowser(Gtk.Widget parent, string source_dir, string bundle_dir)
 		{
-			this.title = "Resource Browser";
+			this.relative_to = parent;
 
 			// Project paths
 			_source_dir = source_dir;
@@ -47,6 +48,7 @@ namespace Crown
 			_filter_entry = new Gtk.SearchEntry();
 			_filter_entry.set_placeholder_text("Search...");
 			_filter_entry.changed.connect(on_filter_entry_text_changed);
+			_filter_entry.key_press_event.connect(on_filter_entry_key_pressed);
 
 			_tree_store = new Gtk.TreeStore(2, typeof(string), typeof(PlaceableType));
 			_tree_filter = new Gtk.TreeModelFilter(_tree_store, null);
@@ -59,6 +61,10 @@ namespace Crown
 			_tree_view.row_activated.connect(on_row_activated);
 			_tree_view.button_press_event.connect(on_button_pressed);
 
+			_tree_selection = _tree_view.get_selection();
+			_tree_selection.set_mode(Gtk.SelectionMode.BROWSE);
+			_tree_selection.changed.connect(on_tree_selection_changed);
+
 			_scrolled_window = new Gtk.ScrolledWindow(null, null);
 			_scrolled_window.add(_tree_view);
 			_scrolled_window.set_size_request(300, 400);
@@ -70,10 +76,8 @@ namespace Crown
 
 			_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
 			_box.pack_start(_filter_entry, false, false, 0);
-			_box.pack_start(_scrolled_window, false, false, 0);
 			_box.pack_start(_engine_view, true, true, 0);
-
-			resource_selected.connect(on_resource_selected);
+			_box.pack_start(_scrolled_window, false, false, 0);
 
 			add(_box);
 			set_size_request(300, 400);
@@ -90,6 +94,7 @@ namespace Crown
 				_tree_store.get_value(iter, 0, out name);
 				_tree_store.get_value(iter, 1, out type);
 				resource_selected((PlaceableType)type, (string)name);
+				this.hide();
 			}
 		}
 
@@ -113,6 +118,7 @@ namespace Crown
 						_tree_store.get_value(iter, 0, out name);
 						_tree_store.get_value(iter, 1, out type);
 						resource_selected((PlaceableType)type, (string)name);
+						this.hide();
 					}
 				}
 			}
@@ -164,19 +170,10 @@ namespace Crown
 
 		private void on_filter_entry_text_changed()
 		{
+			_tree_selection.changed.disconnect(on_tree_selection_changed);
 			_tree_filter.refilter();
-
-			Gtk.TreePath path = new Gtk.TreePath.from_string("0");
-			Gtk.TreePath child_path = _tree_filter.convert_path_to_child_path(path);
-			Gtk.TreeIter iter;
-			if (_tree_store.get_iter(out iter, child_path))
-			{
-				Value name;
-				Value type;
-				_tree_store.get_value(iter, 0, out name);
-				_tree_store.get_value(iter, 1, out type);
-				resource_selected((PlaceableType)type, (string)name);
-			}
+			_tree_selection.changed.connect(on_tree_selection_changed);
+			_tree_view.set_cursor(new Gtk.TreePath.first(), null, false);
 		}
 
 		private bool filter_tree(Gtk.TreeModel model, Gtk.TreeIter iter)
@@ -197,8 +194,7 @@ namespace Crown
 		private void walk_directory_tree()
 		{
 			_tree_view.model = null;
-			File file = File.new_for_path(_source_dir);
-			list_children(file);
+			list_children(File.new_for_path(_source_dir));
 			_tree_view.model = _tree_filter;
 		}
 
@@ -235,9 +231,50 @@ namespace Crown
 			}
 		}
 
-		private void on_resource_selected(PlaceableType placeable_type, string name)
+		private bool on_filter_entry_key_pressed(Gdk.EventKey ev)
+		{
+			Gtk.TreeModel model;
+			Gtk.TreeIter iter;
+			bool selected = _tree_selection.get_selected(out model, out iter);
+
+			if (ev.keyval == Gdk.Key.Down)
+			{
+				if (selected && model.iter_next(ref iter))
+					_tree_selection.select_iter(iter);
+			}
+			else if (ev.keyval == Gdk.Key.Up)
+			{
+				if (selected && model.iter_previous(ref iter))
+					_tree_selection.select_iter(iter);
+			}
+			else if (ev.keyval == 65293)
+			{
+				Value name;
+				Value type;
+				model.get_value(iter, 0, out name);
+				model.get_value(iter, 1, out type);
+				resource_selected((PlaceableType)type, (string)name);
+
+				this.hide();
+			}
+			else
+				return false;
+
+			return true;
+		}
+
+		private void on_tree_selection_changed()
 		{
-			_console_client.send_script(UnitPreviewAPI.set_preview_unit(placeable_type, name));
+			Gtk.TreeModel model;
+			Gtk.TreeIter iter;
+			if (_tree_selection.get_selected(out model, out iter))
+			{
+				Value name;
+				Value type;
+				model.get_value(iter, 0, out name);
+				model.get_value(iter, 1, out type);
+				_console_client.send_script(UnitPreviewAPI.set_preview_unit((PlaceableType)type, (string)name));
+			}
 		}
 	}
 }