[anjuta] project-manager: Select the right node in the dialogs's project view
- From: Sebastien Granjoux <sgranjoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] project-manager: Select the right node in the dialogs's project view
- Date: Sat, 15 Jan 2011 08:20:35 +0000 (UTC)
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]