[gnome-builder] project-tree: use IdeProject::file-renamed



commit 63c2133fae7df640f434f82cdfc1422e43dd19fe
Author: Christian Hergert <christian hergert me>
Date:   Mon Apr 25 21:30:56 2016 -0700

    project-tree: use IdeProject::file-renamed
    
    This avoids doing the work in the project tree actions and instead relies
    on GbProjectTree to respond to file-renamed events from the project.

 plugins/project-tree/gb-project-tree-actions.c |   47 +-----------------------
 plugins/project-tree/gb-project-tree.c         |   24 ++++++++++++
 2 files changed, 25 insertions(+), 46 deletions(-)
---
diff --git a/plugins/project-tree/gb-project-tree-actions.c b/plugins/project-tree/gb-project-tree-actions.c
index 3fb560a..b84fda6 100644
--- a/plugins/project-tree/gb-project-tree-actions.c
+++ b/plugins/project-tree/gb-project-tree-actions.c
@@ -559,24 +559,6 @@ gb_project_tree_actions_new_file (GSimpleAction *action,
   gb_project_tree_actions_new (self, G_FILE_TYPE_REGULAR);
 }
 
-static gboolean
-find_child_node (IdeTree     *tree,
-                 IdeTreeNode *parent,
-                 IdeTreeNode *child,
-                 gpointer    user_data)
-{
-  GObject *item = ide_tree_node_get_item (child);
-  GFile *target = user_data;
-  GFile *child_file;
-
-  if (GB_IS_PROJECT_FILE (item) &&
-      (child_file = gb_project_file_get_file (GB_PROJECT_FILE (item))) &&
-      g_file_equal (child_file, target))
-    return TRUE;
-
-  return FALSE;
-}
-
 static void
 gb_project_tree_actions__project_rename_file_cb (GObject      *object,
                                                  GAsyncResult *result,
@@ -585,10 +567,6 @@ gb_project_tree_actions__project_rename_file_cb (GObject      *object,
   IdeProject *project = (IdeProject *)object;
   g_autoptr(GbRenameFilePopover) popover = user_data;
   g_autoptr(GError) error = NULL;
-  IdeTreeNode *node;
-  IdeTreeNode *parent;
-  GFile *file;
-  IdeTree *tree;
 
   g_assert (IDE_IS_PROJECT (project));
   g_assert (GB_IS_RENAME_FILE_POPOVER (popover));
@@ -600,29 +578,6 @@ gb_project_tree_actions__project_rename_file_cb (GObject      *object,
       return;
     }
 
-  file = g_object_get_data (G_OBJECT (popover), "G_FILE");
-  tree = IDE_TREE (gtk_popover_get_relative_to (GTK_POPOVER (popover)));
-
-  g_assert (G_IS_FILE (file));
-  g_assert (IDE_IS_TREE (tree));
-
-  node = ide_tree_get_selected (tree);
-  if (node == NULL)
-    goto cleanup;
-
-  parent = ide_tree_node_get_parent (node);
-
-  ide_tree_node_invalidate (parent);
-  ide_tree_node_expand (parent, FALSE);
-
-  node = ide_tree_find_child_node (tree, parent, find_child_node, file);
-
-  if (node != NULL)
-    ide_tree_node_select (node);
-  else
-    ide_tree_node_select (parent);
-
-cleanup:
   gtk_widget_hide (GTK_WIDGET (popover));
   gtk_widget_destroy (GTK_WIDGET (popover));
 }
@@ -646,7 +601,7 @@ gb_project_tree_actions__rename_file_cb (GbProjectTree       *self,
   context = ide_workbench_get_context (workbench);
   project = ide_context_get_project (context);
 
-  /* todo: set busy spinner in popover */
+  /* TODO: set busy spinner in popover */
 
   g_object_set_data_full (G_OBJECT (popover),
                           "G_FILE",
diff --git a/plugins/project-tree/gb-project-tree.c b/plugins/project-tree/gb-project-tree.c
index a788e67..cf3ca7b 100644
--- a/plugins/project-tree/gb-project-tree.c
+++ b/plugins/project-tree/gb-project-tree.c
@@ -58,6 +58,21 @@ gb_project_tree_get_context (GbProjectTree *self)
   return NULL;
 }
 
+static void
+gb_project_tree_project_file_renamed (GbProjectTree *self,
+                                      GFile         *src_file,
+                                      GFile         *dst_file,
+                                      IdeProject    *project)
+{
+  g_assert (GB_IS_PROJECT_TREE (self));
+  g_assert (G_IS_FILE (src_file));
+  g_assert (G_IS_FILE (dst_file));
+  g_assert (IDE_IS_PROJECT (project));
+
+  ide_tree_rebuild (IDE_TREE (self));
+  gb_project_tree_reveal (self, dst_file);
+}
+
 void
 gb_project_tree_set_context (GbProjectTree *self,
                              IdeContext    *context)
@@ -65,10 +80,19 @@ gb_project_tree_set_context (GbProjectTree *self,
   GtkTreeModel *model;
   GtkTreeIter iter;
   IdeTreeNode *root;
+  IdeProject *project;
 
   g_return_if_fail (GB_IS_PROJECT_TREE (self));
   g_return_if_fail (!context || IDE_IS_CONTEXT (context));
 
+  project = ide_context_get_project (context);
+
+  g_signal_connect_object (project,
+                           "file-renamed",
+                           G_CALLBACK (gb_project_tree_project_file_renamed),
+                           self,
+                           G_CONNECT_SWAPPED);
+
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
 
   root = ide_tree_node_new ();


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