]> Pileus Git - ~andy/gtk/commitdiff
bgo#315462 - Make GtkLabel deal with too-small height allocations gracefully
authorFederico Mena Quintero <federico@novell.com>
Wed, 13 May 2009 00:12:55 +0000 (19:12 -0500)
committerFederico Mena Quintero <federico@novell.com>
Wed, 13 May 2009 00:12:55 +0000 (19:12 -0500)
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: Federico Mena Quintero <federico@novell.com>
gtk/gtklabel.c

index 91ab5ccb319c40f5d155a81f464a2596b34e9408..3735b3b7683fac3cfc7fa1cd693ced005a447bda 100644 (file)
@@ -2775,9 +2775,26 @@ get_layout_location (GtkLabel  *label,
     x = MIN (x, widget->allocation.x + widget->allocation.width - misc->xpad);
   x -= logical.x;
 
-  y = floor (widget->allocation.y + (gint)misc->ypad 
-             + MAX (((widget->allocation.height - widget->requisition.height) * misc->yalign),
-            0));
+  /* bgo#315462 - For single-line labels, *do* align the requisition with
+   * respect to the allocation, even if we are under-allocated.  For multi-line
+   * 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)
     *xp = x;