[libdazzle] tree-builder: add signals for DnD operations



commit 4b90ae552e444a67935b74f4ec215a774fb9d670
Author: Christian Hergert <chergert redhat com>
Date:   Tue Dec 5 02:08:53 2017 -0800

    tree-builder: add signals for DnD operations
    
    These allow us to do some common operations through the builders
    that we can use to plumb DnD into the node design.

 src/tree/dzl-tree-builder.c |  153 ++++++++++++++++++++++++++++++++++++++++++-
 src/tree/dzl-tree-builder.h |   18 +++++
 src/tree/dzl-tree-private.h |   17 +++++
 3 files changed, 187 insertions(+), 1 deletions(-)
---
diff --git a/src/tree/dzl-tree-builder.c b/src/tree/dzl-tree-builder.c
index c7fa463..b9e360c 100644
--- a/src/tree/dzl-tree-builder.c
+++ b/src/tree/dzl-tree-builder.c
@@ -20,6 +20,8 @@
 
 #include <glib/gi18n.h>
 
+#include "dzl-enums.h"
+
 #include "tree/dzl-tree.h"
 #include "tree/dzl-tree-builder.h"
 #include "util/dzl-macros.h"
@@ -41,8 +43,13 @@ enum {
   ADDED,
   REMOVED,
   BUILD_NODE,
+  DRAG_DATA_RECEIVED,
+  DRAG_NODE_RECEIVED,
   NODE_ACTIVATED,
   NODE_COLLAPSED,
+  NODE_DRAGGABLE,
+  NODE_DROPPABLE,
+  DRAG_DATA_GET,
   NODE_EXPANDED,
   NODE_POPUP,
   NODE_SELECTED,
@@ -149,6 +156,92 @@ _dzl_tree_builder_node_expanded (DzlTreeBuilder *builder,
   g_signal_emit (builder, signals [NODE_EXPANDED], 0, node);
 }
 
+gboolean
+_dzl_tree_builder_drag_node_received (DzlTreeBuilder      *builder,
+                                      DzlTreeNode         *drag_node,
+                                      DzlTreeNode         *drop_node,
+                                      DzlTreeDropPosition  position,
+                                      GtkSelectionData    *data)
+{
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (DZL_IS_TREE_BUILDER (builder), FALSE);
+  g_return_val_if_fail (DZL_IS_TREE_NODE (drag_node), FALSE);
+  g_return_val_if_fail (DZL_IS_TREE_NODE (drop_node), FALSE);
+  g_return_val_if_fail (data != NULL, FALSE);
+
+  g_signal_emit (builder, signals [DRAG_NODE_RECEIVED], 0,
+                 drag_node, drop_node, position, data,
+                 &ret);
+
+  return ret;
+}
+
+gboolean
+_dzl_tree_builder_node_draggable (DzlTreeBuilder *builder,
+                                  DzlTreeNode    *node)
+{
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (DZL_IS_TREE_BUILDER (builder), FALSE);
+  g_return_val_if_fail (DZL_IS_TREE_NODE (node), FALSE);
+
+  g_signal_emit (builder, signals [NODE_DRAGGABLE], 0, node, &ret);
+
+  return ret;
+}
+
+gboolean
+_dzl_tree_builder_node_droppable (DzlTreeBuilder   *builder,
+                                  DzlTreeNode      *node,
+                                  GtkSelectionData *data)
+{
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (DZL_IS_TREE_BUILDER (builder), FALSE);
+  g_return_val_if_fail (DZL_IS_TREE_NODE (node), FALSE);
+  g_return_val_if_fail (data != NULL, FALSE);
+
+  g_signal_emit (builder, signals [NODE_DROPPABLE], 0, node, data, &ret);
+
+  return ret;
+}
+
+gboolean
+_dzl_tree_builder_drag_data_get (DzlTreeBuilder   *builder,
+                                 DzlTreeNode      *node,
+                                 GtkSelectionData *data)
+{
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (DZL_IS_TREE_BUILDER (builder), FALSE);
+  g_return_val_if_fail (DZL_IS_TREE_NODE (node), FALSE);
+  g_return_val_if_fail (data != NULL, FALSE);
+
+  g_signal_emit (builder, signals [DRAG_DATA_GET], 0, node, data, &ret);
+
+  return ret;
+}
+
+gboolean
+_dzl_tree_builder_drag_data_received (DzlTreeBuilder      *builder,
+                                      DzlTreeNode         *drop_node,
+                                      DzlTreeDropPosition  position,
+                                      GtkSelectionData    *data)
+{
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (DZL_IS_TREE_BUILDER (builder), FALSE);
+  g_return_val_if_fail (DZL_IS_TREE_NODE (drop_node), FALSE);
+  g_return_val_if_fail (data != NULL, FALSE);
+
+  g_signal_emit (builder, signals [DRAG_DATA_RECEIVED], 0,
+                 drop_node, position, data,
+                 &ret);
+
+  return ret;
+}
+
 void
 _dzl_tree_builder_set_tree (DzlTreeBuilder *builder,
                             DzlTree        *tree)
@@ -169,7 +262,7 @@ _dzl_tree_builder_set_tree (DzlTreeBuilder *builder,
  *
  * Gets the tree that owns the builder.
  *
- * Returns: (transfer none) (type DzlTree) (nullable): A #DzlTree or %NULL.
+ * Returns: (transfer none) (nullable): A #DzlTree or %NULL.
  */
 DzlTree *
 dzl_tree_builder_get_tree (DzlTreeBuilder *builder)
@@ -257,6 +350,19 @@ dzl_tree_builder_class_init (DzlTreeBuilderClass *klass)
                               G_TYPE_FROM_CLASS (klass),
                               g_cclosure_marshal_VOID__OBJECTv);
 
+  signals [DRAG_NODE_RECEIVED] =
+    g_signal_new ("drag-node-received",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, drag_node_received),
+                  NULL, NULL, NULL,
+                  G_TYPE_BOOLEAN,
+                  4,
+                  DZL_TYPE_TREE_NODE,
+                  DZL_TYPE_TREE_NODE,
+                  DZL_TYPE_TREE_DROP_POSITION,
+                  GTK_TYPE_SELECTION_DATA);
+
   signals [NODE_ACTIVATED] =
     g_signal_new ("node-activated",
                   G_TYPE_FROM_CLASS (klass),
@@ -267,6 +373,51 @@ dzl_tree_builder_class_init (DzlTreeBuilderClass *klass)
                   1,
                   DZL_TYPE_TREE_NODE);
 
