]> git.draconx.ca Git - aspectbin.git/blobdiff - aspectbin.c
Add constrain as a GObject property.
[aspectbin.git] / aspectbin.c
index 1b2af29095e9d65dd86101b635b827f84f7e232c..2ce72bdf82a4f5bda7ec4c021e246601d08ce6fa 100644 (file)
@@ -1,10 +1,21 @@
 #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)
 
@@ -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)
 {