Commit 67e0a441 authored by Federico Mena Quintero's avatar Federico Mena Quintero
Browse files

bgo#315462 - Make GtkLabel deal with too-small height allocations gracefully



Previously we would always align the top of the text with the label's allocation-plus-padding.
However, this makes a single-line label inside a GtkButton look badly clipped when the button
has a smaller allocation than its requisition.  So, for single-line labels we respect the
alignment even if it doesn't fit within the label's allocation.  But for multi-line labels, we
give preference to showing the first line, to give the user some context.
Signed-off-by: default avatarFederico Mena Quintero <federico@novell.com>
parent e2bce0d6
...@@ -2775,9 +2775,26 @@ get_layout_location (GtkLabel *label, ...@@ -2775,9 +2775,26 @@ get_layout_location (GtkLabel *label,
x = MIN (x, widget->allocation.x + widget->allocation.width - misc->xpad); x = MIN (x, widget->allocation.x + widget->allocation.width - misc->xpad);
x -= logical.x; x -= logical.x;
y = floor (widget->allocation.y + (gint)misc->ypad /* bgo#315462 - For single-line labels, *do* align the requisition with
+ MAX (((widget->allocation.height - widget->requisition.height) * misc->yalign), * respect to the allocation, even if we are under-allocated. For multi-line
0)); * labels, always show the top of the text when they are under-allocated. The
* rationale is this:
*
* - Single-line labels appear in GtkButtons, and it is very easy to get them
* to be smaller than their requisition. The button may clip the label, but
* the label will still be able to show most of itself and the focus
* rectangle. Also, it is fairly easy to read a single line of clipped text.
*
* - Multi-line labels should not be clipped to showing "something in the
* middle". You want to read the first line, at least, to get some context.
*/
if (pango_layout_get_line_count (label->layout) == 1)
y = floor (widget->allocation.y + (gint)misc->ypad
+ (widget->allocation.height - widget->requisition.height) * misc->yalign);
else
y = floor (widget->allocation.y + (gint)misc->ypad
+ MAX (((widget->allocation.height - widget->requisition.height) * misc->yalign),
0));
if (xp) if (xp)
*xp = x; *xp = x;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment