[anjuta] project-manager: Select the right node in the dialogs's project view



commit 6007850bdb51cab2872fc2d0dae23d963c35d08f
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Sat Jan 15 08:42:19 2011 +0100

    project-manager: Select the right node in the dialogs's project view

 plugins/project-manager/dialogs.c       |  100 ++++++++++++-----------------
 plugins/project-manager/project-model.c |  104 ++++++++++++++++++++----------
 plugins/project-manager/project-model.h |    2 +-
 plugins/project-manager/project-view.c  |  106 ++++++++++++++++++++++++++++++-
 plugins/project-manager/project-view.h  |   10 +++
 5 files changed, 227 insertions(+), 95 deletions(-)
---
diff --git a/plugins/project-manager/dialogs.c b/plugins/project-manager/dialogs.c
index eae7810..37955fb 100644
--- a/plugins/project-manager/dialogs.c
+++ b/plugins/project-manager/dialogs.c
@@ -207,14 +207,14 @@ module_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 	GbfTreeData *data = NULL;
 	gboolean visible = FALSE;
 	AnjutaProjectNode *node;
-
+	
 	gtk_tree_model_get (model, iter,
 						GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
 	node = data == NULL ? NULL : gbf_tree_data_get_node (data);
 	if (node != NULL)
 	{
 		AnjutaProjectNodeType type = anjuta_project_node_get_node_type (node);
-		
+
 		visible = (type == ANJUTA_PROJECT_MODULE) || (type == ANJUTA_PROJECT_PACKAGE);
 	}
 	
@@ -222,57 +222,19 @@ module_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 }
 
 static void 
-setup_nodes_treeview (GbfProjectModel         *model,
-						GtkWidget              *view,
+setup_nodes_treeview (GbfProjectView           *view,
+						GbfProjectView		   *parent,
+                  	    GtkTreePath            *root,
 						GtkTreeModelFilterVisibleFunc func,
 						gpointer               data,
 						GtkTreeIter            *selected)
 {
-	GtkTreeModel *filter;
-	GtkTreeIter iter_filter;
-	GtkTreePath *path;
-
-	g_return_if_fail (model != NULL);
 	g_return_if_fail (view != NULL && GBF_IS_PROJECT_VIEW (view));
+	g_return_if_fail (parent != NULL);
 
-	filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (model), NULL);
-	gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
-											func, data, NULL);
-	gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (filter));
-	g_object_unref (filter);
-
-	/* select default node */
-	if (selected && gtk_tree_model_filter_convert_child_iter_to_iter (
-			GTK_TREE_MODEL_FILTER (filter), &iter_filter, selected))
-	{
-		path = gtk_tree_model_get_path (filter, &iter_filter);
-		gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path);
-	}
-	else
-	{
-		GtkTreePath *root_path;
-
-		gtk_tree_view_expand_all (GTK_TREE_VIEW (view));
-		root_path = gbf_project_model_get_project_root (model);
-		if (root_path)
-		{
-			path = gtk_tree_model_filter_convert_child_path_to_path (
-						GTK_TREE_MODEL_FILTER (filter), root_path);
-			gtk_tree_path_free (root_path);
-		}
-		else
-		{
-			path = gtk_tree_path_new_first ();
-		}
-	}
-
-	if (path)
-	{
-		gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, NULL, FALSE);
-		gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), path, NULL,
-									TRUE, 0.5, 0.0);
-		gtk_tree_path_free (path);
-	}
+	gbf_project_view_set_parent_view (view, parent, root);
+	gbf_project_view_set_visible_func (view, func, data, NULL);
+	gbf_project_view_set_cursor_to_iter (view, selected);
 }
 
 static void
@@ -798,8 +760,9 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	g_object_unref (bxml);
 
 	/* Add tree view */
-	setup_nodes_treeview (gbf_project_view_get_model (view),
-							node_view,
+	setup_nodes_treeview (GBF_PROJECT_VIEW (node_view),
+	                        view,
+	                        NULL,
 							is_project_node_but_shortcut,
 							NULL,
 							selected);
@@ -900,6 +863,7 @@ anjuta_pm_project_new_group (ProjectManagerPlugin *plugin, GtkWindow *parent, Gt
 	GtkBuilder *gui;
 	GtkWidget *dialog, *group_name_entry, *ok_button;
 	GtkWidget *groups_view;
+	GtkTreePath *root;
 	gint response;
 	gboolean finished = FALSE;
 	AnjutaProjectNode *new_group = NULL;
@@ -926,11 +890,14 @@ anjuta_pm_project_new_group (ProjectManagerPlugin *plugin, GtkWindow *parent, Gt
 	else
 		gtk_widget_set_sensitive (ok_button, FALSE);
 
-	setup_nodes_treeview (gbf_project_view_get_model (plugin->view),
-							groups_view,
+	root = gbf_project_model_get_project_root (gbf_project_view_get_model (plugin->view));
+	setup_nodes_treeview (GBF_PROJECT_VIEW (groups_view),
+	                        plugin->view,
+	                      	root,
 							parent_filter_func,
 							GINT_TO_POINTER (ANJUTA_PROJECT_GROUP),
 							selected);
+	gtk_tree_path_free (root);
 	gtk_widget_show (groups_view);
 
 	if (parent)
@@ -1041,6 +1008,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 	GtkTreeViewColumn* column_filename;
 	GList* new_sources = NULL;
 	GList* uri_node;
+	GtkTreePath *root;
 
 	g_return_val_if_fail (plugin->project != NULL, NULL);
 
@@ -1098,11 +1066,14 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 	/*project_root = g_file_get_uri (anjuta_project_node_get_file (anjuta_pm_project_get_root (project)));
 	g_object_set_data_full (G_OBJECT (browse_button), "root", project_root, g_free);*/
 
-	setup_nodes_treeview (gbf_project_view_get_model (plugin->view),
-							targets_view,
+	root = gbf_project_model_get_project_root_group (gbf_project_view_get_model (plugin->view));
+	setup_nodes_treeview (GBF_PROJECT_VIEW (targets_view),
+	                        plugin->view,
+	                       	root,
 							parent_filter_func,
 							GINT_TO_POINTER (ANJUTA_PROJECT_SOURCE),
 							default_parent);
+	gtk_tree_path_free (root);
 	gtk_widget_show (targets_view);
 
 	if (top_window) {
@@ -1275,6 +1246,7 @@ anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
 	GtkBuilder *gui;
 	GtkWidget *dialog, *target_name_entry, *ok_button;
 	GtkWidget *target_type_combo, *groups_view;
+	GtkTreePath *root;
 	GtkListStore *types_store;
 	GtkCellRenderer *renderer;
 	gint response;
@@ -1304,11 +1276,14 @@ anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
 	else
 		gtk_widget_set_sensitive (ok_button, FALSE);
 
-	setup_nodes_treeview (gbf_project_view_get_model (plugin->view),
-							groups_view,
+	root = gbf_project_model_get_project_root_group (gbf_project_view_get_model (plugin->view));
+	setup_nodes_treeview (GBF_PROJECT_VIEW (groups_view),
+	                        plugin->view,
+	                       	root,
 							parent_filter_func,
 							GINT_TO_POINTER (ANJUTA_PROJECT_TARGET),
 							default_group);
+	gtk_tree_path_free (root);
 	gtk_widget_show (groups_view);
 
 	/* setup target types combo box */
@@ -1435,6 +1410,7 @@ anjuta_pm_project_new_module (ProjectManagerPlugin *plugin,
 	GtkWidget *ok_button, *new_button;
 	GtkWidget *targets_view;
 	GtkWidget *modules_view;
+	GtkTreePath *root;
 	gint response;
 	gboolean finished = FALSE;
 	GList* new_modules = NULL;
@@ -1452,17 +1428,23 @@ anjuta_pm_project_new_module (ProjectManagerPlugin *plugin,
 	new_button = GTK_WIDGET (gtk_builder_get_object (gui, "new_package_button"));
 	ok_button = GTK_WIDGET (gtk_builder_get_object (gui, "ok_module_button"));
 
-	setup_nodes_treeview (gbf_project_view_get_model (plugin->view),
-							targets_view,
+	root = gbf_project_model_get_project_root_group (gbf_project_view_get_model (plugin->view));
+	setup_nodes_treeview (GBF_PROJECT_VIEW (targets_view),
+	                        plugin->view,
+	                       	root,
 							parent_filter_func,
 							GINT_TO_POINTER (ANJUTA_PROJECT_MODULE),
 							default_target);
+	gtk_tree_path_free (root);
 	gtk_widget_show (targets_view);
-	setup_nodes_treeview (gbf_project_view_get_model (plugin->view),
-							modules_view,
+	root = gbf_project_model_get_project_root (gbf_project_view_get_model (plugin->view));
+	setup_nodes_treeview (GBF_PROJECT_VIEW (modules_view),
+	                        plugin->view,
+	                        root,
 							module_filter_func,
 							NULL,
 							NULL);
+	gtk_tree_path_free (root);
 	gtk_widget_show (modules_view);
 	module_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (modules_view));
 	gtk_tree_selection_set_mode (module_selection, GTK_SELECTION_MULTIPLE);
diff --git a/plugins/project-manager/project-model.c b/plugins/project-manager/project-model.c
index 4cb3fe4..2ece8e1 100644
--- a/plugins/project-manager/project-model.c
+++ b/plugins/project-manager/project-model.c
@@ -42,6 +42,7 @@ struct _GbfProjectModelPrivate {
 	gulong               project_updated_handler;
 	
 	GtkTreeRowReference *root;
+	GtkTreeRowReference *root_group;
 	GList               *shortcuts;
 
 	gboolean default_shortcut;	   /* Add shortcut for each primary node */
@@ -210,37 +211,6 @@ gbf_project_model_instance_init (GbfProjectModel *model)
 	insert_empty_node (model);
 }
 
-GtkTreeRowReference *
-gbf_project_model_get_root (GbfProjectModel *model)
-{
-	if (model->priv->root == NULL)
-	{
-		GtkTreeIter iter;
-		gboolean valid;
-
-		/* Search root group */
-		for (valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &iter, NULL); valid; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter))
-		{
-			GbfTreeData *data;
-			
-			gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
-	   			 GBF_PROJECT_MODEL_COLUMN_DATA, &data,
-		    		-1);
-
-			if (data->type == GBF_TREE_NODE_ROOT)
-			{
-				GtkTreePath *path;
-				
-				path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
-				model->priv->root = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), path);
-				gtk_tree_path_free (path);
-			}
-		}
-	}
-
-	return model->priv->root;
-}
-
 /* Model data functions ------------ */
 
 /* Remove node without checking its shortcuts */
@@ -477,7 +447,7 @@ gbf_project_model_add_target_shortcut (GbfProjectModel *model,
 
 	if (expanded != NULL) *expanded = FALSE;
 
-	root_path = gtk_tree_row_reference_get_path (gbf_project_model_get_root (model));
+	root_path = gbf_project_model_get_project_root (model);
 	if ((before_path == NULL) && (target->type != GBF_TREE_NODE_SHORTCUT))
 	{
 		/* Check is a proxy node is not already existing. It is used to
@@ -563,7 +533,7 @@ gbf_project_model_move_target_shortcut (GbfProjectModel *model,
 	if (!shortcut)
 		return;
 
-	root_path = gtk_tree_row_reference_get_path (gbf_project_model_get_root (model));
+	root_path = gbf_project_model_get_project_root (model);
 	
 	/* check before_path */
 	if (!before_path ||
@@ -983,8 +953,74 @@ gbf_project_model_get_project_root (GbfProjectModel *model)
 	
 	g_return_val_if_fail (GBF_IS_PROJECT_MODEL (model), NULL);
 
-	if (gbf_project_model_get_root (model))
+	if (model->priv->root == NULL)
+	{
+		GtkTreeIter iter;
+		gboolean valid;
+
+		/* Search root group */
+		for (valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &iter, NULL); valid; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter))
+		{
+			GbfTreeData *data;
+			
+			gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
+	   			 GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    		-1);
+
+			if (data->type == GBF_TREE_NODE_ROOT)
+			{
+				path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+				model->priv->root = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), path);
+			}
+		}
+	}
+	else
+	{
 		path = gtk_tree_row_reference_get_path (model->priv->root);
+	}
+	
+	return path;
+}
+
+GtkTreePath *
+gbf_project_model_get_project_root_group (GbfProjectModel *model)
+{
+	GtkTreePath *path = NULL;
+	
+	g_return_val_if_fail (GBF_IS_PROJECT_MODEL (model), NULL);
+
+	if (model->priv->root_group == NULL)
+	{
+		GtkTreeIter root;
+
+		path = gbf_project_model_get_project_root (model);
+		if ((path != NULL) && gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &root, path))
+		{
+			gboolean valid;
+			GtkTreeIter iter;
+
+			
+			/* Search root group */
+			for (valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &iter, &root); valid; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter))
+			{
+				GbfTreeData *data;
+			
+				gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
+	   				 GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    			-1);
+
+				if (data->type == GBF_TREE_NODE_GROUP)
+				{
+					path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+					model->priv->root_group = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), path);
+				}
+			}
+		}
+	}
+	else
+	{
+		path = gtk_tree_row_reference_get_path (model->priv->root_group);
+	}
 	
 	return path;
 }
