listitemmanager: Augment header/footer info
authorBenjamin Otte <otte@redhat.com>
Fri, 7 Apr 2023 18:49:06 +0000 (20:49 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 9 May 2023 15:00:39 +0000 (17:00 +0200)
gtk/gtklistitemmanager.c
gtk/gtklistitemmanagerprivate.h

index 10ca102e27a8430266e6915d691ef97d9096fc9e..0f1a9c099590d407944c13b8da75dcb654c1c244 100644 (file)
@@ -101,11 +101,36 @@ gtk_list_item_manager_augment_node (GtkRbTree *tree,
   aug->n_items = tile->n_items;
   aug->area = tile->area;
 
+  switch (tile->type)
+  {
+    case GTK_LIST_TILE_HEADER:
+    case GTK_LIST_TILE_UNMATCHED_HEADER:
+      aug->has_header = TRUE;
+      aug->has_footer = FALSE;
+      break;
+    case GTK_LIST_TILE_FOOTER:
+    case GTK_LIST_TILE_UNMATCHED_FOOTER:
+      aug->has_header = FALSE;
+      aug->has_footer = TRUE;
+      break;
+    case GTK_LIST_TILE_ITEM:
+    case GTK_LIST_TILE_FILLER:
+    case GTK_LIST_TILE_REMOVED:
+      aug->has_header = FALSE;
+      aug->has_footer = FALSE;
+      break;
+    default:
+      g_assert_not_reached ();
+      break;
+  }
+
   if (left)
     {
       GtkListTileAugment *left_aug = gtk_rb_tree_get_augment (tree, left);
 
       aug->n_items += left_aug->n_items;
+      aug->has_header |= left_aug->has_header;
+      aug->has_footer |= left_aug->has_footer;
       potentially_empty_rectangle_union (&aug->area, &left_aug->area);
     }
 
@@ -114,6 +139,8 @@ gtk_list_item_manager_augment_node (GtkRbTree *tree,
       GtkListTileAugment *right_aug = gtk_rb_tree_get_augment (tree, right);
 
       aug->n_items += right_aug->n_items;
+      aug->has_header |= right_aug->has_header;
+      aug->has_footer |= right_aug->has_footer;
       potentially_empty_rectangle_union (&aug->area, &right_aug->area);
     }
 }
index 9efaf0461bfd40a85578c40c2cb7fc3cf186f7b7..5094ad4e9973b066e7de91e3fbf9b4b22cb853a0 100644 (file)
@@ -66,6 +66,10 @@ struct _GtkListTile
 struct _GtkListTileAugment
 {
   guint n_items;
+
+  guint has_header :1;
+  guint has_footer :1;
+
   /* union of all areas of tile and children */
   cairo_rectangle_int_t area;
 };