summaryrefslogtreecommitdiff
path: root/gtk/gtkmenuitem.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-02-11 07:15:11 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-02-11 07:15:11 +0000
commit812e0cfdb7f987040fadae5f8e9fa47c153aac0e (patch)
treea34d385ac8d5abb42891c76de1b1939dedd24f3f /gtk/gtkmenuitem.c
parent1c10200c25fb28af6058810efdd4e1ad0fc50a78 (diff)
downloadgtk+-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.c73
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;