mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-13 14:00:09 +00:00
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:
parent
c46b5ed646
commit
678eb8ab76
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user