diff --git a/plugins/project-manager/project-model.h b/plugins/project-manager/project-model.h
index 4949a03..56a63ac 100644
--- a/plugins/project-manager/project-model.h
+++ b/plugins/project-manager/project-model.h
@@ -62,6 +62,7 @@ void             gbf_project_model_set_project       (GbfProjectModel   *model,
 AnjutaPmProject *gbf_project_model_get_project       (GbfProjectModel   *model);
 
 GtkTreePath     *gbf_project_model_get_project_root  (GbfProjectModel   *model);
+GtkTreePath     *gbf_project_model_get_project_root_group  (GbfProjectModel   *model);
 gboolean         gbf_project_model_remove            (GbfProjectModel *model,
                                                       GtkTreeIter *iter);
 gboolean         gbf_project_model_find_tree_data    (GbfProjectModel   *model,
@@ -115,7 +116,6 @@ void            gbf_project_model_move_target_shortcut    (GbfProjectModel *mode
                                                            GtkTreeIter     *iter,
                                                            GbfTreeData     *shortcut,
                                                            GtkTreePath     *before_path);
-GtkTreeRowReference * gbf_project_model_get_root    (GbfProjectModel *model);
 void            gbf_project_model_set_default_shortcut    (GbfProjectModel *model, gboolean enable);
 
 
diff --git a/plugins/project-manager/project-view.c b/plugins/project-manager/project-view.c
index 267879d..aaebfcb 100644
--- a/plugins/project-manager/project-view.c
+++ b/plugins/project-manager/project-view.c
@@ -222,7 +222,7 @@ idrag_dest_row_drop_possible (GtkTreeDragDest  *drag_dest,
 					GtkTreePath *root_path;
 					GtkTreePath *child_path;
 					
-					root_path = gtk_tree_row_reference_get_path (gbf_project_model_get_root (GBF_PROJECT_MODEL (project_model)));
+					root_path = gbf_project_model_get_project_root (GBF_PROJECT_MODEL (project_model));
 					child_path = gtk_tree_model_filter_convert_path_to_child_path (GTK_TREE_MODEL_FILTER (drag_dest), dest_path);
 					retval = gtk_tree_path_compare (child_path, root_path) <= 0;
 					gtk_tree_path_free (child_path);
@@ -763,6 +763,79 @@ gbf_project_view_get_first_selected (GbfProjectView *view, GtkTreeIter* selected
 	return data;
 }
 
+void
+gbf_project_view_set_cursor_to_iter (GbfProjectView *view,
+                                     GtkTreeIter *selected)
+{
+	GtkTreePath *path = NULL;
+	GtkTreeIter view_iter;
+	
+	/* select node if we find it in the view*/
+	if ((selected != NULL) && gtk_tree_model_filter_convert_child_iter_to_iter (
+			GTK_TREE_MODEL_FILTER (view->filter), &view_iter, selected))
+	{
+		path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->filter), &view_iter);
+	}
+	else
+	{
+		/* Check if it is a shortcut */
+		if (selected !=NULL)
+		{
+			GbfTreeData *data;
+
+			gtk_tree_model_get (GTK_TREE_MODEL (view->model), selected,
+			                    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+			                    -1);
+
+			if ((data != NULL) && (data->shortcut != NULL))
+			{
+				/* Select the corresponding node */
+				GtkTreeIter iter;
+				
+				if (gbf_project_model_find_tree_data (view->model, &iter, data->shortcut))
+				{
+					if (gtk_tree_model_filter_convert_child_iter_to_iter (
+					         GTK_TREE_MODEL_FILTER (view->filter), &view_iter, &iter))
+					{
+						path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->filter), &view_iter);
+					}
+				}
+			}
+		}
+
+		/* Try to select root node */
+		if (path == NULL)
+		{
+			GtkTreePath *root_path;
+
+			root_path = gbf_project_model_get_project_root (view->model);
+			if (root_path)
+			{
+				path = gtk_tree_model_filter_convert_child_path_to_path (
+							GTK_TREE_MODEL_FILTER (view->filter), root_path);
+				gtk_tree_path_free (root_path);
+			}
+		}
+
+		/* Take the first node */
+		if (path == NULL)
+		{
+			path = gtk_tree_path_new_first ();
+		}
+	}
+
+	if (path)
+	{
+		gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path);
+		
+		gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, NULL, FALSE);
+		gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), path, NULL,
+									TRUE, 0.5, 0.0);
+		gtk_tree_path_free (path);
+	}
+}
+
+
 static void
 on_each_get_data (GtkTreeModel *model,
 			GtkTreePath *path,
@@ -1416,6 +1489,37 @@ gbf_project_view_set_project (GbfProjectView *view, AnjutaPmProject *project)
 	gbf_project_model_set_project (view->model, project);
 }
 
