summaryrefslogtreecommitdiff
path: root/gtk/gtkhbox.c
diff options
context:
space:
mode:
authorMichael Natterer <mitch@imendio.com>2008-10-07 07:44:06 +0000
committerMichael Natterer <mitch@src.gnome.org>2008-10-07 07:44:06 +0000
commit97a9867c9f3f8a20bfef37fc6c9f3af114b4d4c1 (patch)
tree2922ac39397e82c422c567e405956f3a949ab600 /gtk/gtkhbox.c
parent8a227df95fd80491e659b5054c4d7faf53d432ac (diff)
downloadgtk+-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.c277
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__