diff options
author | Michael Natterer <mitch@imendio.com> | 2008-10-07 07:44:06 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2008-10-07 07:44:06 +0000 |
commit | 97a9867c9f3f8a20bfef37fc6c9f3af114b4d4c1 (patch) | |
tree | 2922ac39397e82c422c567e405956f3a949ab600 /gtk/gtkhbox.c | |
parent | 8a227df95fd80491e659b5054c4d7faf53d432ac (diff) | |
download | gtk+-97a9867c9f3f8a20bfef37fc6c9f3af114b4d4c1.tar.gz |
Bug 553573 – Add orientation API to GtkBox
2008-10-07 Michael Natterer <mitch@imendio.com>
Bug 553573 – Add orientation API to GtkBox
* gtk/gtkbox.[hh]: implement the GtkOrientable interface and
swallow all code from GtkHBox and GtkVBox. Add gtk_box_new()
which takes a GtkOrientation argument. Also move the newly
added "spacing_set" boolean from struct GtkBox to the new
private struct.
* gtk/gtkhbox.[ch]
* gtk/gtkvbox.[ch]: remove all code except the constructor and
call gtk_orientable_set_orientation() in init().
* gtk/gtk.symbols: add gtk_box_new().
svn path=/trunk/; revision=21596
Diffstat (limited to 'gtk/gtkhbox.c')
-rw-r--r-- | gtk/gtkhbox.c | 277 |
1 files changed, 13 insertions, 264 deletions
diff --git a/gtk/gtkhbox.c b/gtk/gtkhbox.c index 7f806b32fe..b5682f37e6 100644 --- a/gtk/gtkhbox.c +++ b/gtk/gtkhbox.c @@ -21,290 +21,39 @@ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ #include "config.h" + #include "gtkhbox.h" -#include "gtkintl.h" +#include "gtkorientable.h" #include "gtkalias.h" - -static void gtk_hbox_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_hbox_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - - G_DEFINE_TYPE (GtkHBox, gtk_hbox, GTK_TYPE_BOX) static void gtk_hbox_class_init (GtkHBoxClass *class) { - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass*) class; - - widget_class->size_request = gtk_hbox_size_request; - widget_class->size_allocate = gtk_hbox_size_allocate; } static void gtk_hbox_init (GtkHBox *hbox) { -} + gtk_orientable_set_orientation (GTK_ORIENTABLE (hbox), + GTK_ORIENTATION_HORIZONTAL); -GtkWidget* -gtk_hbox_new (gboolean homogeneous, - gint spacing) -{ - GtkHBox *hbox; - - hbox = g_object_new (GTK_TYPE_HBOX, NULL); - - GTK_BOX (hbox)->spacing = spacing; - GTK_BOX (hbox)->homogeneous = homogeneous ? TRUE : FALSE; - - return GTK_WIDGET (hbox); + _gtk_box_set_default_expand (GTK_BOX (hbox)); } - -static void -gtk_hbox_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkBox *box; - GtkBoxChild *child; - GList *children; - gint nvis_children; - gint width; - - box = GTK_BOX (widget); - requisition->width = 0; - requisition->height = 0; - nvis_children = 0; - - children = box->children; - while (children) - { - child = children->data; - children = children->next; - - if (GTK_WIDGET_VISIBLE (child->widget)) - { - GtkRequisition child_requisition; - - gtk_widget_size_request (child->widget, &child_requisition); - - if (box->homogeneous) - { - width = child_requisition.width + child->padding * 2; - requisition->width = MAX (requisition->width, width); - } - else - { - requisition->width += child_requisition.width + child->padding * 2; - } - - requisition->height = MAX (requisition->height, child_requisition.height); - - nvis_children += 1; - } - } - - if (nvis_children > 0) - { - if (box->homogeneous) - requisition->width *= nvis_children; - requisition->width += (nvis_children - 1) * box->spacing; - } - - requisition->width += GTK_CONTAINER (box)->border_width * 2; - requisition->height += GTK_CONTAINER (box)->border_width * 2; -} - -static void -gtk_hbox_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) +GtkWidget * +gtk_hbox_new (gboolean homogeneous, + gint spacing) { - GtkBox *box; - GtkBoxChild *child; - GList *children; - GtkAllocation child_allocation; - gint nvis_children; - gint nexpand_children; - gint child_width; - gint width; - gint extra; - gint x; - GtkTextDirection direction; - - box = GTK_BOX (widget); - widget->allocation = *allocation; - - direction = gtk_widget_get_direction (widget); - - nvis_children = 0; - nexpand_children = 0; - children = box->children; - - while (children) - { - child = children->data; - children = children->next; - - if (GTK_WIDGET_VISIBLE (child->widget)) - { - nvis_children += 1; - if (child->expand) - nexpand_children += 1; - } - } - - if (nvis_children > 0) - { - if (box->homogeneous) - { - width = (allocation->width - - GTK_CONTAINER (box)->border_width * 2 - - (nvis_children - 1) * box->spacing); - extra = width / nvis_children; - } - else if (nexpand_children > 0) - { - width = (gint) allocation->width - (gint) widget->requisition.width; - extra = width / nexpand_children; - } - else - { - width = 0; - extra = 0; - } - - x = allocation->x + GTK_CONTAINER (box)->border_width; - child_allocation.y = allocation->y + GTK_CONTAINER (box)->border_width; - child_allocation.height = MAX (1, (gint) allocation->height - (gint) GTK_CONTAINER (box)->border_width * 2); - - children = box->children; - while (children) - { - child = children->data; - children = children->next; - - if ((child->pack == GTK_PACK_START) && GTK_WIDGET_VISIBLE (child->widget)) - { - if (box->homogeneous) - { - if (nvis_children == 1) - child_width = width; - else - child_width = extra; - - nvis_children -= 1; - width -= extra; - } - else - { - GtkRequisition child_requisition; - - gtk_widget_get_child_requisition (child->widget, &child_requisition); - - child_width = child_requisition.width + child->padding * 2; - - if (child->expand) - { - if (nexpand_children == 1) - child_width += width; - else - child_width += extra; - - nexpand_children -= 1; - width -= extra; - } - } - - if (child->fill) - { - child_allocation.width = MAX (1, (gint) child_width - (gint) child->padding * 2); - child_allocation.x = x + child->padding; - } - else - { - GtkRequisition child_requisition; - - gtk_widget_get_child_requisition (child->widget, &child_requisition); - child_allocation.width = child_requisition.width; - child_allocation.x = x + (child_width - child_allocation.width) / 2; - } - - if (direction == GTK_TEXT_DIR_RTL) - child_allocation.x = allocation->x + allocation->width - (child_allocation.x - allocation->x) - child_allocation.width; - - gtk_widget_size_allocate (child->widget, &child_allocation); - - x += child_width + box->spacing; - } - } - - x = allocation->x + allocation->width - GTK_CONTAINER (box)->border_width; - - children = box->children; - while (children) - { - child = children->data; - children = children->next; - - if ((child->pack == GTK_PACK_END) && GTK_WIDGET_VISIBLE (child->widget)) - { - GtkRequisition child_requisition; - gtk_widget_get_child_requisition (child->widget, &child_requisition); - - if (box->homogeneous) - { - if (nvis_children == 1) - child_width = width; - else - child_width = extra; - - nvis_children -= 1; - width -= extra; - } - else - { - child_width = child_requisition.width + child->padding * 2; - - if (child->expand) - { - if (nexpand_children == 1) - child_width += width; - else - child_width += extra; - - nexpand_children -= 1; - width -= extra; - } - } - - if (child->fill) - { - child_allocation.width = MAX (1, (gint)child_width - (gint)child->padding * 2); - child_allocation.x = x + child->padding - child_width; - } - else - { - child_allocation.width = child_requisition.width; - child_allocation.x = x + (child_width - child_allocation.width) / 2 - child_width; - } - - if (direction == GTK_TEXT_DIR_RTL) - child_allocation.x = allocation->x + allocation->width - (child_allocation.x - allocation->x) - child_allocation.width; - - gtk_widget_size_allocate (child->widget, &child_allocation); - - x -= (child_width + box->spacing); - } - } - } + return g_object_new (GTK_TYPE_HBOX, + "spacing", spacing, + "homogeneous", homogeneous ? TRUE : FALSE, + NULL); } #define __GTK_HBOX_C__ |