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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user