[gnome-builder] symbol-tree: update symbols when popover is toggled



commit f54a7706cd9b5d5646630526b5a222cc4d7b9e04
Author: Christian Hergert <chergert redhat com>
Date:   Sun Jul 2 19:12:41 2017 -0700

    symbol-tree: update symbols when popover is toggled
    
    Try to avoid updating the symbol popover when the popover is
    not displayed. We will populate it quickly when the menu button
    is toggled.

 .../symbol-tree/gbp-symbol-layout-stack-addin.c    |   71 +++++++++++++++-----
 plugins/symbol-tree/gbp-symbol-menu-button.c       |    2 +-
 plugins/symbol-tree/gbp-symbol-menu-button.ui      |    8 ++-
 3 files changed, 62 insertions(+), 19 deletions(-)
---
diff --git a/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c 
b/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
index 3474c1d..3aef7b6 100644
--- a/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
+++ b/plugins/symbol-tree/gbp-symbol-layout-stack-addin.c
@@ -40,6 +40,7 @@ gbp_symbol_layout_stack_addin_cursor_moved (GbpSymbolLayoutStackAddin *self,
   g_assert (location != NULL);
   g_assert (IDE_IS_BUFFER (buffer));
 
+  /* TODO: Delay a bit so we aren't super active */
 }
 
 static void
