forked from AuroraMiddleware/gtk
5cbf6f5fbd
Layout managers needs a way to store properties that control the layout policy of a widget; typically, we used to store these in GtkContainer's child properties, but since GtkLayoutManager is decoupled from the actual container widget, we need a separate storage. Additionally, child properties have their own downsides, like requiring a separate, global GParamSpecPool storage, and additional lookup API. GtkLayoutChild is a simple GObject class, which means you can introspect and document it as you would any other type.
190 lines
5.3 KiB
C
190 lines
5.3 KiB
C
#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;
|
|
}
|