forked from AuroraMiddleware/gtk
menuitem: share code between HFW and non-HFW height requests
The code is very similar; having two slightly different code paths is bad and can lead to bugs. Refactor the code to use the same height request function.
This commit is contained in:
parent
4d76b10ce5
commit
05e62e0251
@ -856,9 +856,10 @@ gtk_menu_item_get_preferred_width (GtkWidget *widget,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_item_get_preferred_height (GtkWidget *widget,
|
||||
gint *minimum_size,
|
||||
gint *natural_size)
|
||||
gtk_menu_item_real_get_height (GtkWidget *widget,
|
||||
gint for_size,
|
||||
gint *minimum_size,
|
||||
gint *natural_size)
|
||||
{
|
||||
GtkMenuItem *menu_item = GTK_MENU_ITEM (widget);
|
||||
GtkMenuItemPrivate *priv = menu_item->priv;
|
||||
@ -873,7 +874,8 @@ gtk_menu_item_get_preferred_height (GtkWidget *widget,
|
||||
guint border_width;
|
||||
GtkPackDirection pack_dir;
|
||||
GtkPackDirection child_pack_dir;
|
||||
gint min_height, nat_height;
|
||||
gint min_height, nat_height;
|
||||
gint avail_size;
|
||||
|
||||
min_height = nat_height = 0;
|
||||
|
||||
@ -900,35 +902,60 @@ gtk_menu_item_get_preferred_height (GtkWidget *widget,
|
||||
}
|
||||
|
||||
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
|
||||
min_height = (border_width * 2) + padding.top + padding.bottom;
|
||||
min_height = (border_width * 2) + padding.top + padding.bottom;
|
||||
|
||||
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))
|
||||
min_height += 2 * horizontal_padding;
|
||||
|
||||
if (for_size != -1)
|
||||
{
|
||||
avail_size = for_size;
|
||||
avail_size -= (border_width * 2) + padding.left + padding.right;
|
||||
|
||||
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))
|
||||
avail_size -= 2 * horizontal_padding;
|
||||
}
|
||||
|
||||
nat_height = min_height;
|
||||
|
||||
child = gtk_bin_get_child (bin);
|
||||
|
||||
if (child != NULL && gtk_widget_get_visible (child))
|
||||
{
|
||||
GtkMenuItemPrivate *priv = menu_item->priv;
|
||||
gint child_min, child_nat;
|
||||
gint arrow_size = 0;
|
||||
guint arrow_spacing = 0;
|
||||
|
||||
gtk_widget_get_preferred_height (child, &child_min, &child_nat);
|
||||
if ((priv->submenu && !GTK_IS_MENU_BAR (parent)) || priv->reserve_indicator)
|
||||
{
|
||||
gtk_widget_style_get (widget,
|
||||
"arrow-spacing", &arrow_spacing,
|
||||
NULL);
|
||||
get_arrow_size (widget, child, &arrow_size);
|
||||
}
|
||||
|
||||
if (for_size != -1)
|
||||
{
|
||||
avail_size -= arrow_size;
|
||||
avail_size -= arrow_spacing;
|
||||
|
||||
gtk_widget_get_preferred_height_for_width (child,
|
||||
avail_size,
|
||||
&child_min,
|
||||
&child_nat);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_get_preferred_height (child, &child_min, &child_nat);
|
||||
}
|
||||
|
||||
min_height += child_min;
|
||||
nat_height += child_nat;
|
||||
|
||||
if ((menu_item->priv->submenu && !GTK_IS_MENU_BAR (parent)) || priv->reserve_indicator)
|
||||
{
|
||||
gint arrow_size;
|
||||
|
||||
get_arrow_size (widget, child, &arrow_size);
|
||||
|
||||
min_height = MAX (min_height, arrow_size);
|
||||
nat_height = MAX (nat_height, arrow_size);
|
||||
}
|
||||
min_height = MAX (min_height, arrow_size);
|
||||
nat_height = MAX (nat_height, arrow_size);
|
||||
}
|
||||
else /* separator item */
|
||||
{
|
||||
@ -970,134 +997,21 @@ gtk_menu_item_get_preferred_height (GtkWidget *widget,
|
||||
*natural_size = nat_height;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_item_get_preferred_height (GtkWidget *widget,
|
||||
gint *minimum_size,
|
||||
gint *natural_size)
|
||||
{
|
||||
gtk_menu_item_real_get_height (widget, -1, minimum_size, natural_size);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_item_get_preferred_height_for_width (GtkWidget *widget,
|
||||
gint for_size,
|
||||
gint *minimum_size,
|
||||
gint *natural_size)
|
||||
{
|
||||
GtkMenuItem *menu_item = GTK_MENU_ITEM (widget);
|
||||
GtkMenuItemPrivate *priv = menu_item->priv;
|
||||
GtkBin *bin;
|
||||
GtkStyleContext *context;
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding;
|
||||
GtkWidget *child;
|
||||
GtkWidget *parent;
|
||||
guint horizontal_padding;
|
||||
guint border_width;
|
||||
GtkPackDirection pack_dir;
|
||||
GtkPackDirection child_pack_dir;
|
||||
gint min_height, nat_height;
|
||||
gint avail_size;
|
||||
|
||||
min_height = nat_height = 0;
|
||||
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
gtk_style_context_get_padding (context, state, &padding);
|
||||
|
||||
gtk_widget_style_get (widget,
|
||||
"horizontal-padding", &horizontal_padding,
|
||||
NULL);
|
||||
|
||||
bin = GTK_BIN (widget);
|
||||
parent = gtk_widget_get_parent (widget);
|
||||
|
||||
if (GTK_IS_MENU_BAR (parent))
|
||||
{
|
||||
pack_dir = gtk_menu_bar_get_pack_direction (GTK_MENU_BAR (parent));
|
||||
child_pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
|
||||
}
|
||||
else
|
||||
{
|
||||
pack_dir = GTK_PACK_DIRECTION_LTR;
|
||||
child_pack_dir = GTK_PACK_DIRECTION_LTR;
|
||||
}
|
||||
|
||||
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
|
||||
min_height = (border_width * 2) + padding.top + padding.bottom;
|
||||
|
||||
avail_size = for_size;
|
||||
avail_size -= (border_width * 2) + padding.left + padding.right;
|
||||
|
||||
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))
|
||||
min_height += 2 * horizontal_padding;
|
||||
|
||||
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))
|
||||
avail_size -= 2 * horizontal_padding;
|
||||
|
||||
nat_height = min_height;
|
||||
|
||||
child = gtk_bin_get_child (bin);
|
||||
|
||||
if (child != NULL && gtk_widget_get_visible (child))
|
||||
{
|
||||
gint child_min, child_nat;
|
||||
gint arrow_size = 0;
|
||||
|
||||
if ((priv->submenu && !GTK_IS_MENU_BAR (parent)) || priv->reserve_indicator)
|
||||
{
|
||||
guint arrow_spacing;
|
||||
|
||||
gtk_widget_style_get (widget,
|
||||
"arrow-spacing", &arrow_spacing,
|
||||
NULL);
|
||||
|
||||
get_arrow_size (widget, child, &arrow_size);
|
||||
|
||||
avail_size -= arrow_size;
|
||||
avail_size -= arrow_spacing;
|
||||
}
|
||||
|
||||
gtk_widget_get_preferred_height_for_width (child,
|
||||
avail_size,
|
||||
&child_min,
|
||||
&child_nat);
|
||||
|
||||
min_height += child_min;
|
||||
nat_height += child_nat;
|
||||
|
||||
if ((priv->submenu && !GTK_IS_MENU_BAR (parent)) || priv->reserve_indicator)
|
||||
{
|
||||
min_height = MAX (min_height, arrow_size);
|
||||
nat_height = MAX (nat_height, arrow_size);
|
||||
}
|
||||
}
|
||||
else /* separator item */
|
||||
{
|
||||
gboolean wide_separators;
|
||||
gint separator_height;
|
||||
|
||||
gtk_widget_style_get (widget,
|
||||
"wide-separators", &wide_separators,
|
||||
"separator-height", &separator_height,
|
||||
NULL);
|
||||
|
||||
if (wide_separators)
|
||||
{
|
||||
min_height += separator_height;
|
||||
nat_height += separator_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* force odd, so that we can have the same space above and
|
||||
* below the line.
|
||||
*/
|
||||
if (min_height % 2 == 0)
|
||||
min_height += 1;
|
||||
if (nat_height % 2 == 0)
|
||||
nat_height += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (minimum_size)
|
||||
*minimum_size = min_height;
|
||||
|
||||
if (natural_size)
|
||||
*natural_size = nat_height;
|
||||
gtk_menu_item_real_get_height (widget, for_size, minimum_size, natural_size);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user