summaryrefslogtreecommitdiff
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
parent3337ee8fa2fde7db58f4fe60ac55caad2189e4fa (diff)
downloadgdk-pixbuf-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
-rw-r--r--ChangeLog18
-rw-r--r--gtk/gtk.symbols2
-rw-r--r--gtk/gtkliststore.c98
-rw-r--r--gtk/gtkliststore.h5
-rw-r--r--gtk/gtktreestore.c93
-rw-r--r--gtk/gtktreestore.h5
6 files changed, 187 insertions, 34 deletions
diff --git a/ChangeLog b/ChangeLog
index d380de467..f60f5db01 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+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.
+
2007-06-04 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 2c7963580..2f60ca0bd 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 30123a23b..dc5ebbfa9 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 b985bc677..9aeb81b3c 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 55a89af42..4379af70b 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 59d8e7774..b7e61e2a1 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);