summaryrefslogtreecommitdiff
path: root/gtk/gtktreestore.c
diff options
context:
space:
mode:
authorKristian Rietveld <kris@gtk.org>2007-06-04 23:48:38 +0000
committerKristian Rietveld <kristian@src.gnome.org>2007-06-04 23:48:38 +0000
commit21b381a2e29bb13e29502b6eeff2375c69e31a67 (patch)
tree97d5092a20e6570512b274374d8151e9202d6e80 /gtk/gtktreestore.c
parent3337ee8fa2fde7db58f4fe60ac55caad2189e4fa (diff)
downloadgtk+-21b381a2e29bb13e29502b6eeff2375c69e31a67.tar.gz
Fix #399071, suggestion from Benoit Dejean.
2007-06-05 Kristian Rietveld <kris@gtk.org> Fix #399071, suggestion from Benoit Dejean. * gtk/gtkliststore.[ch] (gtk_list_store_set_vector_internal): new function, factored out code iterating (columns, values) vectors from gtk_list_store_new_with_valuesv to here, (gtk_list_store_set_valuesv): new public function to set list store values using (columns, values) vectors, (gtk_list_store_new_with_valuesv): call new _set_vector_internal instead. * gtk/gtktreestore.[ch] (gtk_tree_store_set_vector_internal), (gtk_tree_store_set_valuesv), (gtk_tree_store_new_with_valuesv): likewise. * gtk/gtk.symbols: updated. svn path=/trunk/; revision=18041
Diffstat (limited to 'gtk/gtktreestore.c')
-rw-r--r--gtk/gtktreestore.c93
1 files changed, 77 insertions, 16 deletions
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c
index 55a89af428..4379af70bb 100644
--- a/gtk/gtktreestore.c
+++ b/gtk/gtktreestore.c
@@ -864,6 +864,34 @@ gtk_tree_store_get_compare_func (GtkTreeStore *tree_store)
}
static void
+gtk_tree_store_set_vector_internal (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ gboolean *emit_signal,
+ gboolean *maybe_need_sort,
+ gint *columns,
+ GValue *values,
+ gint n_values)
+{
+ gint i;
+ GtkTreeIterCompareFunc func = NULL;
+
+ func = gtk_tree_store_get_compare_func (tree_store);
+ if (func != _gtk_tree_data_list_compare_func)
+ *maybe_need_sort = TRUE;
+
+ for (i = 0; i < n_values; i++)
+ {
+ *emit_signal = gtk_tree_store_real_set_value (tree_store, iter,
+ columns[i], &values[i],
+ FALSE) || *emit_signal;
+
+ if (func == _gtk_tree_data_list_compare_func &&
+ columns[i] == tree_store->sort_column_id)
+ *maybe_need_sort = TRUE;
+ }
+}
+
+static void
gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store,
GtkTreeIter *iter,
gboolean *emit_signal,
@@ -920,6 +948,52 @@ gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store,
}
/**
+ * gtk_tree_store_set_valuesv:
+ * @tree_store: A #GtkTreeStore
+ * @iter: A valid #GtkTreeIter for the row being modified
+ * @columns: an array of column numbers
+ * @values: an array of GValues
+ * @n_values: the length of the @columns and @values arrays
+ *
+ * A variant of gtk_tree_store_set_valist() which takes
+ * the columns and values as two arrays, instead of varargs. This
+ * function is mainly intended for language bindings or in case
+ * the number of columns to change is not known until run-time.
+ *
+ * Since: 2.12
+ **/
+void
+gtk_tree_store_set_valuesv (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ gint *columns,
+ GValue *values,
+ gint n_values)
+{
+ gboolean emit_signal = FALSE;
+ gboolean maybe_need_sort = FALSE;
+
+ g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+ g_return_if_fail (VALID_ITER (iter, tree_store));
+
+ gtk_tree_store_set_vector_internal (tree_store, iter,
+ &emit_signal,
+ &maybe_need_sort,
+ columns, values, n_values);
+
+ if (maybe_need_sort && GTK_TREE_STORE_IS_SORTED (tree_store))
+ gtk_tree_store_sort_iter_changed (tree_store, iter, tree_store->sort_column_id, TRUE);
+
+ if (emit_signal)
+ {
+ GtkTreePath *path;
+
+ path = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter);
+ gtk_tree_path_free (path);
+ }
+}
+
+/**
* gtk_tree_store_set_valist:
* @tree_store: A #GtkTreeStore
* @iter: A valid #GtkTreeIter for the row being modified
@@ -1394,8 +1468,6 @@ gtk_tree_store_insert_with_valuesv (GtkTreeStore *tree_store,
GtkTreeIter tmp_iter;
gboolean changed = FALSE;
gboolean maybe_need_sort = FALSE;
- GtkTreeIterCompareFunc func = NULL;
- gint i;
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
@@ -1418,20 +1490,9 @@ gtk_tree_store_insert_with_valuesv (GtkTreeStore *tree_store,
iter->user_data = new_node;
g_node_insert (parent_node, position, new_node);
- func = gtk_tree_store_get_compare_func (tree_store);
- if (func != _gtk_tree_data_list_compare_func)
- maybe_need_sort = TRUE;
-
- for (i = 0; i < n_values; i++)
- {
- changed = gtk_tree_store_real_set_value (tree_store, iter,
- columns[i], &values[i],
- FALSE) || changed;
-
- if (func == _gtk_tree_data_list_compare_func &&
- columns[i] == tree_store->sort_column_id)
- maybe_need_sort = TRUE;
- }
+ gtk_tree_store_set_vector_internal (tree_store, iter,
+ &changed, &maybe_need_sort,
+ columns, values, n_values);
if (maybe_need_sort && GTK_TREE_STORE_IS_SORTED (tree_store))
gtk_tree_store_sort_iter_changed (tree_store, iter, tree_store->sort_column_id, FALSE);