]> Pileus Git - ~andy/gtk/commitdiff
Fixed initial bugs in GtkCellArea implementation, starting to render
authorTristan Van Berkom <tristan.van.berkom@gmail.com>
Mon, 8 Nov 2010 08:43:27 +0000 (17:43 +0900)
committerTristan Van Berkom <tristan.van.berkom@gmail.com>
Mon, 8 Nov 2010 08:43:27 +0000 (17:43 +0900)
Tested all of this with some scaffolding code, test case comming soon.

gtk/gtkcellareabox.c
gtk/gtkcellareaboxiter.c
gtk/gtkcellareaiter.c

index 3cee4cb3ecb740127ab8f9b53cd7da2b16236082..a935c7bfc5659ada3bf27de75f4a1d2c64dc600f 100644 (file)
@@ -402,6 +402,7 @@ cell_groups_rebuild (GtkCellAreaBox *box)
 {
   GtkCellAreaBoxPrivate *priv  = box->priv;
   CellGroup              group = { 0, };
+  CellGroup             *group_ptr;
   GList                 *cells, *l;
   guint                  id = 0;
 
@@ -414,6 +415,7 @@ cell_groups_rebuild (GtkCellAreaBox *box)
 
   /* First group is implied */
   g_array_append_val (priv->groups, group);
+  group_ptr = &g_array_index (priv->groups, CellGroup, id);
 
   for (l = cells; l; l = l->next)
     {
@@ -426,21 +428,22 @@ cell_groups_rebuild (GtkCellAreaBox *box)
          group.id = ++id;
 
          g_array_append_val (priv->groups, group);
+         group_ptr = &g_array_index (priv->groups, CellGroup, id);
        }
 
-      group.cells = g_list_prepend (group.cells, info);
-      group.n_cells++;
+      group_ptr->cells = g_list_prepend (group_ptr->cells, info);
+      group_ptr->n_cells++;
 
       /* A group expands if it contains any expand cells */
       if (info->expand)
-       group.expand_cells++;
+       group_ptr->expand_cells++;
     }
 
   g_list_free (cells);
 
   for (id = 0; id < priv->groups->len; id++)
     {
-      CellGroup *group_ptr = &g_array_index (priv->groups, CellGroup, id);
+      group_ptr = &g_array_index (priv->groups, CellGroup, id);
 
       group_ptr->cells = g_list_reverse (group_ptr->cells);
     }
@@ -583,6 +586,8 @@ get_allocated_cells (GtkCellAreaBox     *box,
       return NULL;
     }
 
+  g_print ("Allocating cells for rendering, group allocs %d\n", n_allocs);
+
   for (i = 0; i < n_allocs; i++)
     {
       /* We dont always allocate all groups, sometimes the requested group has only invisible
@@ -1054,6 +1059,9 @@ gtk_cell_area_box_render (GtkCellArea          *area,
    * of alignments and pack order etc. */
   allocated_cells = get_allocated_cells (box, box_iter, widget);
 
+  g_print ("Rendering an area with allocated cells %d\n",
+          g_slist_length (allocated_cells));
+
   for (l = allocated_cells; l; l = l->next)
     {
       AllocatedCell *cell = l->data;
@@ -1075,6 +1083,9 @@ gtk_cell_area_box_render (GtkCellArea          *area,
 
       /* XXX We have to do some per-cell considerations for the 'flags'
        * for focus handling */
+      g_print ("Rendering a cell at x: %d y: %d width %d height %d\n",
+              inner_area.x, inner_area.y, inner_area.width, inner_area.height);
+      
       gtk_cell_renderer_render (cell->renderer, cr, widget,
                                &background_area, &inner_area,
                                flags);
@@ -1200,7 +1211,8 @@ gtk_cell_area_box_create_iter (GtkCellArea *area)
   GtkCellAreaBox        *box  = GTK_CELL_AREA_BOX (area);
   GtkCellAreaBoxPrivate *priv = box->priv;
   GtkCellAreaIter       *iter =
-    (GtkCellAreaIter *)g_object_new (GTK_TYPE_CELL_AREA_BOX_ITER, NULL);
+    (GtkCellAreaIter *)g_object_new (GTK_TYPE_CELL_AREA_BOX_ITER, 
+                                    "area", area, NULL);
 
   priv->iters = g_slist_prepend (priv->iters, iter);
 
@@ -1251,7 +1263,7 @@ compute_size (GtkCellAreaBox     *box,
          gint      renderer_min_size, renderer_nat_size;
 
          if (!gtk_cell_renderer_get_visible (info->renderer))
-           continue;
+             continue;
          
          gtk_cell_area_request_renderer (area, info->renderer, orientation, widget, for_size, 
                                          &renderer_min_size, &renderer_nat_size);
index 3bfa77ec97ac86fcf8ce501f11b5563d7202f0a8..03e492cfcd83f5ea37d04cf5f5849fa9488f23af 100644 (file)
@@ -175,7 +175,7 @@ gtk_cell_area_box_iter_flush_preferred_width (GtkCellAreaIter *iter)
       size->nat_size = 0;
     }
 
-  GTK_CELL_AREA_ITER_GET_CLASS
+  GTK_CELL_AREA_ITER_CLASS
     (gtk_cell_area_box_iter_parent_class)->flush_preferred_width (iter);
 }
 
@@ -192,7 +192,7 @@ gtk_cell_area_box_iter_flush_preferred_height_for_width (GtkCellAreaIter *iter,
   else
     g_hash_table_remove (priv->heights, GINT_TO_POINTER (width));
 
-  GTK_CELL_AREA_ITER_GET_CLASS
+  GTK_CELL_AREA_ITER_CLASS
     (gtk_cell_area_box_iter_parent_class)->flush_preferred_height_for_width (iter, width);
 }
 
@@ -211,7 +211,7 @@ gtk_cell_area_box_iter_flush_preferred_height (GtkCellAreaIter *iter)
       size->nat_size = 0;
     }
 
-  GTK_CELL_AREA_ITER_GET_CLASS
+  GTK_CELL_AREA_ITER_CLASS
     (gtk_cell_area_box_iter_parent_class)->flush_preferred_height (iter);
 }
 
