summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-05-17 21:00:31 -0400
committerMatthias Clasen <mclasen@redhat.com>2023-05-17 21:06:12 -0400
commitc6f99044930b1c508ada41f3b4a0192fabd4bfbf (patch)
tree0bd194a1feae53f11eaa3724c2b82edde19666e1
parent42ef204d116c3e71063646e241bd9bc4bb26ac99 (diff)
downloadgtk+-c6f99044930b1c508ada41f3b4a0192fabd4bfbf.tar.gz
gridview: Allocate headers better
Allocate the right amount of space to headers and footers to make sections break the grid.
-rw-r--r--gtk/gtkgridview.c67
1 files changed, 38 insertions, 29 deletions
diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c
index e51aec8202..381178e773 100644
--- a/gtk/gtkgridview.c
+++ b/gtk/gtkgridview.c
@@ -714,7 +714,7 @@ gtk_grid_view_measure_list (GtkWidget *widget,
{
gtk_widget_measure (tile->widget,
gtk_list_base_get_orientation (GTK_LIST_BASE (self)),
- column_size,
+ gtk_list_tile_is_header (tile) ? for_size : column_size,
&child_min, &child_nat, NULL, NULL);
if (scroll_policy == GTK_SCROLL_MINIMUM)
row_height = MAX (row_height, child_min);
@@ -723,8 +723,8 @@ gtk_grid_view_measure_list (GtkWidget *widget,
measured = TRUE;
}
- if (gtk_list_tile_is_header (tile))
- i += 1;
+ if (gtk_list_tile_is_footer (tile) || gtk_list_tile_is_header (tile))
+ i = n_columns;
else
i += tile->n_items;
@@ -849,7 +849,7 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
int min, nat, size;
gtk_widget_measure (tile->widget,
gtk_list_base_get_orientation (GTK_LIST_BASE (self)),
- self->column_width,
+ gtk_list_tile_is_header (tile) ? width : self->column_width,
&min, &nat, NULL, NULL);
if (scroll_policy == GTK_SCROLL_MINIMUM)
size = min;
@@ -861,9 +861,8 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
}
if (tile->n_items > self->n_columns - i)
gtk_list_tile_split (self->item_manager, tile, self->n_columns - i);
-
- if (gtk_list_tile_is_header (tile))
- i += 1;
+ if (gtk_list_tile_is_footer (tile) || gtk_list_tile_is_header (tile))
+ i = self->n_columns;
else
i += tile->n_items;
}
@@ -875,8 +874,10 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
{
int n_items;
- if (gtk_list_tile_is_header (start))
- n_items = 1;
+ if (gtk_list_tile_is_footer (start))
+ n_items = self->n_columns - i;
+ else if (gtk_list_tile_is_header (start))
+ n_items = self->n_columns;
else
n_items = start->n_items;
gtk_list_tile_set_area_size (self->item_manager,
@@ -901,39 +902,47 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
tile != NULL;
tile = gtk_rb_tree_node_get_next (tile))
{
- int n_items;
-
- if (gtk_list_tile_is_header (tile))
- n_items = 1;
- else
- n_items = tile->n_items;
gtk_list_tile_set_area_position (self->item_manager,
tile,
column_start (self, xspacing, i),
y);
- if (n_items >= self->n_columns && tile->widget == NULL)
+
+ if (gtk_list_tile_is_footer (tile))
+ {
+ if (i > 0)
+ i = self->n_columns;
+ }
+ else if (gtk_list_tile_is_header (tile))
{
g_assert (i == 0);
- g_assert (n_items % self->n_columns == 0);
- gtk_list_tile_set_area_size (self->item_manager,
- tile,
- column_end (self, xspacing, self->n_columns - 1)
- - column_start (self, xspacing, 0),
- (unknown_row_height + yspacing) * (n_items / self->n_columns) - yspacing);
- y += tile->area.height + yspacing;
+ i = self->n_columns;
}
else
{
- if (tile->area.height == 0)
+ if (tile->n_items >= self->n_columns && tile->widget == NULL)
{
- /* this case is for the last row - it may not be a full row so it won't
- * be a multirow tile but it may have no widgets either */
+ g_assert (i == 0);
+ g_assert (tile->n_items % self->n_columns == 0);
gtk_list_tile_set_area_size (self->item_manager,
tile,
- column_end (self, xspacing, i + n_items - 1) - tile->area.x,
- unknown_row_height);
+ column_end (self, xspacing, self->n_columns - 1)
+ - column_start (self, xspacing, 0),
+ (unknown_row_height + yspacing) * (tile->n_items / self->n_columns) - yspacing);
+ y += tile->area.height + yspacing;
+ }
+ else
+ {
+ if (tile->area.height == 0)
+ {
+ /* this case is for the last row - it may not be a full row so it won't
+ * be a multirow tile but it may have no widgets either */
+ gtk_list_tile_set_area_size (self->item_manager,
+ tile,
+ column_end (self, xspacing, i + tile->n_items - 1) - tile->area.x,
+ unknown_row_height);
+ }
+ i += tile->n_items;
}
- i += n_items;
}
if (i >= self->n_columns)