summaryrefslogtreecommitdiff
path: root/gtk/gtklayoutchild.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtklayoutchild.c')
-rw-r--r--gtk/gtklayoutchild.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/gtk/gtklayoutchild.c b/gtk/gtklayoutchild.c
new file mode 100644
index 0000000000..028e80273a
--- /dev/null
+++ b/gtk/gtklayoutchild.c
@@ -0,0 +1,189 @@
+#include "config.h"
+
+#include "gtklayoutchild.h"
+
+#include "gtklayoutmanager.h"
+#include "gtkprivate.h"
+
+/**
+ * SECTION:gtklayoutchild
+ * @Title: GtkLayoutChild
+ * @Short_description: An object containing layout properties
+ *
+ * #GtkLayoutChild is the base class for objects that are meant to hold
+ * layout properties. If a #GtkLayoutManager has per-child properties,
+ * like their packing type, or the horizontal and vertical span, or the
+ * icon name, then the layout manager should use a #GtkLayoutChild
+ * implementation to store those properties.
+ *
+ * A #GtkLayoutChild instance is only ever valid while a widget is part
+ * of a layout.
+ */
+
+typedef struct {
+ GtkLayoutManager *manager;
+ GtkWidget *widget;
+} GtkLayoutChildPrivate;
+
+G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkLayoutChild, gtk_layout_child, G_TYPE_OBJECT)
+
+enum {
+ PROP_LAYOUT_MANAGER = 1,
+ PROP_CHILD_WIDGET,
+
+ N_PROPS
+};
+
+static GParamSpec *layout_child_properties[N_PROPS];
+
+static void
+gtk_layout_child_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtkLayoutChild *layout_child = GTK_LAYOUT_CHILD (gobject);
+ GtkLayoutChildPrivate *priv = gtk_layout_child_get_instance_private (layout_child);
+
+ switch (prop_id)
+ {
+ case PROP_LAYOUT_MANAGER:
+ priv->manager = g_value_get_object (value);
+ break;
+
+ case PROP_CHILD_WIDGET:
+ priv->widget = g_value_get_object (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ }
+}
+
+static void
+gtk_layout_child_get_property (GObject *gobject,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkLayoutChild *layout_child = GTK_LAYOUT_CHILD (gobject);
+ GtkLayoutChildPrivate *priv = gtk_layout_child_get_instance_private (layout_child);
+
+ switch (prop_id)
+ {
+ case PROP_LAYOUT_MANAGER:
+ g_value_set_object (value, priv->manager);
+ break;
+
+ case PROP_CHILD_WIDGET:
+ g_value_set_object (value, priv->widget);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ }
+}
+
+static void
+gtk_layout_child_constructed (GObject *gobject)
+{
+ GtkLayoutChild *layout_child = GTK_LAYOUT_CHILD (gobject);
+ GtkLayoutChildPrivate *priv = gtk_layout_child_get_instance_private (layout_child);
+
+ G_OBJECT_CLASS (gtk_layout_child_parent_class)->constructed (gobject);
+
+ if (priv->manager == NULL)
+ {
+ g_critical ("The layout child of type %s does not have "
+ "the GtkLayoutChild:layout-manager property set",
+ G_OBJECT_TYPE_NAME (gobject));
+ return;
+ }
+
+ if (priv->widget == NULL)
+ {
+ g_critical ("The layout child of type %s does not have "
+ "the GtkLayoutChild:child-widget property set",
+ G_OBJECT_TYPE_NAME (gobject));
+ return;
+ }
+}
+
+static void
+gtk_layout_child_class_init (GtkLayoutChildClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = gtk_layout_child_set_property;
+ gobject_class->get_property = gtk_layout_child_get_property;
+ gobject_class->constructed = gtk_layout_child_constructed;
+
+ /**
+ * GtkLayoutChild:layout-manager:
+ *
+ * The layout manager that created the #GtkLayoutChild instance.
+ */
+ layout_child_properties[PROP_LAYOUT_MANAGER] =
+ g_param_spec_object ("layout-manager",
+ "Layout Manager",
+ "The layout manager that created this object",
+ GTK_TYPE_LAYOUT_MANAGER,
+ GTK_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY);
+ /**
+ * GtkLayoutChild:child-widget:
+ *
+ * The widget that is associated to the #GtkLayoutChild instance.
+ */
+ layout_child_properties[PROP_CHILD_WIDGET] =
+ g_param_spec_object ("child-widget",
+ "Child Widget",
+ "The child widget that is associated to this object",
+ GTK_TYPE_WIDGET,
+ GTK_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY);
+
+ g_object_class_install_properties (gobject_class, N_PROPS, layout_child_properties);
+}
+
+static void
+gtk_layout_child_init (GtkLayoutChild *self)
+{
+}
+
+/**
+ * gtk_layout_child_get_layout_manager:
+ * @layout_child: a #GtkLayoutChild
+ *
+ * Retrieves the #GtkLayoutManager instance that created the
+ * given @layout_child.
+ *
+ * Returns: (transfer none): a #GtkLayoutManager
+ */
+GtkLayoutManager *
+gtk_layout_child_get_layout_manager (GtkLayoutChild *layout_child)
+{
+ GtkLayoutChildPrivate *priv = gtk_layout_child_get_instance_private (layout_child);
+
+ g_return_val_if_fail (GTK_IS_LAYOUT_CHILD (layout_child), NULL);
+
+ return priv->manager;
+}
+
+/**
+ * gtk_layout_child_get_child_widget:
+ * @layout_child: a #GtkLayoutChild
+ *
+ * Retrieves the #GtkWidget associated to the given @layout_child.
+ *
+ * Returns: (transfer none): a #GtkWidget
+ */
+GtkWidget *
+gtk_layout_child_get_child_widget (GtkLayoutChild *layout_child)
+{
+ GtkLayoutChildPrivate *priv = gtk_layout_child_get_instance_private (layout_child);
+
+ g_return_val_if_fail (GTK_IS_LAYOUT_CHILD (layout_child), NULL);
+
+ return priv->widget;
+}