diff options
author | Matthias Clasen <mclasen@redhat.com> | 2005-02-11 07:15:11 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2005-02-11 07:15:11 +0000 |
commit | 812e0cfdb7f987040fadae5f8e9fa47c153aac0e (patch) | |
tree | a34d385ac8d5abb42891c76de1b1939dedd24f3f /gtk/gtkmenuitem.c | |
parent | 1c10200c25fb28af6058810efdd4e1ad0fc50a78 (diff) | |
download | gtk+-812e0cfdb7f987040fadae5f8e9fa47c153aac0e.tar.gz |
Support vertical menubars (#166632):
2005-02-11 Matthias Clasen <mclasen@redhat.com>
Support vertical menubars (#166632):
* gtk/gtkenums.h (GtkPackDirection): New enumeration for pack
directions, with values for left-to-right, right-to-left,
top-to-bottom and bottom-to-top.
* gtk/gtk.symbols:
* gtk/gtkmenubar.h:
* gtk/gtkmenubar.c: Add two properties, pack-direction and
child-pack-direction, which specify how children and
grandchildren of a menubar are packed, with getters and setters.
* gtk/gtkmenubar.c (gtk_menu_bar_set_property):
(gtk_menu_bar_get_property): Implement set_property and get_property.
* gtk/gtkmenubar.c (gtk_menu_bar_size_request):
(gtk_menu_bar_size_allocate): Take pack direction into account.
* gtk/gtkmenubar.c (gtk_menu_bar_move_current): Implement
move_current here move all the menubar-specific direction
tweaking from the generic menushell implementation here.
* gtk/gtkmenu.c (gtk_menu_move_current): Move menu-specific
direction tweaking from the generic menushell implementation here.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request):
(gtk_menu_bar_size_allocate): Take pack direction into account.
* gtk/gtkimagemenuitem.c (gtk_image_menu_item_size_request)
(gtk_image_menu_item_size_allocate):
(gtk_image_menu_item_toggle_size_request): Take child pack
direction into account and pack the image vertically if
necessary.
* gtk/gtkmenushell.c (gtk_menu_shell_real_select_item):
Set the submenu direction to left-right for menuitems in
vertical menubars.
(gtk_real_menu_shell_move_current): Simplify by moving
direction tweaking to menu- and menubar-specific
implementations. Take pack direction into account when
doing fallbacks.
* tests/testmenubars.c: Test menubars in various packing
direction combinations.
* tests/Makefile.am (noinst_PROGRAMS): Add testmenubars.
Diffstat (limited to 'gtk/gtkmenuitem.c')
-rw-r--r-- | gtk/gtkmenuitem.c | 73 |
1 files changed, 63 insertions, 10 deletions
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index c0b966fa6d..a06ddf4874 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -498,6 +498,8 @@ gtk_menu_item_size_request (GtkWidget *widget, GtkBin *bin; guint accel_width; guint horizontal_padding; + GtkPackDirection pack_dir; + GtkPackDirection child_pack_dir; g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (requisition != NULL); @@ -509,11 +511,29 @@ gtk_menu_item_size_request (GtkWidget *widget, bin = GTK_BIN (widget); menu_item = GTK_MENU_ITEM (widget); + if (GTK_IS_MENU_BAR (widget->parent)) + { + pack_dir = gtk_menu_bar_get_pack_direction (GTK_MENU_BAR (widget->parent)); + child_pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (widget->parent)); + } + else + { + pack_dir = GTK_PACK_DIRECTION_LTR; + child_pack_dir = GTK_PACK_DIRECTION_LTR; + } + requisition->width = (GTK_CONTAINER (widget)->border_width + - widget->style->xthickness + horizontal_padding) * 2; + widget->style->xthickness) * 2; requisition->height = (GTK_CONTAINER (widget)->border_width + widget->style->ythickness) * 2; + if ((pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL) && + (child_pack_dir == GTK_PACK_DIRECTION_LTR || child_pack_dir == GTK_PACK_DIRECTION_RTL)) + requisition->width += 2 * horizontal_padding; + else if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) && + (child_pack_dir == GTK_PACK_DIRECTION_TTB || child_pack_dir == GTK_PACK_DIRECTION_BTT)) + requisition->height += 2 * horizontal_padding; + if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { GtkRequisition child_requisition; @@ -558,6 +578,8 @@ gtk_menu_item_size_allocate (GtkWidget *widget, GtkBin *bin; GtkAllocation child_allocation; GtkTextDirection direction; + GtkPackDirection pack_dir; + GtkPackDirection child_pack_dir; g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (allocation != NULL); @@ -567,6 +589,17 @@ gtk_menu_item_size_allocate (GtkWidget *widget, direction = gtk_widget_get_direction (widget); + if (GTK_IS_MENU_BAR (widget->parent)) + { + pack_dir = gtk_menu_bar_get_pack_direction (GTK_MENU_BAR (widget->parent)); + child_pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (widget->parent)); + } + else + { + pack_dir = GTK_PACK_DIRECTION_LTR; + child_pack_dir = GTK_PACK_DIRECTION_LTR; + } + widget->allocation = *allocation; if (bin->child) @@ -577,17 +610,34 @@ gtk_menu_item_size_allocate (GtkWidget *widget, gtk_widget_style_get (widget, "horizontal_padding", &horizontal_padding, NULL); + + child_allocation.x = GTK_CONTAINER (widget)->border_width + widget->style->xthickness; + child_allocation.y = GTK_CONTAINER (widget)->border_width + widget->style->ythickness; + + if ((pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL) && + (child_pack_dir == GTK_PACK_DIRECTION_LTR || child_pack_dir == GTK_PACK_DIRECTION_RTL)) + child_allocation.x += horizontal_padding; + else if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) && + (child_pack_dir == GTK_PACK_DIRECTION_TTB || child_pack_dir == GTK_PACK_DIRECTION_BTT)) + child_allocation.y += horizontal_padding; - child_allocation.x = (GTK_CONTAINER (widget)->border_width + - widget->style->xthickness + - horizontal_padding); - child_allocation.y = (GTK_CONTAINER (widget)->border_width + - widget->style->ythickness); child_allocation.width = MAX (1, (gint)allocation->width - child_allocation.x * 2); child_allocation.height = MAX (1, (gint)allocation->height - child_allocation.y * 2); - if (direction == GTK_TEXT_DIR_LTR) - child_allocation.x += GTK_MENU_ITEM (widget)->toggle_size; - child_allocation.width -= GTK_MENU_ITEM (widget)->toggle_size; + + if (child_pack_dir == GTK_PACK_DIRECTION_LTR || + child_pack_dir == GTK_PACK_DIRECTION_RTL) + { + if ((direction == GTK_TEXT_DIR_LTR) == (child_pack_dir != GTK_PACK_DIRECTION_RTL)) + child_allocation.x += GTK_MENU_ITEM (widget)->toggle_size; + child_allocation.width -= GTK_MENU_ITEM (widget)->toggle_size; + } + else + { + if ((direction == GTK_TEXT_DIR_LTR) == (child_pack_dir != GTK_PACK_DIRECTION_BTT)) + child_allocation.y += GTK_MENU_ITEM (widget)->toggle_size; + child_allocation.height -= GTK_MENU_ITEM (widget)->toggle_size; + } + child_allocation.x += widget->allocation.x; child_allocation.y += widget->allocation.y; @@ -1103,7 +1153,10 @@ gtk_menu_item_position_menu (GtkMenu *menu, break; case GTK_LEFT_RIGHT: - parent_menu_item = GTK_MENU (widget->parent)->parent_menu_item; + if (GTK_IS_MENU (widget->parent)) + parent_menu_item = GTK_MENU (widget->parent)->parent_menu_item; + else + parent_menu_item = NULL; parent_xthickness = widget->parent->style->xthickness; if (parent_menu_item && !GTK_MENU (widget->parent)->torn_off) menu_item->submenu_direction = GTK_MENU_ITEM (parent_menu_item)->submenu_direction; |