[gnome-builder] libide/tweaks: start on GtkBuildable support



commit ef600750ba2097d1532e68ac79b5f8f54106239d
Author: Christian Hergert <chergert redhat com>
Date:   Sat Jul 30 20:42:11 2022 -0700

    libide/tweaks: start on GtkBuildable support
    
    We want to handle a number of situations through IdeTweaksItemClass instead
    of each class implementing the interface. However, we're just a general
    graph so we can manage the append/etc functions directly for now.

 src/libide/tweaks/ide-tweaks-item.c | 59 ++++++++++++++++++++++++++++++++++++-
 src/libide/tweaks/ide-tweaks-item.h |  3 ++
 2 files changed, 61 insertions(+), 1 deletion(-)
---
diff --git a/src/libide/tweaks/ide-tweaks-item.c b/src/libide/tweaks/ide-tweaks-item.c
index a5f48cb90..7e5a7856a 100644
--- a/src/libide/tweaks/ide-tweaks-item.c
+++ b/src/libide/tweaks/ide-tweaks-item.c
@@ -22,6 +22,8 @@
 
 #include "config.h"
 
+#include <gtk/gtk.h>
+
 #include "ide-tweaks-item.h"
 
 typedef struct
@@ -42,7 +44,11 @@ enum {
   N_PROPS
 };
 
-G_DEFINE_ABSTRACT_TYPE (IdeTweaksItem, ide_tweaks_item, G_TYPE_OBJECT)
+static void buildable_iface_init (GtkBuildableIface *iface);
+
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (IdeTweaksItem, ide_tweaks_item, G_TYPE_OBJECT,
+                                  G_ADD_PRIVATE (IdeTweaksItem)
+                                  G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, buildable_iface_init))
 
 static GParamSpec *properties [N_PROPS];
 
@@ -155,6 +161,19 @@ ide_tweaks_item_class_init (IdeTweaksItemClass *klass)
 static void
 ide_tweaks_item_init (IdeTweaksItem *self)
 {
+  IdeTweaksItemPrivate *priv = ide_tweaks_item_get_instance_private (self);
+
+  priv->link.data = self;
+}
+
+static gboolean
+ide_tweaks_item_accepts (IdeTweaksItem *self,
+                         IdeTweaksItem *child)
+{
+  if (IDE_TWEAKS_ITEM_GET_CLASS (self)->accepts)
+    return IDE_TWEAKS_ITEM_GET_CLASS (self)->accepts (self, child);
+
+  return FALSE;
 }
 
 const char *
@@ -332,6 +351,8 @@ ide_tweaks_item_insert_after (IdeTweaksItem *self,
   g_return_if_fail (parent_priv->link.data == parent);
   g_return_if_fail (priv->parent == NULL);
 
+  g_object_ref (self);
+
   priv->parent = parent;
 
   if (previous_sibling != NULL)
@@ -367,6 +388,8 @@ ide_tweaks_item_insert_before (IdeTweaksItem *self,
   g_return_if_fail (parent_priv->link.data == parent);
   g_return_if_fail (priv->parent == NULL);
 
+  g_object_ref (self);
+
   priv->parent = parent;
 
   if (next_sibling != NULL)
@@ -414,3 +437,37 @@ ide_tweaks_item_unparent (IdeTweaksItem *self)
 
   g_object_unref (self);
 }
+
+static void
+ide_tweaks_item_add_child (GtkBuildable *buildable,
+                           GtkBuilder   *builder,
+                           GObject      *child,
+                           const char   *type)
+{
+  IdeTweaksItem *self = (IdeTweaksItem *)buildable;
+
+  g_assert (IDE_IS_TWEAKS_ITEM (self));
+  g_assert (G_IS_OBJECT (child));
+
+  if (!IDE_IS_TWEAKS_ITEM (child))
+    {
+      g_warning ("Attempt to add %s as child of %s, which is not an IdeTweaksItem",
+                 G_OBJECT_TYPE_NAME (child), G_OBJECT_TYPE_NAME (self));
+      return;
+    }
+
+  if (!ide_tweaks_item_accepts (self, IDE_TWEAKS_ITEM (child)))
+    {
+      g_warning ("Attempt to add %s as child of %s, but that is not allowed",
+                 G_OBJECT_TYPE_NAME (child), G_OBJECT_TYPE_NAME (self));
+      return;
+    }
+
+  ide_tweaks_item_insert_after (IDE_TWEAKS_ITEM (child), self, NULL);
+}
+
+static void
+buildable_iface_init (GtkBuildableIface *iface)
+{
+  iface->add_child = ide_tweaks_item_add_child;
+}
diff --git a/src/libide/tweaks/ide-tweaks-item.h b/src/libide/tweaks/ide-tweaks-item.h
index 20fd79943..eeccab0d6 100644
--- a/src/libide/tweaks/ide-tweaks-item.h
+++ b/src/libide/tweaks/ide-tweaks-item.h
@@ -36,6 +36,9 @@ G_DECLARE_DERIVABLE_TYPE (IdeTweaksItem, ide_tweaks_item, IDE, TWEAKS_ITEM, GObj
 struct _IdeTweaksItemClass
 {
   GObjectClass parent_class;
+
+  gboolean (*accepts) (IdeTweaksItem *self,
+                       IdeTweaksItem *child);
 };
 
 IDE_AVAILABLE_IN_ALL


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