[anjuta] project-manager: Display project root node



commit fc63f6c50c878a3fe43533359a08396ff6b33187
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Sun Jan 9 12:22:32 2011 +0100

    project-manager: Display project root node

 plugins/project-manager/project-model.c |   34 ++++++++------
 plugins/project-manager/project-view.c  |   78 +++++++++++++++++++++++++++---
 plugins/project-manager/tree-data.c     |   45 ++++++------------
 plugins/project-manager/tree-data.h     |    5 +-
 4 files changed, 107 insertions(+), 55 deletions(-)
---
diff --git a/plugins/project-manager/project-model.c b/plugins/project-manager/project-model.c
index 54f06ce..4cb3fe4 100644
--- a/plugins/project-manager/project-model.c
+++ b/plugins/project-manager/project-model.c
@@ -41,7 +41,7 @@ struct _GbfProjectModelPrivate {
 	AnjutaPmProject      *proj;
 	gulong               project_updated_handler;
 	
-	GtkTreeRowReference *root_group;
+	GtkTreeRowReference *root;
 	GList               *shortcuts;
 
 	gboolean default_shortcut;	   /* Add shortcut for each primary node */
@@ -213,7 +213,7 @@ gbf_project_model_instance_init (GbfProjectModel *model)
 GtkTreeRowReference *
 gbf_project_model_get_root (GbfProjectModel *model)
 {
-	if (model->priv->root_group == NULL)
+	if (model->priv->root == NULL)
 	{
 		GtkTreeIter iter;
 		gboolean valid;
@@ -226,19 +226,19 @@ gbf_project_model_get_root (GbfProjectModel *model)
 			gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
 	   			 GBF_PROJECT_MODEL_COLUMN_DATA, &data,
 		    		-1);
-			
-			if (data->type == GBF_TREE_NODE_GROUP)
+
+			if (data->type == GBF_TREE_NODE_ROOT)
 			{
 				GtkTreePath *path;
 				
 				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);
+				model->priv->root = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), path);
 				gtk_tree_path_free (path);
 			}
 		}
 	}
 
-	return model->priv->root_group;
+	return model->priv->root;
 }
 
 /* Model data functions ------------ */
@@ -725,22 +725,26 @@ gbf_project_model_add_root (GbfProjectModel 	*model,
     GtkTreeIter     	*parent)
 {
 	AnjutaProjectNode *node;
+	GtkTreeIter iter;
+	GbfTreeData *data;
 
 	if ((!root) || (anjuta_project_node_get_node_type (root) != ANJUTA_PROJECT_ROOT))
 		return;
 
-	/* create root reference */
-	/*root_path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
-	model->priv->root_group = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), root_path);
-	gtk_tree_path_free (root_path);*/
+	data = gbf_tree_data_new_node (root);
+	gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
+	gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 
+			    GBF_PROJECT_MODEL_COLUMN_DATA, data,
+			    -1);
+	if (parent != NULL) *parent = iter;
 
 	/* add groups ... */
 	for (node = anjuta_project_node_first_child (root); node; node = anjuta_project_node_next_sibling (node))
-		gbf_project_model_add_target_group (model, node, NULL);
+		gbf_project_model_add_target_group (model, node, &iter);
 	
 	/* ... and module */
 	for (node = anjuta_project_node_first_child (root); node; node = anjuta_project_node_next_sibling (node))
-		gbf_project_model_add_module (model, node, NULL);
+		gbf_project_model_add_module (model, node, &iter);
 }
 
 static void
@@ -770,8 +774,8 @@ static void
 unload_project (GbfProjectModel *model)
 {
 	if (model->priv->proj) {
-		gtk_tree_row_reference_free (model->priv->root_group);
-		model->priv->root_group = NULL;
+		gtk_tree_row_reference_free (model->priv->root);
+		model->priv->root = NULL;
 
 		gbf_project_model_clear (model);
 
@@ -980,7 +984,7 @@ 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))
-		path = gtk_tree_row_reference_get_path (model->priv->root_group);
+		path = gtk_tree_row_reference_get_path (model->priv->root);
 	
 	return path;
 }
