#include <stdio.h>
#include "aspectbin.h"
+enum {
+ PROP_0,
+ PROP_CONSTRAIN,
+};
+
static void aspect_bin_size_request(GtkWidget *, GtkRequisition *);
static void aspect_bin_size_allocate(GtkWidget *, GtkAllocation *);
+static void aspect_bin_add(GtkContainer *, GtkWidget *);
static void aspect_bin_remove(GtkContainer *, GtkWidget *);
static void aspect_bin_forall(GtkContainer *, gboolean, GtkCallback, gpointer);
+static GType aspect_bin_child_type(GtkContainer *);
+
+static void aspect_bin_get_property(GObject *, guint, GValue *, GParamSpec *);
+static void aspect_bin_set_property(GObject *, guint, const GValue *,
+ GParamSpec *);
G_DEFINE_TYPE(AspectBin, aspect_bin, GTK_TYPE_CONTAINER)
static void aspect_bin_class_init(AspectBinClass *class)
{
+ GObjectClass *object_class = G_OBJECT_CLASS(class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS(class);
widget_class->size_request = aspect_bin_size_request;
widget_class->size_allocate = aspect_bin_size_allocate;
- container_class->remove = aspect_bin_remove;
- container_class->forall = aspect_bin_forall;
+ container_class->add = aspect_bin_add;
+ container_class->remove = aspect_bin_remove;
+ container_class->forall = aspect_bin_forall;
+ container_class->child_type = aspect_bin_child_type;
+
+ object_class->set_property = aspect_bin_set_property;
+ object_class->get_property = aspect_bin_get_property;
+
+ g_object_class_install_property(object_class, PROP_CONSTRAIN,
+ g_param_spec_boolean("constrain",
+ "Constrain",
+ "TRUE if side child should expand only as much as the"
+ " body",
+ FALSE,
+ G_PARAM_READWRITE));
}
GtkWidget *aspect_bin_new(void)
return GTK_WIDGET(g_object_new(ASPECT_BIN_TYPE, NULL));
}
+static void aspect_bin_set_property(GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ AspectBin *abin = ASPECT_BIN(object);
+
+ switch (prop_id) {
+ case PROP_CONSTRAIN:
+ abin->constrain = g_value_get_boolean(value);
+ gtk_widget_queue_resize(GTK_WIDGET(abin));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void aspect_bin_get_property(GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ AspectBin *abin = ASPECT_BIN(object);
+
+ switch (prop_id) {
+ case PROP_CONSTRAIN:
+ g_value_set_boolean(value, abin->constrain);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void aspect_bin_add(GtkContainer *container, GtkWidget *widget)
+{
+ AspectBin *abin;
+ g_return_if_fail(IS_ASPECT_BIN(container));
+ abin = ASPECT_BIN(container);
+
+ if (!abin->body)
+ aspect_bin_set_body(abin, widget, 1);
+ else if (!abin->side)
+ aspect_bin_set_side(abin, widget);
+ else
+ g_warning("AspectBin cannot have more than 2 children.\n");
+}
+
static void aspect_bin_remove(GtkContainer *container, GtkWidget *child)
{
AspectBin *abin = ASPECT_BIN(container);
callback(abin->side, callback_data);
}
+static GType aspect_bin_child_type(GtkContainer *container)
+{
+ if (!ASPECT_BIN(container)->body || !ASPECT_BIN(container)->side)
+ return GTK_TYPE_WIDGET;
+ return G_TYPE_NONE;
+}
+
static void
aspect_bin_size_request(GtkWidget *widget, GtkRequisition *requisition)
{