Factor out another part of gtk_tree_model_filter_row_deleted

This commit is contained in:
Kristian Rietveld 2011-05-09 22:22:24 +02:00
parent 1686e515d6
commit e0f12ce020

View File

@ -1855,6 +1855,86 @@ gtk_tree_model_filter_adjust_virtual_root (GtkTreeModelFilter *filter,
(v_indices[level])--; (v_indices[level])--;
} }
static void
gtk_tree_model_filter_row_deleted_invisible_node (GtkTreeModelFilter *filter,
GtkTreePath *c_path)
{
int i;
int offset;
GtkTreePath *real_path;
FilterLevel *level;
FilterElt *elt;
/* The node deleted in the child model is not visible in the
* filter model. We will not emit a signal, just fixup the offsets
* of the other nodes.
*/
if (!filter->priv->root)
return;
level = FILTER_LEVEL (filter->priv->root);
/* subtract vroot if necessary */
if (filter->priv->virtual_root)
{
real_path = gtk_tree_model_filter_remove_root (c_path,
filter->priv->virtual_root);
/* we don't handle this */
if (!real_path)
return;
}
else
real_path = gtk_tree_path_copy (c_path);
i = 0;
if (gtk_tree_path_get_depth (real_path) - 1 >= 1)
{
/* find the level where the deletion occurred */
while (i < gtk_tree_path_get_depth (real_path) - 1)
{
gint j;
if (!level)
{
/* we don't cover this */
gtk_tree_path_free (real_path);
return;
}
elt = bsearch_elt_with_offset (level->array,
gtk_tree_path_get_indices (real_path)[i],
&j);
if (!elt || !elt->children)
{
/* parent is filtered out, so no level */
gtk_tree_path_free (real_path);
return;
}
level = elt->children;
i++;
}
}
offset = gtk_tree_path_get_indices (real_path)[gtk_tree_path_get_depth (real_path) - 1];
gtk_tree_path_free (real_path);
if (!level)
return;
/* decrease offset of all nodes following the deleted node */
for (i = 0; i < level->array->len; i++)
{
elt = &g_array_index (level->array, FilterElt, i);
if (elt->offset > offset)
elt->offset--;
if (elt->children)
elt->children->parent_elt_index = i;
}
}
static void static void
gtk_tree_model_filter_row_deleted (GtkTreeModel *c_model, gtk_tree_model_filter_row_deleted (GtkTreeModel *c_model,
GtkTreePath *c_path, GtkTreePath *c_path,
@ -1895,76 +1975,7 @@ gtk_tree_model_filter_row_deleted (GtkTreeModel *c_model,
if (!path) if (!path)
{ {
/* The node deleted in the child model is not visible in the gtk_tree_model_filter_row_deleted_invisible_node (filter, c_path);
* filter model. We will not emit a signal, just fixup the offsets
* of the other nodes.
*/
GtkTreePath *real_path;
if (!filter->priv->root)
return;
level = FILTER_LEVEL (filter->priv->root);
/* subtract vroot if necessary */
if (filter->priv->virtual_root)
{
real_path = gtk_tree_model_filter_remove_root (c_path,
filter->priv->virtual_root);
/* we don't handle this */
if (!real_path)
return;
}
else
real_path = gtk_tree_path_copy (c_path);
i = 0;
if (gtk_tree_path_get_depth (real_path) - 1 >= 1)
{
/* find the level where the deletion occurred */
while (i < gtk_tree_path_get_depth (real_path) - 1)
{
gint j;
if (!level)
{
/* we don't cover this */
gtk_tree_path_free (real_path);
return;
}
elt = bsearch_elt_with_offset (level->array,
gtk_tree_path_get_indices (real_path)[i],
&j);
if (!elt || !elt->children)
{
/* parent is filtered out, so no level */
gtk_tree_path_free (real_path);
return;
}
level = elt->children;
i++;
}
}
offset = gtk_tree_path_get_indices (real_path)[gtk_tree_path_get_depth (real_path) - 1];
gtk_tree_path_free (real_path);
if (!level)
return;
/* decrease offset of all nodes following the deleted node */
for (i = 0; i < level->array->len; i++)
{
elt = &g_array_index (level->array, FilterElt, i);
if (elt->offset > offset)
elt->offset--;
if (elt->children)
elt->children->parent_elt_index = i;
}
return; return;
} }