[gtk+/extended-layout-jhs: 38/64] Consider natural size to allocate widgets spanning a single, rename



commit 07431b8795d4a9e542fee5342b718acb00dd5ffa
Author: Mathias Hasselmann <mathias hasselmann gmx de>
Date:   Mon Jul 23 22:28:44 2007 +0000

    Consider natural size to allocate widgets spanning a single, rename
    
    2007-07-24  Mathias Hasselmann  <mathias hasselmann gmx de>
    
    	* gtk/gtktable.c, gtk/gtktable.h: Consider natural size to allocate
    	widgets spanning a single, rename GtkTableRowCol::natural_size.
    	Remove some lost g_print statements.
    	* tests/testextendedlayout.c: Test natural size allocation in
    	GtkTable for simple cases.
    
    svn path=/branches/extended-layout/; revision=18532

 ChangeLog.gtk-extended-layout |    8 +++
 gtk/gtktable.c                |  117 +++++++++++++++++++++++++++--------------
 gtk/gtktable.h                |    2 +-
 tests/testextendedlayout.c    |   92 +++++++++++++++++++++-----------
 4 files changed, 148 insertions(+), 71 deletions(-)
---
diff --git a/ChangeLog.gtk-extended-layout b/ChangeLog.gtk-extended-layout
index 5444408..8e1b7e7 100644
--- a/ChangeLog.gtk-extended-layout
+++ b/ChangeLog.gtk-extended-layout
@@ -1,3 +1,11 @@
+2007-07-24  Mathias Hasselmann  <mathias hasselmann gmx de>
+
+	* gtk/gtktable.c, gtk/gtktable.h: Consider natural size to allocate 
+	widgets spanning a single, rename GtkTableRowCol::natural_size.
+	Remove some lost g_print statements.
+	* tests/testextendedlayout.c: Test natural size allocation in
+	GtkTable for simple cases.
+
 2007-07-23  Mathias Hasselmann  <mathias hasselmann gmx de>
 
 	* gtk/gtktable.c, gtk/gtktable.h: Provide natural size information.
diff --git a/gtk/gtktable.c b/gtk/gtktable.c
index ce766fe..e821df7 100644
--- a/gtk/gtktable.c
+++ b/gtk/gtktable.c
@@ -947,13 +947,13 @@ gtk_table_size_request_init (GtkTable *table)
   for (row = 0; row < table->nrows; row++)
     {
       table->rows[row].requisition = 0;
-      table->rows[row].natural_size = 0;
+      table->rows[row].natural = 0;
       table->rows[row].expand = FALSE;
     }
   for (col = 0; col < table->ncols; col++)
     {
       table->cols[col].requisition = 0;
-      table->cols[col].natural_size = 0;
+      table->cols[col].natural = 0;
       table->cols[col].expand = FALSE;
     }
   
@@ -1007,8 +1007,7 @@ gtk_table_size_request_pass1 (GtkTable *table)
 	      table->cols[child->left_attach].requisition = MAX (table->cols[child->left_attach].requisition, width);
 
 	      width = child_natural_size.width + child->xpadding * 2;
-if (GTK_IS_LABEL (child->widget))
-              table->cols[child->left_attach].natural_size = MAX (table->cols[child->left_attach].natural_size, width);
+              table->cols[child->left_attach].natural = MAX (table->cols[child->left_attach].natural, width);
 	    }
 	  
 	  /* Child spans a single row.
@@ -1019,7 +1018,7 @@ if (GTK_IS_LABEL (child->widget))
 	      table->rows[child->top_attach].requisition = MAX (table->rows[child->top_attach].requisition, height);
 
 	      height = child_natural_size.height + child->ypadding * 2;
-              table->rows[child->top_attach].natural_size = MAX (table->rows[child->top_attach].natural_size, height);
+              table->rows[child->top_attach].natural = MAX (table->rows[child->top_attach].natural, height);
 	    }
 	}
     }
@@ -1066,14 +1065,25 @@ gtk_table_size_request_pass3 (GtkTable *table)
       
       if (GTK_WIDGET_VISIBLE (child->widget))
 	{
+          GtkRequisition child_natural_size;
+          GtkRequisition child_requisition;
+
+	  if (child->left_attach != (child->right_attach - 1) ||
+	      child->top_attach != (child->bottom_attach - 1))
+            {
+	      gtk_widget_get_child_requisition (child->widget, &child_requisition);
+	      
+              if (GTK_EXTENDED_LAYOUT_HAS_NATURAL_SIZE (child->widget))
+                gtk_extended_layout_get_natural_size (GTK_EXTENDED_LAYOUT (child->widget), 
+                                                      &child_natural_size);
+              else
+                child_natural_size = child_requisition;
+            }
+
 	  /* Child spans multiple columns.
 	   */
 	  if (child->left_attach != (child->right_attach - 1))
 	    {
-	      GtkRequisition child_requisition;
-
-	      gtk_widget_get_child_requisition (child->widget, &child_requisition);
-	      
 	      /* Check and see if there is already enough space
 	       *  for the child.
 	       */
@@ -1115,16 +1125,14 @@ gtk_table_size_request_pass3 (GtkTable *table)
 			n_expand--;
 		      }
 		}
