[gnome-builder] libide/tweaks: start on GtkBuildable support
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide/tweaks: start on GtkBuildable support
- Date: Sun, 31 Jul 2022 03:45:00 +0000 (UTC)
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]