]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreemodelsort.c
recommit after tagging 2_0_1
[~andy/gtk] / gtk / gtktreemodelsort.c
index 03d3adad45888aba15621feba936378bbc070d9c..1869090759bb25a926bfb4fb6ddc95633de39f0a 100644 (file)
@@ -1287,7 +1287,12 @@ gtk_tree_model_sort_set_sort_func (GtkTreeSortable        *sortable,
     }
 
   if (header->destroy)
-    (* header->destroy) (header->data);
+    {
+      GtkDestroyNotify d = header->destroy;
+
+      header->destroy = NULL;
+      d (header->data);
+    }
 
   header->func = func;
   header->data = data;
@@ -1305,7 +1310,12 @@ gtk_tree_model_sort_set_default_sort_func (GtkTreeSortable        *sortable,
   g_return_if_fail (GTK_IS_TREE_MODEL_SORT (sortable));
 
   if (tree_model_sort->default_sort_destroy)
-    (* tree_model_sort->default_sort_destroy) (tree_model_sort->default_sort_data);
+    {
+      GtkDestroyNotify d = tree_model_sort->default_sort_destroy;
+
+      tree_model_sort->default_sort_destroy = NULL;
+      d (tree_model_sort->default_sort_data);
+    }
 
   tree_model_sort->default_sort_func = func;
   tree_model_sort->default_sort_data = data;
@@ -1430,7 +1440,7 @@ gtk_tree_model_sort_sort_level (GtkTreeModelSort *tree_model_sort,
     }
   else
     {
-      data.parent_path = gtk_tree_path_new_root ();
+      data.parent_path = gtk_tree_path_new_first ();
     }
   data.parent_path_depth = gtk_tree_path_get_depth (data.parent_path);
   data.parent_path_indices = gtk_tree_path_get_indices (data.parent_path);
@@ -1653,6 +1663,12 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *tree_model_sort,
   elt.ref_count = 0;
   elt.children = NULL;
 
+  /* update all larger offsets */
+  tmp_elt = SORT_ELT (level->array->data);
+  for (i = 0; i < level->array->len; i++, tmp_elt++)
+    if (tmp_elt->offset >= offset)
+      tmp_elt->offset++;
+
   if (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
       tree_model_sort->default_sort_func == NO_SORT_FUNC)
     index = offset;
@@ -1662,16 +1678,10 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *tree_model_sort,
                                                    FALSE);
 
   g_array_insert_vals (level->array, index, &elt, 1);
-
-  /* update all larger offsets */
   tmp_elt = SORT_ELT (level->array->data);
   for (i = 0; i < level->array->len; i++, tmp_elt++)
-    {
-      if ((tmp_elt->offset >= offset) && i != index)
-       tmp_elt->offset++;
-      if (tmp_elt->children)
-       tmp_elt->children->parent_elt = tmp_elt;
-    }
+    if (tmp_elt->children)
+      tmp_elt->children->parent_elt = tmp_elt;
 
   return TRUE;
 }
@@ -1954,14 +1964,16 @@ gtk_tree_model_sort_convert_path_to_child_path (GtkTreeModelSort *tree_model_sor
   for (i = 0; i < gtk_tree_path_get_depth (sorted_path); i++)
     {
       if ((level == NULL) ||
-         (level->array->len > sorted_indices[i]))
+         (level->array->len <= sorted_indices[i]))
        {
          gtk_tree_path_free (retval);
          return NULL;
        }
       if (g_array_index (level->array, SortElt, sorted_indices[i]).children == NULL)
        gtk_tree_model_sort_build_level (tree_model_sort, level, &g_array_index (level->array, SortElt, sorted_indices[i]));
+
       if (level == NULL)
+       break;
 
       gtk_tree_path_append_index (retval, g_array_index (level->array, SortElt, i).offset);
     }
@@ -1975,7 +1987,7 @@ gtk_tree_model_sort_convert_path_to_child_path (GtkTreeModelSort *tree_model_sor
  * @child_iter: An uninitialized #GtkTreeIter
  * @sorted_iter: A valid #GtkTreeIter pointing to a row on @tree_model_sort.
  * 
- * Sets @child_iter to point to the row pointed to by *sorted_iter.
+ * Sets @child_iter to point to the row pointed to by @sorted_iter.
  **/
 void
 gtk_tree_model_sort_convert_iter_to_child_iter (GtkTreeModelSort *tree_model_sort,
@@ -2017,7 +2029,7 @@ gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
 
   if (parent_level == NULL)
     {
-      if (gtk_tree_model_get_iter_root (tree_model_sort->child_model, &iter) == FALSE)
+      if (gtk_tree_model_get_iter_first (tree_model_sort->child_model, &iter) == FALSE)
        return;
       length = gtk_tree_model_iter_n_children (tree_model_sort->child_model, NULL);
     }
@@ -2187,7 +2199,12 @@ gtk_tree_model_sort_reset_default_sort_func (GtkTreeModelSort *tree_model_sort)
   g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
 
   if (tree_model_sort->default_sort_destroy)
-    (* tree_model_sort->default_sort_destroy) (tree_model_sort->default_sort_data);
+    {
+      GtkDestroyNotify d = tree_model_sort->default_sort_destroy;
+
+      tree_model_sort->default_sort_destroy = NULL;
+      d (tree_model_sort->default_sort_data);
+    }
 
   tree_model_sort->default_sort_func = NO_SORT_FUNC;
   tree_model_sort->default_sort_data = NULL;