[gtk+/extended-layout-jhs: 35/64] Extend the test to support rotations. Support ellipsizing and wrapping on



commit 89bc43dd33bf10bceea9a4371e4a3846bf4d2061
Author: Mathias Hasselmann <mathias hasselmann gmx de>
Date:   Wed Jul 18 12:57:17 2007 +0000

    Extend the test to support rotations. Support ellipsizing and wrapping on
    
    2007-07-16  Mathias Hasselmann  <mathias hasselmann gmx de>
    
    	* tests/testellipsise.c: Extend the test to support rotations.
    	* gtk/gtklabel.c: Support ellipsizing and wrapping on labels
    	rotated by multiples of 90°.
    
    svn path=/branches/extended-layout/; revision=18493

 ChangeLog.gtk-extended-layout |    6 ++
 gtk/gtklabel.c                |  113 +++++++++++++++++++++++++----------------
 tests/testellipsise.c         |   28 ++++++++--
 3 files changed, 97 insertions(+), 50 deletions(-)
---
diff --git a/ChangeLog.gtk-extended-layout b/ChangeLog.gtk-extended-layout
index 22391f2..1485f0c 100644
--- a/ChangeLog.gtk-extended-layout
+++ b/ChangeLog.gtk-extended-layout
@@ -1,5 +1,11 @@
 2007-07-16  Mathias Hasselmann  <mathias hasselmann gmx de>
 
+	* tests/testellipsise.c: Extend the test to support rotations.
+	* gtk/gtklabel.c: Support ellipsizing and wrapping on labels
+	rotated by multiples of 90°.
+
+2007-07-16  Mathias Hasselmann  <mathias hasselmann gmx de>
+
 	* gtk/gtkvbox.c, tests/testextendedlayout.c:
 	Implement and test natural size support for GtkVBox.
 	* gtk/gtkhbox.c: Cleanup issues found when implementing
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 28acb10..5f405df 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -25,6 +25,7 @@
 
 #include <config.h>
 #include <math.h>
+#include <stdlib.h>
 #include <string.h>
 #include "gtklabel.h"
 #include "gtkaccellabel.h"
@@ -1996,14 +1997,14 @@ gtk_label_ensure_layout (GtkLabel *label)
       PangoAlignment align = PANGO_ALIGN_LEFT; /* Quiet gcc */
       gdouble angle = gtk_label_get_angle (label);
 
