[anjuta] project-manager: Display project root node
- From: Sebastien Granjoux <sgranjoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] project-manager: Display project root node
- Date: Mon, 10 Jan 2011 21:15:50 +0000 (UTC)
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]