notebook: allow using different padding values for the active tab state

The code before was basically adding and removing the same padding value
in two different places during the allocation cycle.
Instead, what we want to do is to offset the inactive tab allocation by
the difference with the active tab padding, to ensure the tab content is
always drawn centered and in the right position.

https://bugzilla.gnome.org/show_bug.cgi?id=659777
This commit is contained in:
Cosimo Cecchi 2011-09-27 12:55:05 -04:00
parent d4f83cdfb6
commit 2500a95fad

View File

@ -5788,7 +5788,6 @@ gtk_notebook_calculate_tabs_allocation (GtkNotebook *notebook,
gboolean gap_left, packing_changed;
GtkAllocation child_allocation = { 0, };
GtkOrientation tab_expand_orientation;
GtkBorder padding;
widget = GTK_WIDGET (notebook);
container = GTK_CONTAINER (notebook);
@ -5841,16 +5840,10 @@ gtk_notebook_calculate_tabs_allocation (GtkNotebook *notebook,
else
tab_expand_orientation = GTK_ORIENTATION_VERTICAL;
gtk_style_context_save (context);
while (*children && *children != last_child)
{
page = (*children)->data;
gtk_style_context_add_region (context, GTK_STYLE_REGION_TAB,
_gtk_notebook_get_tab_flags (notebook, page));
gtk_style_context_get_padding (context, 0, &padding);
if (direction == STEP_NEXT)
*children = gtk_notebook_search_page (notebook, *children, direction, TRUE);
else
@ -5985,21 +5978,44 @@ gtk_notebook_calculate_tabs_allocation (GtkNotebook *notebook,
if (page != priv->cur_page)
{
GtkBorder active_padding, normal_padding, padding;
/* The active tab is by definition at least the same height as the inactive one.
* The padding we're building is the offset between the two tab states,
* so in case the style specifies normal_padding > active_padding we
* remove the offset and draw them with the same height.
* Note that the padding will still be applied to the tab content though,
* see gtk_notebook_page_allocate().
*/
gtk_style_context_save (context);
gtk_style_context_add_region (context, GTK_STYLE_REGION_TAB,
_gtk_notebook_get_tab_flags (notebook, page));
gtk_style_context_get_padding (context, GTK_STATE_FLAG_ACTIVE, &active_padding);
gtk_style_context_get_padding (context, GTK_STATE_FLAG_NORMAL, &normal_padding);
gtk_style_context_restore (context);
padding.top = MAX (0, active_padding.top - normal_padding.top);
padding.right = MAX (0, active_padding.right - normal_padding.right);
padding.bottom = MAX (0, active_padding.bottom - normal_padding.bottom);
padding.left = MAX (0, active_padding.left - normal_padding.left);
switch (tab_pos)
{
case GTK_POS_TOP:
page->allocation.y += padding.top;
page->allocation.height = MAX (1, page->allocation.height - padding.top);
page->allocation.y += padding.top + padding.bottom;
page->allocation.height = MAX (1, page->allocation.height - padding.top - padding.bottom);
break;
case GTK_POS_BOTTOM:
page->allocation.height = MAX (1, page->allocation.height - padding.bottom);
page->allocation.height = MAX (1, page->allocation.height - padding.top - padding.bottom);
break;
case GTK_POS_LEFT:
page->allocation.x += padding.left;
page->allocation.width = MAX (1, page->allocation.width - padding.left);
page->allocation.x += padding.left + padding.right;
page->allocation.width = MAX (1, page->allocation.width - padding.left - padding.right);
break;
case GTK_POS_RIGHT:
page->allocation.width = MAX (1, page->allocation.width - padding.right);
page->allocation.width = MAX (1, page->allocation.width - padding.left - padding.right);
break;
}
}
@ -6062,8 +6078,6 @@ gtk_notebook_calculate_tabs_allocation (GtkNotebook *notebook,
gtk_widget_set_child_visible (page->tab_label, TRUE);
}
gtk_style_context_restore (context);
/* Don't move the current tab past the last position during tabs reordering */
if (children &&
priv->operation == DRAG_OPERATION_REORDER &&
@ -6293,27 +6307,6 @@ gtk_notebook_page_allocate (GtkNotebook *notebook,
break;
}
if (page != priv->cur_page)
{
switch (tab_pos)
{
case GTK_POS_TOP:
child_allocation.y -= tab_padding.top;
child_allocation.height += tab_padding.top;
break;
case GTK_POS_BOTTOM:
child_allocation.height += tab_padding.bottom;
break;
case GTK_POS_LEFT:
child_allocation.x -= tab_padding.left;
child_allocation.width += tab_padding.left;
break;
case GTK_POS_RIGHT:
child_allocation.width += tab_padding.right;
break;
}
}
gtk_widget_get_allocation (page->tab_label, &label_allocation);
tab_allocation_changed = (child_allocation.x != label_allocation.x ||
child_allocation.y != label_allocation.y ||