listview: Handle emptying of views
authorBenjamin Otte <otte@redhat.com>
Fri, 3 Mar 2023 01:38:24 +0000 (02:38 +0100)
committerBenjamin Otte <otte.benjamin@googlemail.com>
Sun, 5 Mar 2023 15:23:20 +0000 (15:23 +0000)
The previous check does not longer work.

When a model gets all items deleted, there will still be existing tiles
until the next time garbage collection is run.
So do that before checking if the list is empty.

gtk/gtkgridview.c
gtk/gtklistview.c

index fa2b837af447aee2fdf701b978d895b409d488d3..35a634d119d529dbc7e91311116055d41d910e7e 100644 (file)
@@ -617,7 +617,8 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
   min_row_height = ceil ((double) height / GTK_GRID_VIEW_MAX_VISIBLE_ROWS);
 
   /* step 0: exit early if list is empty */
-  if (gtk_list_item_manager_get_root (self->item_manager) == NULL)
+  tile = gtk_list_tile_gc (self->item_manager, gtk_list_item_manager_get_first (self->item_manager));
+  if (tile == NULL)
     {
       gtk_list_base_allocate (GTK_LIST_BASE (self));
       return;
@@ -634,7 +635,7 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
   /* step 2: determine height of known rows */
   heights = g_array_new (FALSE, FALSE, sizeof (int));
 
-  for (tile = gtk_list_tile_gc (self->item_manager, gtk_list_item_manager_get_first (self->item_manager));
+  for (;
        tile != NULL;
        tile = gtk_list_tile_gc (self->item_manager, tile))
     {
index e9d5d11cf877f8e901bd4864882931d16b34f996..07f6e15303d5adb785e8d921875574ccb2c17310 100644 (file)
@@ -491,7 +491,8 @@ gtk_list_view_size_allocate (GtkWidget *widget,
   opposite_scroll_policy = gtk_list_base_get_scroll_policy (GTK_LIST_BASE (self), opposite_orientation);
 
   /* step 0: exit early if list is empty */
-  if (gtk_list_item_manager_get_root (self->item_manager) == NULL)
+  tile = gtk_list_tile_gc (self->item_manager, gtk_list_item_manager_get_first (self->item_manager));
+  if (tile == NULL)
     {
       gtk_list_base_allocate (GTK_LIST_BASE (self));
       return;
@@ -510,7 +511,7 @@ gtk_list_view_size_allocate (GtkWidget *widget,
   /* step 2: determine height of known list items and gc the list */
   heights = g_array_new (FALSE, FALSE, sizeof (int));
 
-  for (tile = gtk_list_tile_gc (self->item_manager, gtk_list_item_manager_get_first (self->item_manager));
+  for (;
        tile != NULL;
        tile = gtk_list_tile_gc (self->item_manager, gtk_rb_tree_node_get_next (tile)))
     {