+  signals [NODE_DRAGGABLE] =
+    g_signal_new ("node-draggable",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, node_draggable),
+                  g_signal_accumulator_true_handled, NULL,
+                  NULL,
+                  G_TYPE_BOOLEAN,
+                  1, DZL_TYPE_TREE_NODE);
+
+  signals [DRAG_DATA_GET] =
+    g_signal_new ("drag-data-get",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, drag_data_get),
+                  g_signal_accumulator_true_handled, NULL,
+                  NULL,
+                  G_TYPE_BOOLEAN,
+                  2,
+                  DZL_TYPE_TREE_NODE,
+                  GTK_TYPE_SELECTION_DATA);
+
+  signals [DRAG_DATA_RECEIVED] =
+    g_signal_new ("drag-data-received",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, drag_data_received),
+                  g_signal_accumulator_true_handled, NULL,
+                  NULL,
+                  G_TYPE_BOOLEAN,
+                  3,
+                  DZL_TYPE_TREE_NODE,
+                  DZL_TYPE_TREE_DROP_POSITION,
+                  GTK_TYPE_SELECTION_DATA);
+
+  signals [NODE_DROPPABLE] =
+    g_signal_new ("node-droppable",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlTreeBuilderClass, node_droppable),
+                  g_signal_accumulator_true_handled, NULL,
+                  NULL,
+                  G_TYPE_BOOLEAN,
+                  2, DZL_TYPE_TREE_NODE, GTK_TYPE_SELECTION_DATA);
+
   signals [NODE_COLLAPSED] =
     g_signal_new ("node-collapsed",
                   G_TYPE_FROM_CLASS (klass),
diff --git a/src/tree/dzl-tree-builder.h b/src/tree/dzl-tree-builder.h
index 596fc1d..ba2c47d 100644
--- a/src/tree/dzl-tree-builder.h
+++ b/src/tree/dzl-tree-builder.h
@@ -52,6 +52,24 @@ struct _DzlTreeBuilderClass
   void     (*node_collapsed)          (DzlTreeBuilder   *builder,
                                        DzlTreeNode      *node);
 
+  gboolean (*node_draggable)          (DzlTreeBuilder   *builder,
+                                       DzlTreeNode      *node);
+  gboolean (*node_droppable)          (DzlTreeBuilder   *builder,
+                                       DzlTreeNode      *node,
+                                       GtkSelectionData *data);
+  gboolean (*drag_data_get)           (DzlTreeBuilder   *builder     ,
+                                       DzlTreeNode      *node,
+                                       GtkSelectionData *data);
+  gboolean (*drag_node_received)      (DzlTreeBuilder      *builder,
+                                       DzlTreeNode         *drag_node,
+                                       DzlTreeNode         *drop_node,
+                                       DzlTreeDropPosition  position,
+                                       GtkSelectionData    *data);
+  gboolean (*drag_data_received)      (DzlTreeBuilder      *builder,
+                                       DzlTreeNode         *drop_node,
+                                       DzlTreeDropPosition  position,
+                                       GtkSelectionData    *data);
+
   /*< private >*/
   gpointer _padding[12];
 };
