static void aspect_bin_remove(GtkContainer *, GtkWidget *);
static void aspect_bin_forall(GtkContainer *, gboolean, GtkCallback, gpointer);
-G_DEFINE_TYPE(AspectBin, aspect_bin, GTK_TYPE_BIN)
+G_DEFINE_TYPE(AspectBin, aspect_bin, GTK_TYPE_CONTAINER)
static void aspect_bin_init(AspectBin *abin)
{
+ GTK_WIDGET_SET_FLAGS(abin, GTK_NO_WINDOW);
+
abin->body = NULL;
+ abin->side = NULL;
abin->ratio = 1;
- abin->constrain = FALSE;
abin->align = 0;
+ abin->constrain = FALSE;
}
static void aspect_bin_class_init(AspectBinClass *class)
AspectBin *abin = ASPECT_BIN(container);
if (abin->body == child) {
- aspect_bin_set_body_widget(abin, NULL, 1);
- } else {
- GTK_CONTAINER_CLASS(aspect_bin_parent_class)->remove
- (container, child);
+ aspect_bin_set_body(abin, NULL, 1);
+ } else if (abin->side == child) {
+ aspect_bin_set_side(abin, NULL);
}
}
gpointer callback_data)
{
AspectBin *abin = ASPECT_BIN(container);
- GtkBin *bin = GTK_BIN(container);
+ g_return_if_fail(callback != NULL);
- if (bin->child)
- callback(bin->child, callback_data);
-
if (abin->body)
callback(abin->body, callback_data);
+ if (abin->side)
+ callback(abin->side, callback_data);
}
static void
aspect_bin_size_request(GtkWidget *widget, GtkRequisition *requisition)
{
AspectBin *abin = ASPECT_BIN(widget);
- GtkBin *bin = GTK_BIN(widget);
GtkRequisition creq = {0}, areq = {0};
- if (bin->child && GTK_WIDGET_VISIBLE(bin->child)) {
- gtk_widget_size_request(bin->child, &creq);
+ if (abin->side && GTK_WIDGET_VISIBLE(abin->side)) {
+ gtk_widget_size_request(abin->side, &creq);
}
if (abin->body && GTK_WIDGET_VISIBLE(abin->body)) {
aspect_bin_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
{
AspectBin *abin = ASPECT_BIN(widget);
- GtkBin *bin = GTK_BIN(widget);
GtkRequisition creq = {0};
GtkAllocation csize = {0}, asize = {0};
-
- /* First find the best fit for the constrained child. */
+
+ /* First find the best fit for the body. */
if (abin->body && GTK_WIDGET_VISIBLE(abin->body)) {
asize.height = allocation->height;
asize.width = asize.height * abin->ratio + 0.5;
}
}
- /* Now try to fit the other child. */
- if (bin->child && GTK_WIDGET_VISIBLE(bin->child)) {
- gtk_widget_get_child_requisition(bin->child, &creq);
+ /* Now try to fit the side. */
+ if (abin->side && GTK_WIDGET_VISIBLE(abin->side)) {
+ gtk_widget_get_child_requisition(abin->side, &creq);
if (allocation->width - asize.width < creq.width) {
/* It didn't fit, squish the constrained guy. */
csize.y = (allocation->height - csize.height) * abin->align + 0.5;
asize.y = (allocation->height - asize.height) * abin->align + 0.5;
- if (bin->child)
- gtk_widget_size_allocate(bin->child, &csize);
if (abin->body)
gtk_widget_size_allocate(abin->body, &asize);
+ if (abin->side)
+ gtk_widget_size_allocate(abin->side, &csize);
}
-void
-aspect_bin_set_body_widget(AspectBin *abin, GtkWidget *widget, gfloat ratio)
+static gboolean
+set_widget(GtkWidget **dest, GtkWidget *parent, GtkWidget *widget)
{
gboolean need_resize = FALSE;
- g_return_if_fail(IS_ASPECT_BIN(abin));
- g_return_if_fail(widget == NULL || GTK_IS_WIDGET(widget));
- g_return_if_fail(widget == NULL || widget->parent == NULL);
+ if (*dest == widget)
+ return FALSE;
- if (abin->body == widget)
- return;
-
- if (abin->body) {
- need_resize |= GTK_WIDGET_VISIBLE(abin->body);
- gtk_widget_unparent(abin->body);
+ if (*dest) {
+ need_resize |= GTK_WIDGET_VISIBLE(*dest);
+ gtk_widget_unparent(*dest);
}
- abin->body = widget;
+ *dest = widget;
if (widget) {
- gtk_widget_set_parent(widget, GTK_WIDGET(abin));
+ gtk_widget_set_parent(widget, parent);
need_resize |= GTK_WIDGET_VISIBLE(widget);
}
- if (GTK_WIDGET_VISIBLE(abin) && need_resize)
+ return GTK_WIDGET_VISIBLE(parent) && need_resize;
+}
+
+void aspect_bin_set_body(AspectBin *abin, GtkWidget *widget, gfloat ratio)
+{
+ g_return_if_fail(IS_ASPECT_BIN(abin));
+ g_return_if_fail(widget == NULL || GTK_IS_WIDGET(widget));
+ g_return_if_fail(widget == NULL || widget->parent == NULL);
+
+ if (set_widget(&abin->body, GTK_WIDGET(abin), widget))
+ gtk_widget_queue_resize(GTK_WIDGET(abin));
+}
+
+void aspect_bin_set_side(AspectBin *abin, GtkWidget *widget)
+{
+ g_return_if_fail(IS_ASPECT_BIN(abin));
+ g_return_if_fail(widget == NULL || GTK_IS_WIDGET(widget));
+ g_return_if_fail(widget == NULL || widget->parent == NULL);
+
+ if (set_widget(&abin->side, GTK_WIDGET(abin), widget))
gtk_widget_queue_resize(GTK_WIDGET(abin));
}