[gnome-builder] symbol-tree: wait for a symbol resolver to be loaded
- From: Sébastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] symbol-tree: wait for a symbol resolver to be loaded
- Date: Tue, 14 Feb 2017 21:59:05 +0000 (UTC)
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]