@@ -52,9 +53,9 @@ gbp_symbol_layout_stack_addin_get_symbol_tree_cb (GObject      *object,
   g_autoptr(IdeSymbolTree) tree = NULL;
   g_autoptr(GError) error = NULL;
 
-  g_assert (GBP_IS_SYMBOL_LAYOUT_STACK_ADDIN (self));
-  g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (IDE_IS_SYMBOL_RESOLVER (symbol_resolver));
   g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (GBP_IS_SYMBOL_LAYOUT_STACK_ADDIN (self));
 
   tree = ide_symbol_resolver_get_symbol_tree_finish (symbol_resolver, result, &error);
 
@@ -67,19 +68,12 @@ gbp_symbol_layout_stack_addin_get_symbol_tree_cb (GObject      *object,
   if (self->button == NULL)
     return;
 
-  if (tree == NULL)
-    {
-      gtk_widget_hide (GTK_WIDGET (self->button));
-      return;
-    }
-
   gbp_symbol_menu_button_set_symbol_tree (self->button, tree);
-  gtk_widget_show (GTK_WIDGET (self->button));
 }
 
 static void
-gbp_symbol_layout_stack_addin_change_settled (GbpSymbolLayoutStackAddin *self,
-                                              IdeBuffer                 *buffer)
+gbp_symbol_layout_stack_addin_update_tree (GbpSymbolLayoutStackAddin *self,
+                                           IdeBuffer                 *buffer)
 {
   IdeSymbolResolver *symbol_resolver;
   IdeFile *file;
@@ -87,18 +81,22 @@ gbp_symbol_layout_stack_addin_change_settled (GbpSymbolLayoutStackAddin *self,
   g_assert (GBP_IS_SYMBOL_LAYOUT_STACK_ADDIN (self));
   g_assert (IDE_IS_BUFFER (buffer));
 
+  /* Cancel any in-flight work */
+  g_cancellable_cancel (self->cancellable);
+  g_clear_object (&self->cancellable);
+
   symbol_resolver = ide_buffer_get_symbol_resolver (buffer);
   g_assert (!symbol_resolver || IDE_IS_SYMBOL_RESOLVER (symbol_resolver));
 
+  gtk_widget_set_visible (GTK_WIDGET (self->button), symbol_resolver != NULL);
   if (symbol_resolver == NULL)
-    {
-      gtk_widget_hide (GTK_WIDGET (self->button));
-      return;
-    }
+    return;
 
   file = ide_buffer_get_file (buffer);
   g_assert (IDE_IS_FILE (file));
 
+  self->cancellable = g_cancellable_new ();
+
   ide_symbol_resolver_get_symbol_tree_async (symbol_resolver,
                                              ide_file_get_file (file),
                                              buffer,
@@ -108,17 +106,54 @@ gbp_symbol_layout_stack_addin_change_settled (GbpSymbolLayoutStackAddin *self,
 }
 
 static void
+gbp_symbol_layout_stack_addin_change_settled (GbpSymbolLayoutStackAddin *self,
+                                              IdeBuffer                 *buffer)
+{
+  g_assert (GBP_IS_SYMBOL_LAYOUT_STACK_ADDIN (self));
+  g_assert (IDE_IS_BUFFER (buffer));
+
+  /* Ignore this request unless the button is active */
+  if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->button)))
+    return;
+
+  gbp_symbol_layout_stack_addin_update_tree (self, buffer);
+}
+
+static void
+gbp_symbol_layout_stack_addin_button_toggled (GbpSymbolLayoutStackAddin *self,
+                                              GtkMenuButton             *button)
+{
+  IdeBuffer *buffer;
+
+  g_assert (GBP_IS_SYMBOL_LAYOUT_STACK_ADDIN (self));
+  g_assert (GTK_IS_MENU_BUTTON (button));
+
+  buffer = dzl_signal_group_get_target (self->buffer_signals);
+  g_assert (!buffer || IDE_IS_BUFFER (buffer));
+
+  if (buffer != NULL && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
+    gbp_symbol_layout_stack_addin_update_tree (self, buffer);
+}
+
+static void
 gbp_symbol_layout_stack_addin_bind (GbpSymbolLayoutStackAddin *self,
                                     IdeBuffer                 *buffer,
                                     DzlSignalGroup            *buffer_signals)
 {
+  IdeSymbolResolver *symbol_resolver;
+
   g_assert (GBP_IS_SYMBOL_LAYOUT_STACK_ADDIN (self));
   g_assert (IDE_IS_BUFFER (buffer));
   g_assert (DZL_IS_SIGNAL_GROUP (buffer_signals));
 
   self->cancellable = g_cancellable_new ();
 
-  gbp_symbol_layout_stack_addin_change_settled (self, buffer);
+  gtk_button_set_label (GTK_BUTTON (self->button), _("Symbols"));
+
+  symbol_resolver = ide_buffer_get_symbol_resolver (buffer);
+  gtk_widget_set_visible (GTK_WIDGET (self->button), symbol_resolver != NULL);
+
+  gbp_symbol_layout_stack_addin_update_tree (self, buffer);
 }
 
 static void
@@ -150,6 +185,10 @@ gbp_symbol_layout_stack_addin_load (IdeLayoutStackAddin *addin,
                     "destroy",
                     G_CALLBACK (gtk_widget_destroyed),
                     &self->button);
+  g_signal_connect_swapped (self->button,
+                            "toggled",
+                            G_CALLBACK (gbp_symbol_layout_stack_addin_button_toggled),
+                            self);
   ide_layout_stack_header_add_custom_title (IDE_LAYOUT_STACK_HEADER (header),
                                             GTK_WIDGET (self->button),
                                             100);
diff --git a/plugins/symbol-tree/gbp-symbol-menu-button.c b/plugins/symbol-tree/gbp-symbol-menu-button.c
index 73062ba..2efe4cb 100644
--- a/plugins/symbol-tree/gbp-symbol-menu-button.c
+++ b/plugins/symbol-tree/gbp-symbol-menu-button.c
@@ -216,7 +216,7 @@ gbp_symbol_menu_button_set_symbol_tree (GbpSymbolMenuButton *self,
       if (symbol_tree != NULL)
         dzl_tree_node_set_item (root, G_OBJECT (symbol_tree));
       dzl_tree_set_root (self->tree, root);
-
+      gtk_tree_view_expand_all (GTK_TREE_VIEW (self->tree));
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SYMBOL_TREE]);
     }
 }
diff --git a/plugins/symbol-tree/gbp-symbol-menu-button.ui b/plugins/symbol-tree/gbp-symbol-menu-button.ui
index 00667c4..a0fe230 100644
--- a/plugins/symbol-tree/gbp-symbol-menu-button.ui
+++ b/plugins/symbol-tree/gbp-symbol-menu-button.ui
@@ -10,14 +10,18 @@
         <property name="visible">true</property>
         <child>
           <object class="GtkSearchEntry" id="search_entry">
-            <property name="margin">6</property>
+            <property name="margin-start">14</property>
+            <property name="margin-end">14</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
             <property name="visible">true</property>
           </object>
         </child>
         <child>
           <object class="GtkScrolledWindow">
-            <property name="propagate-natural-width">true</property>
             <property name="propagate-natural-height">true</property>
+            <property name="propagate-natural-width">true</property>
+            <property name="min-content-height">300</property>
             <property name="max-content-height">600</property>
             <property name="visible">true</property>
             <child>


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