#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)
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,
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);
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.
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);
}
/**
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);
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);
}
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))
{
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
* @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.
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"