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

tools: reveal the selected resource when toggling tree/icon view

Daniele Bartolini 1 год назад
Родитель
Сommit
7b66f6cd97
1 измененных файлов с 53 добавлено и 2 удалено
  1. 53 2
      tools/level_editor/project_browser.vala

+ 53 - 2
tools/level_editor/project_browser.vala

@@ -619,14 +619,65 @@ public class ProjectBrowser : Gtk.Bin
 				_show_icon_view = !_show_icon_view;
 
 				if (_show_icon_view) {
+					// Save the currently selected resource and a path to its parent. Those will be
+					// used later, after the tree has been refiltered, to show the correct folder
+					// and reveal the selected resource in the icon view.
+					string? selected_type = null;
+					string? selected_name = null;
+					Gtk.TreePath? parent_path = null;
+					Gtk.TreeModel selected_model;
+					Gtk.TreeIter selected_iter;
+					if (_tree_selection.get_selected(out selected_model, out selected_iter)) {
+						Value val;
+						selected_model.get_value(selected_iter, ProjectStore.Column.TYPE, out val);
+						selected_type = (string)val;
+						selected_model.get_value(selected_iter, ProjectStore.Column.NAME, out val);
+						selected_name = (string)val;
+
+						if (selected_type != "<folder>") {
+							Gtk.TreeIter parent_iter;
+							if (selected_model.iter_parent(out parent_iter, selected_iter))
+								parent_path = _tree_view.model.get_path(parent_iter);
+						}
+					}
+
+					_tree_filter.refilter();
+
+					if (parent_path != null) {
+						_tree_selection.select_path(parent_path);
+						_icon_view.reveal(selected_type, selected_name);
+					}
+
 					_icon_view_content.show_all();
 					_toggle_icon_view.set_image(new Gtk.Image.from_icon_name("level-tree-symbolic", Gtk.IconSize.SMALL_TOOLBAR));
 				} else {
+					// Save the currently selected resource. This will be used later, after the tree
+					// has been refiltered, to reveal the selected resource in the tree view.
+					string? selected_type = null;
+					string? selected_name = null;
+					GLib.List<Gtk.TreePath> selected_paths = _icon_view.get_selected_items();
+					if (selected_paths.length() == 1u) {
+						Gtk.TreeIter selected_iter;
+						if (_icon_view._list_store.get_iter(out selected_iter, selected_paths.nth(0).data)) {
+							GLib.Value val;
+							_icon_view._list_store.get_value(selected_iter, ProjectIconView.Column.TYPE, out val);
+							selected_type = (string)val;
+							_icon_view._list_store.get_value(selected_iter, ProjectIconView.Column.NAME, out val);
+							selected_name = (string)val;
+						}
+					}
+
+					_tree_filter.refilter();
+
+					if (selected_type != null && selected_type != "<folder>") {
+						reveal(selected_type, selected_name);
+					}
+
 					_icon_view_content.hide();
 					_toggle_icon_view.set_image(new Gtk.Image.from_icon_name("browser-icon-view", Gtk.IconSize.SMALL_TOOLBAR));
-				}
 
-				_tree_filter.refilter();
+					_tree_view.queue_draw(); // It doesn't draw by itself sometimes...
+				}
 			});
 
 		// Create paned split-view.