diff options
author | Kristian Rietveld <kris@gtk.org> | 2007-06-04 23:48:38 +0000 |
---|---|---|
committer | Kristian Rietveld <kristian@src.gnome.org> | 2007-06-04 23:48:38 +0000 |
commit | 21b381a2e29bb13e29502b6eeff2375c69e31a67 (patch) | |
tree | 97d5092a20e6570512b274374d8151e9202d6e80 /gtk | |
parent | 3337ee8fa2fde7db58f4fe60ac55caad2189e4fa (diff) | |
download | gtk+-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')
-rw-r--r-- | gtk/gtk.symbols | 2 | ||||
-rw-r--r-- | gtk/gtkliststore.c | 98 | ||||
-rw-r--r-- | gtk/gtkliststore.h | 5 | ||||
-rw-r--r-- | gtk/gtktreestore.c | 93 | ||||
-rw-r--r-- | gtk/gtktreestore.h | 5 |
5 files changed, 169 insertions, 34 deletions
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 2c7963580d..2f60ca0bd2 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -2138,6 +2138,7 @@ gtk_list_store_set gtk_list_store_set_column_types gtk_list_store_set_valist gtk_list_store_set_value +gtk_list_store_set_valuesv gtk_list_store_swap #endif #endif @@ -4259,6 +4260,7 @@ gtk_tree_store_set gtk_tree_store_set_column_types gtk_tree_store_set_valist gtk_tree_store_set_value +gtk_tree_store_set_valuesv gtk_tree_store_swap #endif #endif diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c index 30123a23b8..dc5ebbfa9a 100644 --- a/gtk/gtkliststore.c +++ b/gtk/gtkliststore.c @@ -711,6 +711,36 @@ gtk_list_store_get_compare_func (GtkListStore *list_store) } static void +gtk_list_store_set_vector_internal (GtkListStore *list_store, + GtkTreeIter *iter, + gboolean *emit_signal, + gboolean *maybe_need_sort, + gint *columns, + GValue *values, + gint n_values) +{ + gint i; + GtkTreeIterCompareFunc func = NULL; + + func = gtk_list_store_get_compare_func (list_store); + if (func != _gtk_tree_data_list_compare_func) + *maybe_need_sort = TRUE; + + for (i = 0; i < n_values; i++) + { + *emit_signal = gtk_list_store_real_set_value (list_store, + iter, + columns[i], + &values[i], + FALSE) || *emit_signal; + + if (func == _gtk_tree_data_list_compare_func && + columns[i] == list_store->sort_column_id) + *maybe_need_sort = TRUE; + } +} + +static void gtk_list_store_set_valist_internal (GtkListStore *list_store, GtkTreeIter *iter, gboolean *emit_signal, @@ -768,6 +798,53 @@ gtk_list_store_set_valist_internal (GtkListStore *list_store, } /** + * gtk_list_store_set_valuesv: + * @list_store: A #GtkListStore + * @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_list_store_set_valist() which + * takes the columns and values as two arrays, instead of + * varargs. This function is mainly intended for + * language-bindings and in case the number of columns to + * change is not known until run-time. + * + * Since: 2.12 + */ +void +gtk_list_store_set_valuesv (GtkListStore *list_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_LIST_STORE (list_store)); + g_return_if_fail (VALID_ITER (iter, list_store)); + + gtk_list_store_set_vector_internal (list_store, iter, + &emit_signal, + &maybe_need_sort, + columns, values, n_values); + + if (maybe_need_sort && GTK_LIST_STORE_IS_SORTED (list_store)) + gtk_list_store_sort_iter_changed (list_store, iter, list_store->sort_column_id); + + if (emit_signal) + { + GtkTreePath *path; + + path = gtk_list_store_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); + } +} + +/** * gtk_list_store_set_valist: * @list_store: A #GtkListStore * @iter: A valid #GtkTreeIter for the row being modified @@ -1888,8 +1965,6 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store, gint length; gboolean changed = FALSE; gboolean maybe_need_sort = FALSE; - GtkTreeIterCompareFunc func = NULL; - gint i; /* FIXME refactor to reduce overlap with * gtk_list_store_insert_with_values() @@ -1917,22 +1992,9 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store, list_store->length++; - func = gtk_list_store_get_compare_func (list_store); - if (func != _gtk_tree_data_list_compare_func) - maybe_need_sort = TRUE; - - for (i = 0; i < n_values; i++) - { - changed = gtk_list_store_real_set_value (list_store, - iter, - columns[i], - &values[i], - FALSE) || changed; - - if (func == _gtk_tree_data_list_compare_func && - columns[i] == list_store->sort_column_id) - maybe_need_sort = TRUE; - } + gtk_list_store_set_vector_internal (list_store, iter, + &changed, &maybe_need_sort, + columns, values, n_values); /* Don't emit rows_reordered here */ if (maybe_need_sort && GTK_LIST_STORE_IS_SORTED (list_store)) diff --git a/gtk/gtkliststore.h b/gtk/gtkliststore.h index b985bc6771..9aeb81b3c4 100644 --- a/gtk/gtkliststore.h +++ b/gtk/gtkliststore.h @@ -87,6 +87,11 @@ void gtk_list_store_set_value (GtkListStore *list_store, void gtk_list_store_set (GtkListStore *list_store, GtkTreeIter *iter, ...); +void gtk_list_store_set_valuesv (GtkListStore *list_store, + GtkTreeIter *iter, + gint *columns, + GValue *values, + gint n_values); void gtk_list_store_set_valist (GtkListStore *list_store, GtkTreeIter *iter, va_list var_args); 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); diff --git a/gtk/gtktreestore.h b/gtk/gtktreestore.h index 59d8e77741..b7e61e2a15 100644 --- a/gtk/gtktreestore.h +++ b/gtk/gtktreestore.h @@ -86,6 +86,11 @@ void gtk_tree_store_set_value (GtkTreeStore *tree_store, void gtk_tree_store_set (GtkTreeStore *tree_store, GtkTreeIter *iter, ...); +void gtk_tree_store_set_valuesv (GtkTreeStore *tree_store, + GtkTreeIter *iter, + gint *columns, + GValue *values, + gint n_values); void gtk_tree_store_set_valist (GtkTreeStore *tree_store, GtkTreeIter *iter, va_list var_args); |