[gnome-builder] project-tree: handle selection chanages gracefully



commit 5754d395b2b490acd9d91220ea07fb488f982da6
Author: Christian Hergert <chergert redhat com>
Date:   Sun Jan 7 16:34:54 2018 -0800

    project-tree: handle selection chanages gracefully
    
    If we race against some other action changing the selected item, we might
    not have a valid selection in the callbacks. So instead, we'll take a
    reference to the tree node as GData to the popover (and then read that
    back instead of reading the tree selection).

 src/plugins/project-tree/gb-project-tree-actions.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)
---
diff --git a/src/plugins/project-tree/gb-project-tree-actions.c 
b/src/plugins/project-tree/gb-project-tree-actions.c
index dcf5bdb..383adec 100644
--- a/src/plugins/project-tree/gb-project-tree-actions.c
+++ b/src/plugins/project-tree/gb-project-tree-actions.c
@@ -427,7 +427,7 @@ gb_project_tree_actions__popover_create_file_cb (GbProjectTree    *self,
             (file_type == G_FILE_TYPE_REGULAR));
   g_assert (GB_IS_NEW_FILE_POPOVER (popover));
 
-  selected = dzl_tree_get_selected (DZL_TREE (self));
+  selected = g_object_get_data (G_OBJECT (popover), "DZL_TREE_NODE");
 
   g_assert (selected != NULL);
   g_assert (DZL_IS_TREE_NODE (selected));
@@ -469,10 +469,13 @@ gb_project_tree_actions__popover_closed_cb (GbProjectTree *self,
   g_assert (GB_IS_PROJECT_TREE (self));
   g_assert (GTK_IS_POPOVER (popover));
 
-  if (!(selected = dzl_tree_get_selected (DZL_TREE (self))) || !self->expanded_in_new)
-    return;
+  selected = g_object_get_data (G_OBJECT (popover), "DZL_TREE_NODE");
+
+  g_assert (selected != NULL);
+  g_assert (DZL_IS_TREE_NODE (selected));
 
-  dzl_tree_node_collapse (selected);
+  if (self->expanded_in_new)
+    dzl_tree_node_collapse (selected);
 }
 
 static void
@@ -555,6 +558,10 @@ again:
                           "file-type", file_type,
                           "position", GTK_POS_RIGHT,
                           NULL);
+  g_object_set_data_full (G_OBJECT (popover),
+                          "DZL_TREE_NODE",
+                          g_object_ref (selected),
+                          g_object_unref);
   g_signal_connect_object (popover,
                            "create-file",
                            G_CALLBACK (gb_project_tree_actions__popover_create_file_cb),


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