[gnome-builder] symbol-tree: wait for a symbol resolver to be loaded



commit e3477fd2f47e37b4c2e5292952aadb178a97a056
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Wed Jan 18 18:04:31 2017 +0100

    symbol-tree: wait for a symbol resolver to be loaded
    
    When the view is focused, the symbol tree is refreshed.
    
    It can happen that when we first load a file, the view
    is focused before the symbol resolver is loaded, that means
    the symbol tree remains empty until the next refresh.\
    (scheduled delay or buffer saving)

 libide/buffers/ide-buffer.c       |   20 ++++++++++++++-
 plugins/symbol-tree/symbol-tree.c |   48 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 66 insertions(+), 2 deletions(-)
---
diff --git a/libide/buffers/ide-buffer.c b/libide/buffers/ide-buffer.c
index bb246d2..7131e76 100644
--- a/libide/buffers/ide-buffer.c
+++ b/libide/buffers/ide-buffer.c
@@ -129,6 +129,7 @@ enum {
   LINE_FLAGS_CHANGED,
   LOADED,
   SAVED,
+  SYMBOL_RESOLVER_LOADED,
   LAST_SIGNAL
 };
 
@@ -1104,7 +1105,10 @@ ide_buffer_load_symbol_resolver (IdeBuffer           *self,
   resolver = ide_extension_adapter_get_extension (adapter);
 
   if (resolver != NULL)
-    ide_symbol_resolver_load (resolver);
+    {
+      ide_symbol_resolver_load (resolver);
+      g_signal_emit (self, signals [SYMBOL_RESOLVER_LOADED], 0);
+    }
 
   IDE_EXIT;
 }
@@ -1548,6 +1552,20 @@ ide_buffer_class_init (IdeBufferClass *klass)
                   NULL, NULL, NULL,
                   G_TYPE_NONE,
                   0);
+
+  /**
+   * IdeBuffer::symbol-resolver-loaded:
+   *
+   * This signal is emitted when the buffer has completed loading a new symbol resolver.
+   */
+  signals [SYMBOL_RESOLVER_LOADED] =
+    g_signal_new_class_handler ("symbol-resolver-loaded",
+                                G_TYPE_FROM_CLASS (klass),
+                                G_SIGNAL_RUN_LAST,
+                                0,
+                                NULL, NULL, NULL,
+                                G_TYPE_NONE,
+                                0);
 }
 
 static void
diff --git a/plugins/symbol-tree/symbol-tree.c b/plugins/symbol-tree/symbol-tree.c
index ec22aae..1aed22d 100644
--- a/plugins/symbol-tree/symbol-tree.c
+++ b/plugins/symbol-tree/symbol-tree.c
@@ -29,19 +29,33 @@ struct _SymbolTree
 {
   GObject          parent_instance;
   SymbolTreePanel *panel;
+  IdeBuffer       *buffer;
 };
 
 static void workbench_addin_init (IdeWorkbenchAddinInterface *iface);
 
-G_DEFINE_DYNAMIC_TYPE_EXTENDED (SymbolTree, symbol_tree, G_TYPE_OBJECT, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (SymbolTree, symbol_tree, IDE_TYPE_OBJECT, 0,
                                 G_IMPLEMENT_INTERFACE_DYNAMIC (IDE_TYPE_WORKBENCH_ADDIN,
                                                                workbench_addin_init))
 
 static void
+symbol_tree_symbol_resolver_loaded_cb (SymbolTree *self,
+                                       IdeBuffer  *buffer)
+{
+  g_assert (SYMBOL_IS_TREE (self));
+  g_assert (IDE_IS_BUFFER (buffer));
+
+  symbol_tree_panel_reset (self->panel);
+}
+
+static void
 notify_active_view_cb (SymbolTree  *self,
                        GParamFlags *pspec,
                        IdeLayout   *layout)
 {
+  GtkWidget *active_view;
+  IdeBuffer *buffer;
+
   IDE_ENTRY;
 
   g_assert (SYMBOL_IS_TREE (self));
@@ -50,6 +64,30 @@ notify_active_view_cb (SymbolTree  *self,
 
   symbol_tree_panel_reset (self->panel);
 
+  if (self->buffer != NULL)
+    {
+      g_signal_handlers_disconnect_by_func (self->buffer,
+                                            symbol_tree_symbol_resolver_loaded_cb,
+                                            self);
+      ide_clear_weak_pointer (&self->buffer);
+    }
+
+  active_view = ide_layout_get_active_view (layout);
+  if (IDE_IS_EDITOR_VIEW (active_view))
+    {
+      buffer = ide_editor_view_get_document (IDE_EDITOR_VIEW (active_view));
+      if (ide_buffer_get_symbol_resolver (buffer) == NULL)
+        {
+          ide_set_weak_pointer (&self->buffer, buffer);
+
+          g_signal_connect_object (buffer,
+                                   "symbol-resolver-loaded",
+                                   G_CALLBACK (symbol_tree_symbol_resolver_loaded_cb),
+                                   self,
+                                   G_CONNECT_SWAPPED);
+        }
+    }
+
   IDE_EXIT;
 }
 
@@ -109,6 +147,14 @@ symbol_tree_unload (IdeWorkbenchAddin *addin,
   pane = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (perspective));
   g_assert (IDE_IS_LAYOUT_PANE (pane));
 
+  if (self->buffer != NULL)
+    {
+      g_signal_handlers_disconnect_by_func (self->buffer,
+                                            symbol_tree_symbol_resolver_loaded_cb,
+                                            self);
+      ide_clear_weak_pointer (&self->buffer);
+    }
+
   gtk_widget_destroy (GTK_WIDGET (self->panel));
   self->panel = NULL;
 }


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