diff --git a/src/tree/dzl-tree-private.h b/src/tree/dzl-tree-private.h
index da779c6..956ab13 100644
--- a/src/tree/dzl-tree-private.h
+++ b/src/tree/dzl-tree-private.h
@@ -66,6 +66,18 @@ void          _dzl_tree_builder_removed                 (DzlTreeBuilder
                                                          DzlTree                *tree);
 void          _dzl_tree_builder_build_node              (DzlTreeBuilder         *builder,
                                                          DzlTreeNode            *node);
+gboolean      _dzl_tree_builder_drag_data_get           (DzlTreeBuilder         *builder,
+                                                         DzlTreeNode            *node,
+                                                         GtkSelectionData       *data);
+gboolean      _dzl_tree_builder_drag_data_received      (DzlTreeBuilder         *builder,
+                                                         DzlTreeNode            *drop_node,
+                                                         DzlTreeDropPosition     position,
+                                                         GtkSelectionData       *data);
+gboolean      _dzl_tree_builder_drag_node_received      (DzlTreeBuilder         *builder,
+                                                         DzlTreeNode            *drag_node,
+                                                         DzlTreeNode            *drop_node,
+                                                         DzlTreeDropPosition     position,
+                                                         GtkSelectionData       *data);
 gboolean      _dzl_tree_builder_node_activated          (DzlTreeBuilder         *builder,
                                                          DzlTreeNode            *node);
 void          _dzl_tree_builder_node_popup              (DzlTreeBuilder         *builder,
@@ -79,6 +91,11 @@ void          _dzl_tree_builder_node_collapsed          (DzlTreeBuilder
                                                          DzlTreeNode            *node);
 void          _dzl_tree_builder_node_expanded           (DzlTreeBuilder         *builder,
                                                          DzlTreeNode            *node);
+gboolean      _dzl_tree_builder_node_draggable          (DzlTreeBuilder         *builder,
+                                                         DzlTreeNode            *node);
+gboolean      _dzl_tree_builder_node_droppable          (DzlTreeBuilder         *builder,
+                                                         DzlTreeNode            *node,
+                                                         GtkSelectionData       *data);
 
 G_END_DECLS
 


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