[libdazzle] treebuilder: add node-expanded and node-collapsed



commit 634d1057d4156605a4af332fe1b6f9bdeeca6233
Author: Christian Hergert <chergert redhat com>
Date:   Wed Nov 29 03:39:10 2017 -0800

    treebuilder: add node-expanded and node-collapsed
    
    This allows for builders to track the expand/collapse of nodes.
    This can be useful to track external data.
    
    We might want to do this for indirect nodes as well, but that
    gets tricky in that we probably want to only do so when the
    node is getting removed from rebuild-on-collapse.

 src/tree/dzl-tree-builder.c |   50 +++++++++++++++++++++++++++++++++++++++++++
 src/tree/dzl-tree-builder.h |    6 +++++
 src/tree/dzl-tree-private.h |    4 +++
 src/tree/dzl-tree.c         |   15 +++++++++++++
 4 files changed, 75 insertions(+), 0 deletions(-)
---
diff --git a/src/tree/dzl-tree-builder.c b/src/tree/dzl-tree-builder.c
index 457c076..dd8d6d0 100644
--- a/src/tree/dzl-tree-builder.c
+++ b/src/tree/dzl-tree-builder.c
@@ -41,6 +41,8 @@ enum {
   REMOVED,
   BUILD_NODE,
   NODE_ACTIVATED,
+  NODE_COLLAPSED,
+  NODE_EXPANDED,
   NODE_POPUP,
   NODE_SELECTED,
   NODE_UNSELECTED,
@@ -127,6 +129,26 @@ _dzl_tree_builder_removed (DzlTreeBuilder *builder,
 }
 
 void
+_dzl_tree_builder_node_collapsed (DzlTreeBuilder *builder,
+                                  DzlTreeNode    *node)
+{
+       g_return_if_fail (DZL_IS_TREE_BUILDER (builder));
+       g_return_if_fail (DZL_IS_TREE_NODE (node));
+
+  g_signal_emit (builder, signals [NODE_COLLAPSED], 0, node);
+}
+
+void
+_dzl_tree_builder_node_expanded (DzlTreeBuilder *builder,
+                                 DzlTreeNode    *node)
+{
+       g_return_if_fail (DZL_IS_TREE_BUILDER (builder));
+       g_return_if_fail (DZL_IS_TREE_NODE (node));
+
+  g_signal_emit (builder, signals [NODE_EXPANDED], 0, node);
+}
+
+void
 _dzl_tree_builder_set_tree (DzlTreeBuilder *builder,
                             DzlTree        *tree)
 {
@@ -262,6 +284,34 @@ dzl_tree_builder_class_init (DzlTreeBuilderClass *klass)
                   1,
                   DZL_TYPE_TREE_NODE);
 
+  signals [NODE_COLLAPSED] =
+    g_signal_new ("node-collapsed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, node_collapsed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__OBJECT,
+                  G_TYPE_NONE,
+                  1,
+                  DZL_TYPE_TREE_NODE);
+  g_signal_set_va_marshaller (signals [NODE_COLLAPSED],
+                              G_TYPE_FROM_CLASS (klass),
+                              g_cclosure_marshal_VOID__OBJECTv);
+
+  signals [NODE_EXPANDED] =
+    g_signal_new ("node-expanded",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, node_expanded),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__OBJECT,
+                  G_TYPE_NONE,
+                  1,
+                  DZL_TYPE_TREE_NODE);
+  g_signal_set_va_marshaller (signals [NODE_EXPANDED],
+                              G_TYPE_FROM_CLASS (klass),
+                              g_cclosure_marshal_VOID__OBJECTv);
+
   signals [NODE_POPUP] =
     g_signal_new ("node-popup",
                   G_TYPE_FROM_CLASS (klass),
diff --git a/src/tree/dzl-tree-builder.h b/src/tree/dzl-tree-builder.h
index 554af2c..7f3e821 100644
--- a/src/tree/dzl-tree-builder.h
+++ b/src/tree/dzl-tree-builder.h
@@ -47,6 +47,12 @@ struct _DzlTreeBuilderClass
   void     (*node_popup)      (DzlTreeBuilder *builder,
                                DzlTreeNode    *node,
                                GMenu          *menu);
+  void     (*node_expanded)   (DzlTreeBuilder *builder,
+                               DzlTreeNode    *node);
+  void     (*node_collapsed)  (DzlTreeBuilder *builder,
+                               DzlTreeNode    *node);
+
+  gpointer padding[12];
 };
 
 DZL_AVAILABLE_IN_ALL
diff --git a/src/tree/dzl-tree-private.h b/src/tree/dzl-tree-private.h
index 22ce170..ff8928a 100644
--- a/src/tree/dzl-tree-private.h
+++ b/src/tree/dzl-tree-private.h
@@ -75,6 +75,10 @@ void         _dzl_tree_builder_node_selected   (DzlTreeBuilder *builder,
                                                 DzlTreeNode    *node);
 void         _dzl_tree_builder_node_unselected (DzlTreeBuilder *builder,
                                                 DzlTreeNode    *node);
+void         _dzl_tree_builder_node_collapsed  (DzlTreeBuilder *builder,
+                                                DzlTreeNode    *node);
+void         _dzl_tree_builder_node_expanded   (DzlTreeBuilder *builder,
+                                                DzlTreeNode    *node);
 
 G_END_DECLS
 
diff --git a/src/tree/dzl-tree.c b/src/tree/dzl-tree.c
index 711bf5e..596e172 100644
--- a/src/tree/dzl-tree.c
+++ b/src/tree/dzl-tree.c
@@ -594,6 +594,7 @@ dzl_tree_row_expanded (GtkTreeView *tree_view,
                        GtkTreePath *path)
 {
   DzlTree *self = (DzlTree *)tree_view;
+  DzlTreePrivate *priv = dzl_tree_get_instance_private (self);
   GtkTreeModel *model;
   DzlTreeNode *node;
 
@@ -616,6 +617,13 @@ dzl_tree_row_expanded (GtkTreeView *tree_view,
       dzl_tree_node_select (node);
     }
 
+  /* Notify builders of expand */
+  for (guint i = 0; i < priv->builders->len; i++)
+    {
+      DzlTreeBuilder *builder = g_ptr_array_index (priv->builders, i);
+      _dzl_tree_builder_node_expanded (builder, node);
+    }
+
   g_clear_object (&node);
 }
 
@@ -664,6 +672,13 @@ dzl_tree_row_collapsed (GtkTreeView *tree_view,
       _dzl_tree_node_set_needs_build (node, TRUE);
     }
 
+  /* Notify builders of collapse */
+  for (guint i = 0; i < priv->builders->len; i++)
+    {
+      DzlTreeBuilder *builder = g_ptr_array_index (priv->builders, i);
+      _dzl_tree_builder_node_collapsed (builder, node);
+    }
+
   g_clear_object (&node);
 }
 


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