Merge branch 'list-tile-gc' into 'main'

Add gtk_list_item_manager_gc_tiles

See merge request GNOME/gtk!5995
This commit is contained in:
Matthias Clasen
2023-05-21 00:51:00 +00:00
5 changed files with 46 additions and 20 deletions

View File

@@ -756,8 +756,10 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
min_row_height = ceil ((double) height / GTK_GRID_VIEW_MAX_VISIBLE_ROWS);
gtk_list_base_get_border_spacing (GTK_LIST_BASE (self), &xspacing, &yspacing);
gtk_list_item_manager_gc_tiles (self->item_manager);
/* step 0: exit early if list is empty */
tile = gtk_list_tile_gc (self->item_manager, gtk_list_item_manager_get_first (self->item_manager));
tile = gtk_list_item_manager_get_first (self->item_manager);
if (tile == NULL)
{
gtk_list_base_allocate (GTK_LIST_BASE (self));
@@ -776,9 +778,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 != NULL;
tile = gtk_list_tile_gc (self->item_manager, tile))
while (tile != NULL)
{
/* if it's a multirow tile, handle it here */
if (tile->n_items > 1 && tile->n_items >= self->n_columns)
@@ -795,7 +795,7 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
for (i = 0, start = tile;
i < self->n_columns && tile != NULL;
tile = gtk_list_tile_gc (self->item_manager, gtk_rb_tree_node_get_next (tile)))
tile = gtk_rb_tree_node_get_next (tile))
{
if (tile->widget)
{

View File

@@ -1043,7 +1043,7 @@ gtk_list_tile_split (GtkListItemManager *self,
*
* Returns: The next tile or NULL if everything was gc'ed
**/
GtkListTile *
static GtkListTile *
gtk_list_tile_gc (GtkListItemManager *self,
GtkListTile *tile)
{
@@ -1093,6 +1093,18 @@ gtk_list_tile_gc (GtkListItemManager *self,
return tile;
}
void
gtk_list_item_manager_gc_tiles (GtkListItemManager *self)
{
GtkListTile *tile;
for (tile = gtk_list_tile_gc (self, gtk_list_item_manager_get_first (self));
tile != NULL;
tile = gtk_list_tile_gc (self, gtk_rb_tree_node_get_next (tile)))
{
}
}
static void
gtk_list_item_manager_release_items (GtkListItemManager *self,
GtkListItemChange *change)
@@ -1593,7 +1605,6 @@ static void
gtk_list_item_manager_clear_model (GtkListItemManager *self)
{
GtkListItemChange change;
GtkListTile *tile;
GSList *l;
if (self->model == NULL)
@@ -1615,11 +1626,8 @@ gtk_list_item_manager_clear_model (GtkListItemManager *self)
self);
g_clear_object (&self->model);
/* really empty the tiles */
for (tile = gtk_list_tile_gc (self, gtk_list_item_manager_get_first (self));
tile;
tile = gtk_list_tile_gc (self, tile))
{ }
gtk_list_item_manager_gc_tiles (self);
g_assert (gtk_rb_tree_get_root (self->items) == NULL);
}

View File

@@ -94,6 +94,7 @@ gpointer gtk_list_item_manager_get_nth (GtkListItemMana
GtkListTile * gtk_list_item_manager_get_nearest_tile (GtkListItemManager *self,
int x,
int y);
void gtk_list_item_manager_gc_tiles (GtkListItemManager *self);
static inline gboolean
gtk_list_tile_is_header (GtkListTile *tile)
@@ -126,8 +127,6 @@ void gtk_list_tile_set_area_size (GtkListItemMana
GtkListTile * gtk_list_tile_split (GtkListItemManager *self,
GtkListTile *tile,
guint n_items);
GtkListTile * gtk_list_tile_gc (GtkListItemManager *self,
GtkListTile *tile);
void gtk_list_item_manager_set_model (GtkListItemManager *self,
GtkSelectionModel *model);

View File

@@ -608,8 +608,10 @@ gtk_list_view_size_allocate (GtkWidget *widget,
opposite_scroll_policy = gtk_list_base_get_scroll_policy (GTK_LIST_BASE (self), opposite_orientation);
gtk_list_base_get_border_spacing (GTK_LIST_BASE (self), NULL, &spacing);
gtk_list_item_manager_gc_tiles (self->item_manager);
/* step 0: exit early if list is empty */
tile = gtk_list_tile_gc (self->item_manager, gtk_list_item_manager_get_first (self->item_manager));
tile = gtk_list_item_manager_get_first (self->item_manager);
if (tile == NULL)
{
gtk_list_base_allocate (GTK_LIST_BASE (self));
@@ -631,7 +633,7 @@ gtk_list_view_size_allocate (GtkWidget *widget,
for (;
tile != NULL;
tile = gtk_list_tile_gc (self->item_manager, gtk_rb_tree_node_get_next (tile)))
tile = gtk_rb_tree_node_get_next (tile))
{
if (tile->widget == NULL)
continue;

View File

@@ -100,6 +100,7 @@ check_list_item_manager (GtkListItemManager *items,
MATCHED_SECTION,
UNMATCHED_SECTION
} section_state = NO_SECTION;
gboolean after_items = FALSE;
has_sections = gtk_list_item_manager_get_has_sections (items);
@@ -115,6 +116,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_true (has_sections);
g_assert_true (tile->widget);
section_state = MATCHED_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_UNMATCHED_HEADER:
@@ -122,6 +124,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_cmpint (tile->n_items, ==, 0);
g_assert_null (tile->widget);
section_state = UNMATCHED_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_FOOTER:
@@ -130,6 +133,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_true (has_sections);
g_assert_null (tile->widget);
section_state = NO_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_UNMATCHED_FOOTER:
@@ -137,6 +141,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_cmpint (tile->n_items, ==, 0);
g_assert_null (tile->widget);
section_state = NO_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_ITEM:
@@ -152,6 +157,11 @@ check_list_item_manager (GtkListItemManager *items,
g_object_unref (item);
g_assert_cmpint (n_items, ==, gtk_list_item_base_get_position (GTK_LIST_ITEM_BASE (tile->widget)));
g_assert_cmpint (tile->n_items, ==, 1);
after_items = FALSE;
}
else
{
after_items = TRUE;
}
if (tile->n_items)
n_items += tile->n_items;
@@ -184,10 +194,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_true (tile->widget);
}
for (tile = gtk_list_tile_gc (items, gtk_list_item_manager_get_first (items));
tile != NULL;
tile = gtk_list_tile_gc (items, gtk_rb_tree_node_get_next (tile)))
;
gtk_list_item_manager_gc_tiles (items);
n_items = 0;
@@ -203,6 +210,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_true (has_sections);
g_assert_true (tile->widget);
section_state = MATCHED_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_UNMATCHED_HEADER:
@@ -210,6 +218,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_cmpint (tile->n_items, ==, 0);
g_assert_false (tile->widget);
section_state = UNMATCHED_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_FOOTER:
@@ -218,6 +227,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_true (has_sections);
g_assert_false (tile->widget);
section_state = NO_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_UNMATCHED_FOOTER:
@@ -225,6 +235,7 @@ check_list_item_manager (GtkListItemManager *items,
g_assert_cmpint (tile->n_items, ==, 0);
g_assert_false (tile->widget);
section_state = NO_SECTION;
after_items = FALSE;
break;
case GTK_LIST_TILE_ITEM:
@@ -232,6 +243,12 @@ check_list_item_manager (GtkListItemManager *items,
if (tile->widget)
{
g_assert_cmpint (tile->n_items, ==, 1);
after_items = FALSE;
}
else
{
g_assert_false (after_items);
after_items = TRUE;
}
if (tile->n_items)
n_items += tile->n_items;