X-Git-Url: http://git.draconx.ca/gitweb/aspectbin.git/blobdiff_plain/4b6acfc09d3af7822977aedd04dfadd47aa210d9..b8806b4988a36fbcdc3cc2f9ab35af6ab0e3147f:/aspectbin.c diff --git a/aspectbin.c b/aspectbin.c index 1b2af29..8ab752c 100644 --- a/aspectbin.c +++ b/aspectbin.c @@ -1,10 +1,21 @@ #include #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) @@ -21,14 +32,28 @@ static void aspect_bin_init(AspectBin *abin) 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) @@ -36,6 +61,53 @@ 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); @@ -61,6 +133,13 @@ static void aspect_bin_forall(GtkContainer *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) { @@ -174,3 +253,15 @@ void aspect_bin_set_side(AspectBin *abin, GtkWidget *widget) if (set_widget(&abin->side, GTK_WIDGET(abin), widget)) gtk_widget_queue_resize(GTK_WIDGET(abin)); } + +GtkWidget *aspect_bin_get_body(AspectBin *abin) +{ + g_return_val_if_fail(IS_ASPECT_BIN(abin), NULL); + return abin->body; +} + +GtkWidget *aspect_bin_get_side(AspectBin *abin) +{ + g_return_val_if_fail(IS_ASPECT_BIN(abin), NULL); + return abin->side; +}