+
+                g_debug ("%s: TODO: consider natural size", G_STRFUNC);
 	    }
 	  
 	  /* Child spans multiple rows.
 	   */
 	  if (child->top_attach != (child->bottom_attach - 1))
 	    {
-	      GtkRequisition child_requisition;
-
-	      gtk_widget_get_child_requisition (child->widget, &child_requisition);
-
 	      /* Check and see if there is already enough space
 	       *  for the child.
 	       */
@@ -1168,6 +1176,8 @@ gtk_table_size_request_pass3 (GtkTable *table)
 			n_expand--;
 		      }
 		}
+
+                g_debug ("%s: TODO: consider natural size", G_STRFUNC);
 	    }
 	}
     }
@@ -1373,10 +1383,13 @@ gtk_table_size_allocate_pass1 (GtkTable *table)
   gint real_width;
   gint real_height;
   gint width, height;
+  gint natural_delta;
+  gint natural_size;
   gint row, col;
   gint nexpand;
   gint nshrink;
   gint extra;
+  gint delta;
   
   /* If we were allocated more space than we requested
    *  then we have to expand any expandable rows and columns
@@ -1419,14 +1432,20 @@ gtk_table_size_allocate_pass1 (GtkTable *table)
       width = 0;
       nexpand = 0;
       nshrink = 0;
+      natural_delta = 0;
       
       for (col = 0; col < table->ncols; col++)
 	{
 	  width += table->cols[col].requisition;
+          delta = table->cols[col].natural - table->cols[col].requisition;
+
 	  if (table->cols[col].expand)
 	    nexpand += 1;
 	  if (table->cols[col].shrink)
 	    nshrink += 1;
+
+	  if (delta > 0)
+            natural_delta += delta;
 	}
       for (col = 0; col + 1 < table->ncols; col++)
 	width += table->cols[col].spacing;
@@ -1436,16 +1455,27 @@ gtk_table_size_allocate_pass1 (GtkTable *table)
       if ((width < real_width) && (nexpand >= 1))
 	{
 	  width = real_width - width;
-	  
+          natural_size = MIN (natural_delta, width);
+          width = MAX (0, width - natural_size);
+
 	  for (col = 0; col < table->ncols; col++)
-	    if (table->cols[col].expand)
-	      {
-		extra = width / nexpand;
-		table->cols[col].allocation += extra;
-		
-		width -= extra;
-		nexpand -= 1;
-	      }
+            {
+              if (natural_size)
+                {
+                  delta = table->cols[col].natural - table->cols[col].requisition;
+                  delta = natural_size * delta / natural_delta;
+                  table->cols[col].allocation += delta;
+                }
+
+              if (table->cols[col].expand)
+                {
+                  extra = width / nexpand;
+                  table->cols[col].allocation += extra;
+                  
+                  width -= extra;
+                  nexpand -= 1;
+                }
+            }
 	}
       
       /* Check to see if we were allocated less width than we requested,
@@ -1516,10 +1546,14 @@ gtk_table_size_allocate_pass1 (GtkTable *table)
       for (row = 0; row < table->nrows; row++)
 	{
 	  height += table->rows[row].requisition;
+          delta = table->rows[row].natural - table->rows[row].requisition;
+
 	  if (table->rows[row].expand)
 	    nexpand += 1;
 	  if (table->rows[row].shrink)
 	    nshrink += 1;
+	  if (table->rows[row].natural > table->rows[row].requisition)
+            natural_delta += delta;
 	}
       for (row = 0; row + 1 < table->nrows; row++)
 	height += table->rows[row].spacing;
@@ -1529,16 +1563,27 @@ gtk_table_size_allocate_pass1 (GtkTable *table)
       if ((height < real_height) && (nexpand >= 1))
 	{
 	  height = real_height - height;
-	  
+          natural_size = MIN (natural_delta, height);
+          height = MAX (0, height - natural_size);
+
 	  for (row = 0; row < table->nrows; row++)
-	    if (table->rows[row].expand)
-	      {
-		extra = height / nexpand;
-		table->rows[row].allocation += extra;
-		
-		height -= extra;
-		nexpand -= 1;
-	      }
+            {
+              if (natural_size)
+                {
+                  delta = table->rows[row].natural - table->rows[row].requisition;
+                  delta = natural_size * delta / natural_delta;
+                  table->rows[row].allocation += delta;
+                }
+
+              if (table->rows[row].expand)
+                {
+                  extra = height / nexpand;
+                  table->rows[row].allocation += extra;
+                  
+                  height -= extra;
+                  nexpand -= 1;
+                }
+            }
 	}
       
       /* Check to see if we were allocated less height than we requested.
@@ -1678,15 +1723,9 @@ gtk_table_extended_layout_get_natural_size (GtkExtendedLayout *layout,
   height = 0;
 
   for (i = 0; i < table->ncols; i++)
-    {
-    width += table->cols[i].natural_size;
-    g_print ("%s: cols[%d].natural_size: %d\n", G_STRFUNC, i, table->cols[i].natural_size);
-    }
+    width += table->cols[i].natural;
   for (i = 0; i < table->nrows; i++)
-    {
-    height += table->rows[i].natural_size;
-    g_print ("%s: rows[%d].natural_size: %d\n", G_STRFUNC, i, table->rows[i].natural_size);
-    }
+    height += table->rows[i].natural;
 
   requisition->width = width;
   requisition->height = height;
diff --git a/gtk/gtktable.h b/gtk/gtktable.h
index fb7cb3c..f816926 100644
--- a/gtk/gtktable.h
+++ b/gtk/gtktable.h
@@ -93,7 +93,7 @@ struct _GtkTableRowCol
   guint expand : 1;
   guint shrink : 1;
   guint empty : 1;
-  guint16 natural_size;
+  guint16 natural;
 };
 
 
diff --git a/tests/testextendedlayout.c b/tests/testextendedlayout.c
index d5d3421..ec2ae12 100644
--- a/tests/testextendedlayout.c
+++ b/tests/testextendedlayout.c
@@ -216,16 +216,24 @@ static void
 append_natural_size_box (TestCase           *test,
                          GtkWidget          *parent,
                          gboolean            vertical,
+                         gboolean            table,
                          const gchar        *caption,
                          PangoEllipsizeMode  ellipsize)
 {
-  GtkWidget *box;
+  GtkWidget *container;
   GtkWidget *button;
   GtkWidget *label;
 
-  box = vertical ?
-    gtk_vbox_new (FALSE, 12):
-    gtk_hbox_new (FALSE, 12);
+  if (table)
+    {
+      container = gtk_table_new (vertical ? 2 : 1, vertical ? 1 : 2, FALSE);
+      gtk_table_set_col_spacings (GTK_TABLE (container), 12);
+      gtk_table_set_row_spacings (GTK_TABLE (container), 12);
+    }
+  else if (vertical)
+    container = gtk_vbox_new (FALSE, 12);
+  else
+    container = gtk_hbox_new (FALSE, 12);
 
   label = gtk_label_new ("The small Button");
   gtk_label_set_angle (GTK_LABEL (label), vertical ? 90 : 0);
@@ -233,7 +241,12 @@ append_natural_size_box (TestCase           *test,
 
   button = gtk_button_new ();
   gtk_container_add (GTK_CONTAINER (button), label);
-  gtk_box_pack_start (GTK_BOX (box), button, FALSE, TRUE, 0);
+
+  if (table)
+    gtk_table_attach (GTK_TABLE (container), button, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
+  else
+    gtk_box_pack_start (GTK_BOX (container), button, FALSE, TRUE, 0);
+
   test_case_append_guide (test, button, GUIDE_EXTERIOUR_VERTICAL, 0);
   test_case_append_guide (test, label, GUIDE_EXTERIOUR_VERTICAL, -1);
 
@@ -242,7 +255,17 @@ append_natural_size_box (TestCase           *test,
 
   button = gtk_button_new ();
   gtk_container_add (GTK_CONTAINER (button), label);
-  gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
+
+  if (table)
+    gtk_table_attach (GTK_TABLE (container), button,
+                      vertical ? 0 : 1, vertical ? 1 : 2,
+                      vertical ? 1 : 0, vertical ? 2 : 1,
+                      vertical ? GTK_FILL : GTK_FILL | GTK_EXPAND,
+                      vertical ? GTK_FILL | GTK_EXPAND : GTK_FILL,
+                      0, 0);
+  else
+    gtk_box_pack_start (GTK_BOX (container), button, TRUE, TRUE, 0);
+
   test_case_append_guide (test, button, GUIDE_EXTERIOUR_VERTICAL, 1);
 
   label = gtk_label_new (NULL);
@@ -260,7 +283,7 @@ append_natural_size_box (TestCase           *test,
     }
 
   gtk_box_pack_start (GTK_BOX (parent), label, FALSE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (parent), box, FALSE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (parent), container, FALSE, TRUE, 0);
 }
 
 static gboolean
@@ -318,47 +341,52 @@ shrink_paned (GtkWidget *button,
 
 static TestCase*
 create_natural_size_test (TestSuite *suite,
-                          gboolean   vertical)
+                          gboolean   vertical,
+                          gboolean   table)
 {
-  GtkWidget *box, *hint, *button;
+  GtkWidget *box, *paned, *hint, *button;
+  const gchar *detail;
+  TestCase *test;
 
-  TestCase *test = test_case_new (suite, "Natural Size",
-                                  vertical ? "GtkVBox" : "GtkHBox",
-                                  vertical ? gtk_vpaned_new () : gtk_hpaned_new ());
-  gtk_container_set_border_width (GTK_CONTAINER (test->widget), 6);
+  if (vertical)
+    {
+      detail = table ? "GtkTable, vertical" : "GtkVBox";
+      hint = gtk_alignment_new (0.5, 1.0, 1.0, 0.0);
+      box = gtk_hbox_new (FALSE, 12);
+      paned = gtk_vpaned_new ();
+    }
+  else
+    {
+      detail = table ? "GtkTable, horizontal" : "GtkHBox";
+      hint = gtk_alignment_new (1.0, 0.5, 0.0, 1.0);
+      box = gtk_vbox_new (FALSE, 12);
+      paned = gtk_hpaned_new ();
+    }
 
-  box = vertical ?
-    gtk_hbox_new (FALSE, 12): 
-    gtk_vbox_new (FALSE, 12);
+  test = test_case_new (suite, "Natural Size", detail, paned);
+  gtk_container_set_border_width (GTK_CONTAINER (test->widget), 6);
 
   gtk_container_set_border_width (GTK_CONTAINER (box), 6);
   gtk_paned_pack1 (GTK_PANED (test->widget), box, TRUE, TRUE);
 
-  append_natural_size_box (test, box, vertical,
+  append_natural_size_box (test, box, vertical, table,
                            "<b>No ellipsizing</b>",
                            PANGO_ELLIPSIZE_NONE);
-  append_natural_size_box (test, box, vertical,
+  append_natural_size_box (test, box, vertical, table,
                            "<b>Ellipsizing at start</b>",
                            PANGO_ELLIPSIZE_START);
-  append_natural_size_box (test, box, vertical,
+  append_natural_size_box (test, box, vertical, table,
                            "<b>Ellipsizing in the middle</b>",
                            PANGO_ELLIPSIZE_MIDDLE);
-  append_natural_size_box (test, box, vertical,
+  append_natural_size_box (test, box, vertical, table,
                            "<b>Ellipsizing at end</b>",
                            PANGO_ELLIPSIZE_END);
 
   button = gtk_button_new_with_label ("Shrink to check ellipsing");
   g_signal_connect (button, "clicked", G_CALLBACK (shrink_paned), test->widget);
 
-  if (vertical) 
-    {
-      hint = gtk_alignment_new (0.5, 1.0, 1.0, 0.0);
-    }
-  else
-    {
-      hint = gtk_alignment_new (1.0, 0.5, 0.0, 1.0);
-      gtk_label_set_angle (GTK_LABEL (GTK_BIN (button)->child), -90);
-    }
+  if (!vertical) 
+    gtk_label_set_angle (GTK_LABEL (GTK_BIN (button)->child), -90);
 
   gtk_container_set_border_width (GTK_CONTAINER (hint), 6);
   gtk_container_add (GTK_CONTAINER (hint), button);
@@ -1728,8 +1756,10 @@ test_suite_new ()
   TestSuite* self = g_new0 (TestSuite, 1);
 
   test_suite_setup_ui (self);
-  test_suite_append (self, create_natural_size_test (self, FALSE));
-  test_suite_append (self, create_natural_size_test (self, TRUE));
+  test_suite_append (self, create_natural_size_test (self, FALSE, FALSE));
+  test_suite_append (self, create_natural_size_test (self, TRUE, FALSE));
+  test_suite_append (self, create_natural_size_test (self, FALSE, TRUE));
+  test_suite_append (self, create_natural_size_test (self, TRUE, TRUE));
   test_suite_append (self, create_height_for_width_test (self));
   test_suite_append (self, create_baseline_test (self));
   test_suite_append (self, create_baseline_test_bin (self));



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