maplistmodel: Fix items-changed emission

We were modifying the removed value before passing
it to the items-changed signal, so we always ended
up with removed == 0 in our signal emission, instead
of passing the original value on, as we should.

Pointed out in !4870
This commit is contained in:
Matthias Clasen 2022-07-14 16:50:22 -04:00
parent c46b5ed646
commit 678eb8ab76

View File

@ -220,6 +220,7 @@ gtk_map_list_model_items_changed_cb (GListModel *model,
{ {
MapNode *node; MapNode *node;
guint start, end; guint start, end;
guint count;
if (self->items == NULL) if (self->items == NULL)
{ {
@ -232,21 +233,22 @@ gtk_map_list_model_items_changed_cb (GListModel *model,
node = gtk_map_list_model_get_nth (self->items, position, &start); node = gtk_map_list_model_get_nth (self->items, position, &start);
g_assert (start <= position); g_assert (start <= position);
while (removed > 0) count = removed;
while (count > 0)
{ {
end = start + node->n_items; end = start + node->n_items;
if (start == position && end <= position + removed) if (start == position && end <= position + count)
{ {
MapNode *next = gtk_rb_tree_node_get_next (node); MapNode *next = gtk_rb_tree_node_get_next (node);
removed -= node->n_items; count -= node->n_items;
gtk_rb_tree_remove (self->items, node); gtk_rb_tree_remove (self->items, node);
node = next; node = next;
} }
else else
{ {
if (end >= position + removed) if (end >= position + count)
{ {
node->n_items -= removed; node->n_items -= count;
removed = 0; removed = 0;
gtk_rb_tree_node_mark_dirty (node); gtk_rb_tree_node_mark_dirty (node);
} }
@ -255,7 +257,7 @@ gtk_map_list_model_items_changed_cb (GListModel *model,
guint overlap = node->n_items - (position - start); guint overlap = node->n_items - (position - start);
node->n_items -= overlap; node->n_items -= overlap;
gtk_rb_tree_node_mark_dirty (node); gtk_rb_tree_node_mark_dirty (node);
removed -= overlap; count -= overlap;
start = position; start = position;
node = gtk_rb_tree_node_get_next (node); node = gtk_rb_tree_node_get_next (node);
} }