@@ -228,7 +228,7 @@ gtk_cell_area_box_iter_flush_preferred_width_for_height (GtkCellAreaIter *iter,
   else
     g_hash_table_remove (priv->widths, GINT_TO_POINTER (height));
 
-  GTK_CELL_AREA_ITER_GET_CLASS
+  GTK_CELL_AREA_ITER_CLASS
     (gtk_cell_area_box_iter_parent_class)->flush_preferred_width_for_height (iter, height);
 }
 
@@ -479,7 +479,8 @@ static GtkCellAreaBoxAllocation *
 allocate_for_orientation (GtkCellAreaBoxIter *iter,
                          GtkOrientation      orientation,
                          gint                spacing,
-                         gint                size)
+                         gint                size,
+                         gint               *n_allocs)
 {
   GtkCellAreaBoxIterPrivate *priv = iter->priv;
   GtkRequestedSize          *orientation_sizes;
@@ -549,6 +550,9 @@ allocate_for_orientation (GtkCellAreaBoxIter *iter,
       position += spacing;
     }
 
+  if (n_allocs)
+    *n_allocs = n_groups;
+
   g_free (orientation_sizes);
 
   return allocs;
@@ -571,10 +575,11 @@ gtk_cell_area_box_iter_allocate_width (GtkCellAreaIter *iter,
       gint spacing = gtk_cell_area_box_get_spacing (GTK_CELL_AREA_BOX (area));
 
       g_free (priv->orientation_allocs);
-      priv->orientation_allocs = allocate_for_orientation (box_iter, orientation, spacing, width);
+      priv->orientation_allocs = allocate_for_orientation (box_iter, orientation, spacing, width,
+                                                          &priv->n_orientation_allocs);
     }
 
-  GTK_CELL_AREA_ITER_GET_CLASS (iter)->allocate_width (iter, width);
+  GTK_CELL_AREA_ITER_CLASS (gtk_cell_area_box_iter_parent_class)->allocate_width (iter, width);
 }
 
 static void
@@ -594,10 +599,11 @@ gtk_cell_area_box_iter_allocate_height (GtkCellAreaIter *iter,
       gint spacing = gtk_cell_area_box_get_spacing (GTK_CELL_AREA_BOX (area));
 
       g_free (priv->orientation_allocs);
-      priv->orientation_allocs = allocate_for_orientation (box_iter, orientation, spacing, height);
+      priv->orientation_allocs = allocate_for_orientation (box_iter, orientation, spacing, height,
+                                                          &priv->n_orientation_allocs);
     }
 
-  GTK_CELL_AREA_ITER_GET_CLASS (iter)->allocate_height (iter, height);
+  GTK_CELL_AREA_ITER_CLASS (gtk_cell_area_box_iter_parent_class)->allocate_height (iter, height);
 }
 
 /*************************************************************
@@ -612,7 +618,7 @@ gtk_cell_area_box_init_groups (GtkCellAreaBoxIter *box_iter,
   gint                       i;
 
   g_return_if_fail (GTK_IS_CELL_AREA_BOX_ITER (box_iter));
-  g_return_if_fail (n_groups > 0 || expand_groups != NULL);
+  g_return_if_fail (n_groups == 0 || expand_groups != NULL);
 
   /* When the group dimensions change, all info must be flushed 
    * Note this already clears the min/nat values on the BaseSizes
index 8ec1b3521ce320b5f3c23ec0a0ae6fbcf868a505..07034c9eebca7e1e883893571305c3679fc7b720 100644 (file)
@@ -126,22 +126,20 @@ gtk_cell_area_iter_class_init (GtkCellAreaIterClass *class)
   object_class->get_property = gtk_cell_area_iter_get_property;
   object_class->set_property = gtk_cell_area_iter_set_property;
 
+  /* GtkCellAreaIterClass */
   class->flush_preferred_width            = gtk_cell_area_iter_real_flush_preferred_width;
   class->flush_preferred_height_for_width = gtk_cell_area_iter_real_flush_preferred_height_for_width;
   class->flush_preferred_height           = gtk_cell_area_iter_real_flush_preferred_height;
   class->flush_preferred_width_for_height = gtk_cell_area_iter_real_flush_preferred_width_for_height;
   class->flush_allocation                 = gtk_cell_area_iter_real_flush_allocation;
 
-  class->allocate_width  = gtk_cell_area_iter_real_allocate_width;
-  class->allocate_height = gtk_cell_area_iter_real_allocate_height;
-
   class->sum_preferred_width            = NULL;
   class->sum_preferred_height_for_width = NULL;
   class->sum_preferred_height           = NULL;
   class->sum_preferred_width_for_height = NULL;
 
-  class->allocate_width  = NULL;
-  class->allocate_height = NULL;
+  class->allocate_width  = gtk_cell_area_iter_real_allocate_width;
+  class->allocate_height = gtk_cell_area_iter_real_allocate_height;
 
   cell_area_iter_signals[SIGNAL_HEIGHT_CHANGED] =
     g_signal_new (I_("height-changed"),