diff --git a/plugins/project-manager/project-view.c b/plugins/project-manager/project-view.c
index f7ecf05..abca2cc 100644
--- a/plugins/project-manager/project-view.c
+++ b/plugins/project-manager/project-view.c
@@ -387,7 +387,7 @@ get_icon (GFile *file)
 	if (!file_info)
 	{
 		gchar *name = g_file_get_parse_name (file);
-		
+
 		g_warning (G_STRLOC ": Unable to query information for URI: %s: %s", name, error->message);
 		g_free (name);
 		g_clear_error (&error);
@@ -435,6 +435,13 @@ set_pixbuf (GtkTreeViewColumn *tree_column,
 			pixbuf = get_icon (data->source);
 			break;
 		}
+		case GBF_TREE_NODE_ROOT:
+			pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default(),
+							   GTK_STOCK_OPEN,
+							   ICON_SIZE,
+							   GTK_ICON_LOOKUP_GENERIC_FALLBACK,
+							   NULL);
+			break;
 		case GBF_TREE_NODE_GROUP:
 			pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default(),
 							   GTK_STOCK_DIRECTORY,
@@ -513,6 +520,7 @@ search_equal_func (GtkTreeModel *model, gint column,
 static gboolean
 draw (GtkWidget *widget, cairo_t *cr)
 {
+	GtkTreeModel *view_model;
 	GtkTreeModel *model;
 	GtkTreeView *tree_view;
 	gint event_handled = FALSE;
@@ -521,10 +529,10 @@ draw (GtkWidget *widget, cairo_t *cr)
 		GTK_WIDGET_CLASS (gbf_project_view_parent_class)->draw (widget, cr);
 
 	tree_view = GTK_TREE_VIEW (widget);
-	model = gtk_tree_view_get_model (tree_view);
-	if (GTK_IS_TREE_MODEL_FILTER (model))
+	view_model = gtk_tree_view_get_model (tree_view);
+	if (GTK_IS_TREE_MODEL_FILTER (view_model))
 	{
-		model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
+		model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (view_model));
 	}
 	if (gtk_cairo_should_draw_window (cr, gtk_tree_view_get_bin_window (tree_view)) &&
 	    model && GBF_IS_PROJECT_MODEL (model)) {
@@ -536,6 +544,15 @@ draw (GtkWidget *widget, cairo_t *cr)
 		
 		root = gbf_project_model_get_project_root (GBF_PROJECT_MODEL (model));
 		if (root) {
+			if (view_model != model)
+			{
+				/* Convert path */
+				GtkTreePath *child_path;
+				
+				child_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (view_model), root);
+				gtk_tree_path_free (root);
+				root = child_path;
+			}
 			gtk_tree_view_get_background_area (
 				tree_view, root, gtk_tree_view_get_column (tree_view, 0), &rect);
 			gtk_paint_hline (gtk_widget_get_style (widget),
@@ -548,7 +565,7 @@ draw (GtkWidget *widget, cairo_t *cr)
 			gtk_tree_path_free (root);
 		}
 	}
-	
+
 	return event_handled;
 }
 
@@ -615,7 +632,7 @@ static gboolean
 is_project_node_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 {
 	GbfTreeData *data;
-	
+
 	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
 		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
 		    -1);
@@ -1325,10 +1342,55 @@ on_node_loaded (AnjutaPmProject *sender, AnjutaProjectNode *node, gboolean compl
 		                                      GTK_SORT_ASCENDING);
 		                                      
 		found = gbf_project_model_find_node (view->model, &iter, NULL, node);
-		gbf_project_view_update_tree (view, node, found ? &iter : NULL);
 		if (!found)
 		{
-			found = !gtk_tree_model_get_iter_first (GTK_TREE_MODEL (view->model), &iter);
+			if (anjuta_project_node_get_node_type (node) != ANJUTA_PROJECT_ROOT)
+			{
+				g_critical ("Unable to find node %s", anjuta_project_node_get_name (node));
+			}
+			else
+			{
+				GtkTreePath *path;
+				GtkTreePath *child_path;
+				GtkTreeModelFilter *filter;
+
+				if (!gbf_project_model_find_child_name (view->model, &iter, NULL, anjuta_project_node_get_name (node)))
+				{
+					gbf_project_model_add_root (view->model, node, &iter);
+				}
+				else
+				{
+					GbfTreeData *data;
+					
+					gtk_tree_model_get (GTK_TREE_MODEL (view->model), &iter, 
+						GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+						-1);
+					if (data->type == GBF_TREE_NODE_UNKNOWN)
+					{
+						/* Replace with real node */
+						GbfTreeData *new_data;
+
+						new_data = gbf_tree_data_new_node (node);
+						gtk_tree_store_set (GTK_TREE_STORE (view->model), &iter,
+									GBF_PROJECT_MODEL_COLUMN_DATA, new_data,
+									-1);
+						gbf_tree_data_free (data);
+					}
+					gbf_project_view_update_tree (view, node, &iter);
+				}
+
+				/* Expand root node */
+				path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->model), &iter);
+				filter = GTK_TREE_MODEL_FILTER (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
+				child_path = gtk_tree_model_filter_convert_child_path_to_path (filter, path);
+				gtk_tree_view_expand_row (GTK_TREE_VIEW (view), child_path, FALSE);
+				gtk_tree_path_free (child_path);
+				gtk_tree_path_free (path);
+			}
+		}
+		else
+		{
+			gbf_project_view_update_tree (view, node, &iter);
 		}
 		gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->model),
 		                                      GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