+void 
+gbf_project_view_set_parent_view (GbfProjectView *view,
+                                  GbfProjectView *parent,
+                                  GtkTreePath *root)
+{
+	
+	if (view->model != NULL) g_object_unref (view->model);
+	if (view->filter != NULL) g_object_unref (view->model);
+	
+	view->model = g_object_ref (parent->model);
+	view->filter = GTK_TREE_MODEL_FILTER (pm_project_model_filter_new (GTK_TREE_MODEL (view->model), root));
+	gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (view->filter));
+}
+
+void 
+gbf_project_view_set_visible_func (GbfProjectView *view,
+                                   GtkTreeModelFilterVisibleFunc func,
+                                   gpointer data,
+                                   GDestroyNotify destroy)
+{
+	if (func == NULL)
+	{
+		gtk_tree_model_filter_set_visible_func (view->filter, is_project_node_visible, view, NULL);
+	}
+	else
+	{
+		gtk_tree_model_filter_set_visible_func (view->filter, func, data, destroy);
+	}
+	gtk_tree_model_filter_refilter (view->filter);
+}
+
 gboolean
 gbf_project_view_find_file (GbfProjectView *view, GtkTreeIter* iter, GFile *file, GbfTreeNodeType type)
 {
diff --git a/plugins/project-manager/project-view.h b/plugins/project-manager/project-view.h
index 39c8a61..510415e 100644
--- a/plugins/project-manager/project-view.h
+++ b/plugins/project-manager/project-view.h
@@ -66,10 +66,20 @@ struct _GbfProjectViewClass {
 GType                       gbf_project_view_get_type          (void);
 GtkWidget                  *gbf_project_view_new               (void);
 
+void			    gbf_project_view_set_parent_view (GbfProjectView *view,
+			                                      GbfProjectView *parent,
+			                                      GtkTreePath *root);
+void			    gbf_project_view_set_visible_func (GbfProjectView *view,
+			                                       GtkTreeModelFilterVisibleFunc func,
+			                                       gpointer data,
+			                                       GDestroyNotify destroy);
+
 AnjutaProjectNode          *gbf_project_filter_view_find_selected     (GtkTreeView *view,
 									AnjutaProjectNodeType type);
 GList                      *gbf_project_filter_view_get_all_selected  (GtkTreeView *view);
 
+void			    gbf_project_view_set_cursor_to_iter (GbfProjectView *view,
+			                                         GtkTreeIter *selected);
 
 AnjutaProjectNode          *gbf_project_view_find_selected     (GbfProjectView *view,
 							        AnjutaProjectNodeType type);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]