]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkliststore.c
Fix for #312924, by John Finlay.
[~andy/gtk] / gtk / gtkliststore.c
index 29ed16ea924a57e9246132ef2220fdef1971b283..b44f116171632642413b214d92137a28afe1e9c4 100644 (file)
 #include <config.h>
 #include <string.h>
 #include <gobject/gvaluecollector.h>
-#include "gtkalias.h"
 #include "gtktreemodel.h"
 #include "gtkliststore.h"
 #include "gtktreedatalist.h"
 #include "gtktreednd.h"
 #include "gtksequence.h"
+#include "gtkalias.h"
 
 #define GTK_LIST_STORE_IS_SORTED(list) (GTK_LIST_STORE (list)->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
 #define VALID_ITER(iter, list_store) ((iter)!= NULL && (iter)->user_data != NULL && list_store->stamp == (iter)->stamp && !_gtk_sequence_ptr_is_end ((iter)->user_data) && _gtk_sequence_ptr_get_sequence ((iter)->user_data) == list_store->seq)
@@ -74,6 +74,8 @@ static void gtk_list_store_set_column_type (GtkListStore *list_store,
                                            gint          column,
                                            GType         type);
 
+static void gtk_list_store_increment_stamp (GtkListStore *list_store);
+
 
 /* Drag and Drop */
 static gboolean real_gtk_list_store_row_draggable (GtkTreeDragSource *drag_source,
@@ -576,7 +578,7 @@ gtk_list_store_iter_children (GtkTreeModel *tree_model,
 
   list_store = GTK_LIST_STORE (tree_model);
 
-  if (_gtk_sequence_get_length (list_store->seq) == 0)
+  if (_gtk_sequence_get_length (list_store->seq) > 0)
     {
       iter->stamp = list_store->stamp;
       iter->user_data = _gtk_sequence_get_begin_ptr (list_store->seq);
@@ -1121,6 +1123,16 @@ gtk_list_store_append (GtkListStore *list_store,
   gtk_list_store_insert (list_store, iter, _gtk_sequence_get_length (list_store->seq));
 }
 
+static void
+gtk_list_store_increment_stamp (GtkListStore *list_store)
+{
+  do
+    {
+      list_store->stamp++;
+    }
+  while (list_store->stamp == 0);
+}
+
 /**
  * gtk_list_store_clear:
  * @list_store: a #GtkListStore.
@@ -1140,6 +1152,8 @@ gtk_list_store_clear (GtkListStore *list_store)
       iter.user_data = _gtk_sequence_get_begin_ptr (list_store->seq);
       gtk_list_store_remove (list_store, &iter);
     }
+
+  gtk_list_store_increment_stamp (list_store);
 }
 
 /**
@@ -1413,21 +1427,27 @@ gtk_list_store_reorder (GtkListStore *store,
   GtkTreePath *path;
   GHashTable *new_positions;
   GtkSequencePtr ptr;
-
+  gint *order;
+  
   g_return_if_fail (GTK_IS_LIST_STORE (store));
   g_return_if_fail (!GTK_LIST_STORE_IS_SORTED (store));
   g_return_if_fail (new_order != NULL);
 
+  order = g_new (gint, _gtk_sequence_get_length (store->seq));
+  for (i = 0; i < _gtk_sequence_get_length (store->seq); i++)
+    order[new_order[i]] = i;
+  
   new_positions = g_hash_table_new (g_direct_hash, g_direct_equal);
 
   ptr = _gtk_sequence_get_begin_ptr (store->seq);
   i = 0;
   while (!_gtk_sequence_ptr_is_end (ptr))
     {
-      g_hash_table_insert (new_positions, ptr, GINT_TO_POINTER (new_order[i++]));
+      g_hash_table_insert (new_positions, ptr, GINT_TO_POINTER (order[i++]));
 
       ptr = _gtk_sequence_ptr_next (ptr);
     }
+  g_free (order);
   
   _gtk_sequence_sort (store->seq, gtk_list_store_reorder_func, new_positions);
 
@@ -1470,7 +1490,7 @@ generate_order (GtkSequence *seq,
   while (!_gtk_sequence_ptr_is_end (ptr))
     {
       int old_pos = GPOINTER_TO_INT (g_hash_table_lookup (old_positions, ptr));
-      order[old_pos] = i++;
+      order[i++] = old_pos;
       ptr = _gtk_sequence_ptr_next (ptr);
     }
 
@@ -1716,10 +1736,11 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
                                  gint          column)
 
 {
-  GtkTreePath *tmp_path;
+  GtkTreePath *path;
 
-  tmp_path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_store), iter);
-  gtk_tree_model_row_changed (GTK_TREE_MODEL (list_store), tmp_path, iter);
+  path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_store), iter);
+  gtk_tree_model_row_changed (GTK_TREE_MODEL (list_store), path, iter);
+  gtk_tree_path_free (path);
 
   if (!iter_is_sorted (list_store, iter))
     {
@@ -1731,12 +1752,12 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
                                   gtk_list_store_compare_func,
                                   list_store);
       order = generate_order (list_store->seq, old_positions);
+      path = gtk_tree_path_new ();
       gtk_tree_model_rows_reordered (GTK_TREE_MODEL (list_store),
-                                     tmp_path, NULL, order);
+                                     path, NULL, order);
+      gtk_tree_path_free (path);
       g_free (order);
     }
-
-  gtk_tree_path_free (tmp_path);
 }
 
 static gboolean
@@ -1978,7 +1999,7 @@ gtk_list_store_insert_with_values (GtkListStore *list_store,
  * @values: an array of GValues 
  * @n_values: the length of the @columns and @values arrays
  * 
- * A variant of gtk_list_Store_insert_with_values() which
+ * A variant of gtk_list_store_insert_with_values() which
  * takes the columns and values as two arrays, instead of
  * varargs. This function is mainly intended for 
  * language-bindings.
@@ -2070,3 +2091,6 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store,
   gtk_tree_model_row_inserted (GTK_TREE_MODEL (list_store), path, iter);
   gtk_tree_path_free (path);
 }
+
+#define __GTK_LIST_STORE_C__
+#include "gtkaliasdef.c"