-      if (angle != 0.0 && !label->wrap && !label->ellipsize && !label->select_info)
+      if (angle != 0.0 && !label->select_info)
 	{
+          PangoMatrix matrix = PANGO_MATRIX_INIT;
+
 	  /* We rotate the standard singleton PangoContext for the widget,
 	   * depending on the fact that it's meant pretty much exclusively
 	   * for our use.
 	   */
-	  PangoMatrix matrix = PANGO_MATRIX_INIT;
-	  
 	  pango_matrix_rotate (&matrix, angle);
 
 	  pango_context_set_matrix (gtk_widget_get_pango_context (widget), &matrix);
@@ -2047,8 +2048,8 @@ gtk_label_ensure_layout (GtkLabel *label)
       pango_layout_set_single_paragraph_mode (label->layout, label->single_line_mode);
 
       if (label->ellipsize)
-	pango_layout_set_width (label->layout, 
-				widget->allocation.width * PANGO_SCALE);
+        pango_layout_set_width (label->layout, 
+                                widget->allocation.width * PANGO_SCALE);
       else if (label->wrap)
 	{
 	  GtkWidgetAuxInfo *aux_info;
@@ -2129,8 +2130,8 @@ gtk_label_size_request (GtkWidget      *widget,
 {
   GtkLabel *label;
   GtkLabelPrivate *priv;
-  gint width, height;
   PangoRectangle logical_rect;
+  PangoRectangle required_rect;
   GtkWidgetAuxInfo *aux_info;
   
   g_return_if_fail (GTK_IS_LABEL (widget));
@@ -2157,39 +2158,21 @@ gtk_label_size_request (GtkWidget      *widget,
 
   gtk_label_ensure_layout (label);
 
-  width = label->misc.xpad * 2;
-  height = label->misc.ypad * 2;
-
   aux_info = _gtk_widget_get_aux_info (widget, FALSE);
 
-  if (label->have_transform)
-    {
-      PangoRectangle rect;
-      PangoContext *context = pango_layout_get_context (label->layout);
-      const PangoMatrix *matrix = pango_context_get_matrix (context);
-
-      pango_layout_get_extents (label->layout, NULL, &rect);
-      pango_matrix_transform_rectangle (matrix, &rect);
-      pango_extents_to_pixels (&rect, NULL);
-      
-      requisition->width = width + rect.width;
-      requisition->height = height + rect.height;
-
-      return;
-    }
-  else
-    pango_layout_get_extents (label->layout, NULL, &logical_rect);
+  pango_layout_get_extents (label->layout, NULL, &logical_rect);
+  required_rect.x = required_rect.y = 0;
 
   if ((label->wrap || label->ellipsize || 
        priv->width_chars > 0 || priv->max_width_chars > 0) && 
       aux_info && aux_info->width > 0)
-    width += aux_info->width;
+    required_rect.width = aux_info->width;
   else if (label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0)
     {
-      width += PANGO_PIXELS (get_label_char_width (label));
+      required_rect.width = PANGO_PIXELS (get_label_char_width (label));
     }
   else
-    width += PANGO_PIXELS (logical_rect.width);
+    required_rect.width = PANGO_PIXELS (logical_rect.width);
 
   if (label->single_line_mode)
     {
@@ -2205,13 +2188,26 @@ gtk_label_size_request (GtkWidget      *widget,
       descent = pango_font_metrics_get_descent (metrics);
       pango_font_metrics_unref (metrics);
     
-      height += PANGO_PIXELS (ascent + descent);
+      required_rect.height = PANGO_PIXELS (ascent + descent);
     }
   else
-    height += PANGO_PIXELS (logical_rect.height);
+    required_rect.height = PANGO_PIXELS (logical_rect.height);
 
-  requisition->width = width;
-  requisition->height = height;
+  if (label->have_transform)
+    {
+      PangoContext *context = pango_layout_get_context (label->layout);
+      const PangoMatrix *matrix = pango_context_get_matrix (context);
+      PangoRectangle rect;
+
+      pango_layout_get_extents (label->layout, NULL, &rect);
+      pango_matrix_transform_rectangle (matrix, &rect);
+      pango_extents_to_pixels (&rect, NULL);
+
+      pango_matrix_transform_pixel_rectangle (matrix, &required_rect);
+    }
+
+  requisition->width = required_rect.width + label->misc.xpad * 2;
+  requisition->height = required_rect.height + label->misc.ypad * 2;
 }
 
 static void
@@ -2228,16 +2224,25 @@ gtk_label_size_allocate (GtkWidget     *widget,
     {
       if (label->layout)
 	{
-	  gint width;
 	  PangoRectangle logical;
+          PangoRectangle bounds;	
 
-	  width = (allocation->width - label->misc.xpad * 2) * PANGO_SCALE;
+          bounds.x = bounds.y = 0;
+          bounds.width = allocation->width - label->misc.xpad * 2;
+          bounds.height = allocation->height - label->misc.ypad * 2;
 
 	  pango_layout_set_width (label->layout, -1);
 	  pango_layout_get_extents (label->layout, NULL, &logical);
 
-	  if (logical.width > width)
-	    pango_layout_set_width (label->layout, width);
+          if (label->have_transform)
+            {
+              PangoContext *context = gtk_widget_get_pango_context (widget);
+              const PangoMatrix *matrix = pango_context_get_matrix (context);
+              pango_matrix_transform_pixel_rectangle (matrix, &bounds);
+            }
+
+	  if (logical.width > bounds.width)
+	    pango_layout_set_width (label->layout, bounds.width * PANGO_SCALE);
 	}
     }
 
@@ -2318,8 +2323,9 @@ get_layout_location (GtkLabel  *label,
   GtkWidget *widget; 
   GtkLabelPrivate *priv;
   gfloat xalign;
-  gint req_width, x, y;
-  gfloat dy;
+  gint req_width;
+  gint req_height;
+  gint x, y;
   
   misc = GTK_MISC (label);
   widget = GTK_WIDGET (label);
@@ -2336,26 +2342,43 @@ get_layout_location (GtkLabel  *label,
       PangoRectangle logical;
 
       width = pango_layout_get_width (label->layout);
-      pango_layout_get_pixel_extents (label->layout, NULL, &logical);
+      pango_layout_get_extents (label->layout, NULL, &logical);
+
+      if (label->have_transform)
+        {
+          PangoContext *context = gtk_widget_get_pango_context (widget);
+          const PangoMatrix *matrix = pango_context_get_matrix (context);
+          pango_matrix_transform_rectangle (matrix, &logical);
+        }
+
+      pango_extents_to_pixels (&logical, NULL);
 
       req_width = logical.width;
+      req_height = logical.height;
+
       if (width != -1)
 	req_width = MIN(PANGO_PIXELS (width), req_width);
+
       req_width += 2 * misc->xpad;
+      req_height += 2 * misc->ypad;
     }
   else
-    req_width = widget->requisition.width;
+    {
+      req_width = widget->requisition.width;
+      req_height = widget->requisition.height;
+    }
 
   x = floor (widget->allocation.x + (gint)misc->xpad +
-	      xalign * (widget->allocation.width - req_width));
+	     xalign * (widget->allocation.width - req_width));
 
   if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
     x = MAX (x, widget->allocation.x + misc->xpad);
   else
     x = MIN (x, widget->allocation.x + widget->allocation.width - misc->xpad);
 
-  dy = (widget->allocation.height - widget->requisition.height) * misc->yalign;
-  y = floor (widget->allocation.y + (gint)misc->ypad + priv->baseline_offset + MAX (dy, 0));
+  y = floor (widget->allocation.y + (gint)misc->ypad +
+  	     misc->yalign * (widget->allocation.height - req_height) +
+	     priv->baseline_offset);
 
   if (xp)
     *xp = x;
@@ -4275,6 +4298,8 @@ gtk_label_extended_layout_get_natural_size (GtkExtendedLayout *layout,
   PangoLayout *tmp;
 
   label = GTK_LABEL (layout);
+  gtk_label_ensure_layout (label);
+
   ellipsize = label->ellipsize;
   label->ellipsize = PANGO_ELLIPSIZE_NONE;
 
diff --git a/tests/testellipsise.c b/tests/testellipsise.c
index 0783d61..591cbdb 100644
--- a/tests/testellipsise.c
+++ b/tests/testellipsise.c
@@ -37,30 +37,46 @@ combo_changed_cb (GtkWidget *combo,
   gtk_label_set_ellipsize (GTK_LABEL (label), (PangoEllipsizeMode)active);
 }
 
+static void
+scale_changed_cb (GtkRange *range,
+		  gpointer   data)
+{
+  GtkWidget *label = GTK_WIDGET (data);
+  double angle = gtk_range_get_value (range);
+  
+  gtk_label_set_angle (GTK_LABEL (label), angle);
+}
+
 int
 main (int argc, char *argv[])
 {
-  GtkWidget *window, *vbox, *hbox, *label, *combo;
+  GtkWidget *window, *vbox, *label, *combo, *scale;
 
   gtk_init (&argc, &argv);
 
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_container_set_border_width (GTK_CONTAINER (window), 12);
   g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-  vbox = gtk_vbox_new (0, FALSE);
+
+  vbox = gtk_vbox_new (FALSE, 6);
   gtk_container_add (GTK_CONTAINER (window), vbox);
-  hbox = gtk_hbox_new (0, FALSE);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+
   label = gtk_label_new ("This label may be ellipsized\nto make it fit.");
-  gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+  gtk_box_pack_end (GTK_BOX (vbox), label, TRUE, TRUE, 0);
+
   combo = gtk_combo_box_new_text ();
   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "NONE");
   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "START");
   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "MIDDLE");
   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "END");
   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
-  gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, TRUE, 0);
   g_signal_connect (combo, "changed", G_CALLBACK (combo_changed_cb), label);
 
+  scale = gtk_hscale_new_with_range (0, 360, 1);
+  g_signal_connect (scale, "value-changed", G_CALLBACK (scale_changed_cb), label);
+  gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 0);
+
   gtk_widget_show_all (window);
 
   gtk_main ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]