X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkliststore.c;h=467bac0f15dc4da7b0a98336a01fe22f63952e7c;hb=fd51c8f5e9d6fb68c8e81b9b1e2ab80931f963f0;hp=4671bfe035b9e2edea8ceb97f83f42b33eba0b4d;hpb=3500063bc1e26626c44368555c6c36bab7299847;p=~andy%2Fgtk diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c index 4671bfe03..467bac0f1 100644 --- a/gtk/gtkliststore.c +++ b/gtk/gtkliststore.c @@ -12,9 +12,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -414,18 +412,18 @@ iter_is_valid (GtkTreeIter *iter, /** * gtk_list_store_new: * @n_columns: number of columns in the list store - * @Varargs: all #GType types for the columns, from first to last + * @...: all #GType types for the columns, from first to last * * Creates a new list store as with @n_columns columns each of the types passed - * in. Note that only types derived from standard GObject fundamental types - * are supported. + * in. Note that only types derived from standard GObject fundamental types + * are supported. * - * As an example, gtk_tree_store_new (3, G_TYPE_INT, G_TYPE_STRING, + * As an example, gtk_list_store_new (3, G_TYPE_INT, G_TYPE_STRING, * GDK_TYPE_PIXBUF); will create a new #GtkListStore with three columns, of type * int, string and #GdkPixbuf respectively. * * Return value: a new #GtkListStore - **/ + */ GtkListStore * gtk_list_store_new (gint n_columns, ...) @@ -445,11 +443,13 @@ gtk_list_store_new (gint n_columns, { GType type = va_arg (args, GType); if (! _gtk_tree_data_list_check_type (type)) - { - g_warning ("%s: Invalid type %s\n", G_STRLOC, g_type_name (type)); - g_object_unref (retval); - return NULL; - } + { + g_warning ("%s: Invalid type %s\n", G_STRLOC, g_type_name (type)); + g_object_unref (retval); + va_end (args); + + return NULL; + } gtk_list_store_set_column_type (retval, i, type); } @@ -467,7 +467,7 @@ gtk_list_store_new (gint n_columns, * * Non-vararg creation function. Used primarily by language bindings. * - * Return value: (transfer none): a new #GtkListStore + * Return value: (transfer full): a new #GtkListStore * Rename to: gtk_list_store_new **/ GtkListStore * @@ -645,7 +645,10 @@ gtk_list_store_get_iter (GtkTreeModel *tree_model, i = gtk_tree_path_get_indices (path)[0]; if (i >= g_sequence_get_length (seq)) - return FALSE; + { + iter->stamp = 0; + return FALSE; + } iter->stamp = priv->stamp; iter->user_data = g_sequence_get_iter_at_pos (seq, i); @@ -833,14 +836,13 @@ gtk_list_store_real_set_value (GtkListStore *list_store, GtkTreeDataList *list; GtkTreeDataList *prev; gint old_column = column; - GValue real_value = {0, }; + GValue real_value = G_VALUE_INIT; gboolean converted = FALSE; gboolean retval = FALSE; if (! g_type_is_a (G_VALUE_TYPE (value), priv->column_headers[column])) { - if (! (g_value_type_compatible (G_VALUE_TYPE (value), priv->column_headers[column]) && - g_value_type_compatible (priv->column_headers[column], G_VALUE_TYPE (value)))) + if (! (g_value_type_transformable (G_VALUE_TYPE (value), priv->column_headers[column]))) { g_warning ("%s: Unable to convert from %s to %s\n", G_STRLOC, @@ -848,6 +850,8 @@ gtk_list_store_real_set_value (GtkListStore *list_store, g_type_name (priv->column_headers[column])); return retval; } + + g_value_init (&real_value, priv->column_headers[column]); if (!g_value_transform (value, &real_value)) { g_warning ("%s: Unable to make conversion from %s to %s\n", @@ -937,7 +941,7 @@ gtk_list_store_set_value (GtkListStore *list_store, gint column, GValue *value) { - GtkListStorePrivate *priv = list_store->priv; + GtkListStorePrivate *priv; g_return_if_fail (GTK_IS_LIST_STORE (list_store)); g_return_if_fail (iter_is_valid (iter, list_store)); @@ -1031,7 +1035,7 @@ gtk_list_store_set_valist_internal (GtkListStore *list_store, while (column != -1) { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; gchar *error = NULL; if (column < 0 || column >= priv->n_columns) @@ -1167,7 +1171,7 @@ gtk_list_store_set_valist (GtkListStore *list_store, * gtk_list_store_set: * @list_store: a #GtkListStore * @iter: row iterator - * @Varargs: pairs of column number and value, terminated with -1 + * @...: pairs of column number and value, terminated with -1 * * Sets the value of one or more cells in the row referenced by @iter. * The variable argument list should contain integer column numbers, @@ -1178,7 +1182,7 @@ gtk_list_store_set_valist (GtkListStore *list_store, * * The value will be referenced by the store if it is a %G_TYPE_OBJECT, and it * will be copied if it is a %G_TYPE_STRING or %G_TYPE_BOXED. - **/ + */ void gtk_list_store_set (GtkListStore *list_store, GtkTreeIter *iter, @@ -1245,12 +1249,12 @@ gtk_list_store_remove (GtkListStore *list_store, * gtk_list_store_insert: * @list_store: A #GtkListStore * @iter: (out): An unset #GtkTreeIter to set to the new row - * @position: position to insert the new row + * @position: position to insert the new row, or -1 for last * * Creates a new row at @position. @iter will be changed to point to this new - * row. If @position is larger than the number of rows on the list, then the - * new row will be appended to the list. The row will be empty after this - * function is called. To fill in values, you need to call + * row. If @position is -1 or is larger than the number of rows on the list, + * then the new row will be appended to the list. The row will be empty after + * this function is called. To fill in values, you need to call * gtk_list_store_set() or gtk_list_store_set_value(). * **/ @@ -1267,7 +1271,6 @@ gtk_list_store_insert (GtkListStore *list_store, g_return_if_fail (GTK_IS_LIST_STORE (list_store)); g_return_if_fail (iter != NULL); - g_return_if_fail (position >= 0); priv = list_store->priv; @@ -1276,7 +1279,7 @@ gtk_list_store_insert (GtkListStore *list_store, seq = priv->seq; length = g_sequence_get_length (seq); - if (position > length) + if (position > length || position < 0) position = length; ptr = g_sequence_get_iter_at_pos (seq, position); @@ -1401,14 +1404,10 @@ void gtk_list_store_append (GtkListStore *list_store, GtkTreeIter *iter) { - GtkListStorePrivate *priv; - g_return_if_fail (GTK_IS_LIST_STORE (list_store)); g_return_if_fail (iter != NULL); - priv = list_store->priv; - - gtk_list_store_insert (list_store, iter, g_sequence_get_length (priv->seq)); + gtk_list_store_insert (list_store, iter, -1); } static void @@ -1687,11 +1686,12 @@ gtk_list_store_reorder_func (GSequenceIter *a, } /** - * gtk_list_store_reorder: (skip) + * gtk_list_store_reorder: * @store: A #GtkListStore. - * @new_order: (array): an array of integers mapping the new position of each child - * to its old position before the re-ordering, - * i.e. @new_order[newpos] = oldpos. + * @new_order: (array zero-terminated=1): an array of integers mapping the new + * position of each child to its old position before the re-ordering, + * i.e. @new_order[newpos] = oldpos. It must have + * exactly as many items as the list store's length. * * Reorders @store to follow the order indicated by @new_order. Note that * this function only works with unsorted stores. @@ -2165,18 +2165,19 @@ gtk_list_store_has_default_sort_func (GtkTreeSortable *sortable) /** * gtk_list_store_insert_with_values: * @list_store: A #GtkListStore - * @iter: (out) (allow-none): An unset #GtkTreeIter to set to the new row, or %NULL. - * @position: position to insert the new row - * @Varargs: pairs of column number and value, terminated with -1 + * @iter: (out) (allow-none): An unset #GtkTreeIter to set to the new row, or %NULL + * @position: position to insert the new row, or -1 to append after existing + * rows + * @...: pairs of column number and value, terminated with -1 + * + * Creates a new row at @position. @iter will be changed to point to this new + * row. If @position is -1, or larger than the number of rows in the list, then + * the new row will be appended to the list. The row will be filled with the + * values given to this function. * - * Creates a new row at @position. @iter will be changed to point to this new - * row. If @position is larger than the number of rows on the list, then the - * new row will be appended to the list. The row will be filled with the - * values given to this function. - * * Calling - * gtk_list_store_insert_with_values(list_store, iter, position...) - * has the same effect as calling + * gtk_list_store_insert_with_values (list_store, iter, position...) + * has the same effect as calling * |[ * gtk_list_store_insert (list_store, iter, position); * gtk_list_store_set (list_store, iter, ...); @@ -2184,7 +2185,7 @@ gtk_list_store_has_default_sort_func (GtkTreeSortable *sortable) * with the difference that the former will only emit a row_inserted signal, * while the latter will emit row_inserted, row_changed and, if the list store * is sorted, rows_reordered. Since emitting the rows_reordered signal - * repeatedly can affect the performance of the program, + * repeatedly can affect the performance of the program, * gtk_list_store_insert_with_values() should generally be preferred when * inserting rows in a sorted list store. * @@ -2219,7 +2220,7 @@ gtk_list_store_insert_with_values (GtkListStore *list_store, seq = priv->seq; length = g_sequence_get_length (seq); - if (position > length) + if (position > length || position < 0) position = length; ptr = g_sequence_get_iter_at_pos (seq, position); @@ -2255,7 +2256,7 @@ gtk_list_store_insert_with_values (GtkListStore *list_store, * gtk_list_store_insert_with_valuesv: * @list_store: A #GtkListStore * @iter: (out) (allow-none): An unset #GtkTreeIter to set to the new row, or %NULL. - * @position: position to insert the new row + * @position: position to insert the new row, or -1 for last * @columns: (array length=n_values): an array of column numbers * @values: (array length=n_values): an array of GValues * @n_values: the length of the @columns and @values arrays @@ -2299,7 +2300,7 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store, seq = priv->seq; length = g_sequence_get_length (seq); - if (position > length) + if (position > length || position < 0) position = length; ptr = g_sequence_get_iter_at_pos (seq, position); @@ -2436,10 +2437,12 @@ list_store_start_element (GMarkupParseContext *context, else if (strcmp (element_name, "row") == 0) ; else if (strcmp (element_name, "column") == 0) - for (i = 0; names[i]; i++) - if (strcmp (names[i], "type") == 0) - data->column_type_names = g_slist_prepend (data->column_type_names, - g_strdup (values[i])); + { + for (i = 0; names[i]; i++) + if (strcmp (names[i], "type") == 0) + data->column_type_names = g_slist_prepend (data->column_type_names, + g_strdup (values[i])); + } else if (strcmp (element_name, "columns") == 0) ; else if (strcmp (element_name, "data") == 0)