diff --git a/plugins/project-manager/tree-data.c b/plugins/project-manager/tree-data.c
index 12f3f00..2be80ca 100644
--- a/plugins/project-manager/tree-data.c
+++ b/plugins/project-manager/tree-data.c
@@ -131,36 +131,9 @@ gbf_tree_data_equal (GbfTreeData *data_a, GbfTreeData *data_b)
 				}
 			}
 		}
-		else
+		else if ((data_a->type == GBF_TREE_NODE_UNKNOWN) || (data_b->type == GBF_TREE_NODE_UNKNOWN))
 		{
-			if (data_b->type == GBF_TREE_NODE_UNKNOWN)
-			{
-				GbfTreeNodeType type = data_a->type;
-
-				data_a->type = data_b->type;
-				data_b->type = type;
-			}
-
-			equal = data_a->type == GBF_TREE_NODE_UNKNOWN;
-			if (equal)
-			{
-				if (data_b->source != NULL) 
-				{
-					equal = g_file_equal (data_a->group, data_b->source);
-				}
-				else if (data_b->target != NULL)
-				{
-					gchar *name;
-
-					name = g_file_get_basename (data_a->group);
-					equal = strcmp (name, data_b->target) == 0;
-					g_free (name);
-				}
-				else if (data_b->group != NULL)
-				{
-					equal = g_file_equal (data_a->group, data_b->group);
-				}
-			}
+			equal = strcmp (data_b->name, data_a->name);
 		}
 	}
 
@@ -335,6 +308,18 @@ gbf_tree_data_new_source (AnjutaProjectNode *source)
 }
 
 GbfTreeData *
+gbf_tree_data_new_root (AnjutaProjectNode *root)
+{
+	GbfTreeData *data = g_slice_new0 (GbfTreeData);
+	
+	data->type = GBF_TREE_NODE_ROOT;
+	data->node = root;
+	data->name = g_strdup (anjuta_project_node_get_name (root));
+
+	return data;
+}
+
+GbfTreeData *
 gbf_tree_data_new_module (AnjutaProjectNode *module)
 {
 	GbfTreeData *data = g_slice_new0 (GbfTreeData);
@@ -381,7 +366,7 @@ gbf_tree_data_new_node (AnjutaProjectNode *node)
 			data = gbf_tree_data_new_package (node);
 			break;
 		case ANJUTA_PROJECT_ROOT:
-			data = NULL;
+			data = gbf_tree_data_new_root (node);
 			break;
 		default:
 			break;
diff --git a/plugins/project-manager/tree-data.h b/plugins/project-manager/tree-data.h
index 8aa20fb..44dd408 100644
--- a/plugins/project-manager/tree-data.h
+++ b/plugins/project-manager/tree-data.h
@@ -75,13 +75,14 @@ gboolean       gbf_tree_data_equal_name         (GbfTreeData           *data,
 
 GbfTreeData   *gbf_tree_data_new_string         (const gchar           *string);
 GbfTreeData   *gbf_tree_data_new_shortcut       (GbfTreeData		   *src);
-GbfTreeData   *gbf_tree_data_new_proxy   					(const gchar           *name, gboolean expanded);
+GbfTreeData   *gbf_tree_data_new_proxy   		(const gchar           *name, gboolean expanded);
 GbfTreeData   *gbf_tree_data_new_group          (AnjutaProjectNode     *group);
 GbfTreeData   *gbf_tree_data_new_target         (AnjutaProjectNode     *target);
 GbfTreeData   *gbf_tree_data_new_source         (AnjutaProjectNode     *source);
 GbfTreeData   *gbf_tree_data_new_module         (AnjutaProjectNode     *module);
+GbfTreeData   *gbf_tree_data_new_root           (AnjutaProjectNode     *root);
 GbfTreeData   *gbf_tree_data_new_package        (AnjutaProjectNode     *package);
-GbfTreeData			*gbf_tree_data_new_node							(AnjutaProjectNode     *node);
+GbfTreeData	  *gbf_tree_data_new_node			(AnjutaProjectNode     *node);
 void				gbf_tree_data_invalidate (GbfTreeData *data);
 void           gbf_tree_data_free               (GbfTreeData           *data);
 



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