From c6f99044930b1c508ada41f3b4a0192fabd4bfbf Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 17 May 2023 21:00:31 -0400 Subject: gridview: Allocate headers better Allocate the right amount of space to headers and footers to make sections break the grid. --- gtk/gtkgridview.c | 67 +++++++++++++++++++++++++++++++------------------------ 1 file 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) -- cgit v1.2.1