X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktreestore.c;h=21e7a205d95a941ab9e429cd1b9a649da6cf2b1e;hb=HEAD;hp=fd0b3fff64b6525e8cabd9147e7c96c7c97a0a20;hpb=121746605bc8efbeea1276cd657d9e1916facd8b;p=~andy%2Fgtk diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index fd0b3fff6..21e7a205d 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.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" @@ -25,6 +23,7 @@ #include "gtktreedatalist.h" #include "gtktreednd.h" #include "gtkbuildable.h" +#include "gtkdebug.h" #include "gtkintl.h" @@ -104,6 +103,8 @@ static void gtk_tree_store_get_value (GtkTreeModel *tree_mode GValue *value); static gboolean gtk_tree_store_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter); +static gboolean gtk_tree_store_iter_previous (GtkTreeModel *tree_model, + GtkTreeIter *iter); static gboolean gtk_tree_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent); @@ -236,6 +237,7 @@ gtk_tree_store_tree_model_init (GtkTreeModelIface *iface) iface->get_path = gtk_tree_store_get_path; iface->get_value = gtk_tree_store_get_value; iface->iter_next = gtk_tree_store_iter_next; + iface->iter_previous = gtk_tree_store_iter_previous; iface->iter_children = gtk_tree_store_iter_children; iface->iter_has_child = gtk_tree_store_iter_has_child; iface->iter_n_children = gtk_tree_store_iter_n_children; @@ -300,11 +302,11 @@ gtk_tree_store_init (GtkTreeStore *tree_store) /** * gtk_tree_store_new: * @n_columns: number of columns in the tree 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 tree 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, * GDK_TYPE_PIXBUF); will create a new #GtkTreeStore with three columns, of type @@ -351,6 +353,7 @@ gtk_tree_store_new (gint n_columns, * Non vararg creation function. Used primarily by language bindings. * * Return value: (transfer full): a new #GtkTreeStore + * Rename to: gtk_tree_store_new **/ GtkTreeStore * gtk_tree_store_newv (gint n_columns, @@ -555,13 +558,19 @@ gtk_tree_store_get_iter (GtkTreeModel *tree_model, parent.user_data = priv->root; if (!gtk_tree_store_iter_nth_child (tree_model, iter, &parent, indices[0])) - return FALSE; + { + iter->stamp = 0; + return FALSE; + } for (i = 1; i < depth; i++) { parent = *iter; if (!gtk_tree_store_iter_nth_child (tree_model, iter, &parent, indices[i])) - return FALSE; + { + iter->stamp = 0; + return FALSE; + } } return TRUE; @@ -671,16 +680,33 @@ gtk_tree_store_iter_next (GtkTreeModel *tree_model, g_return_val_if_fail (iter->user_data != NULL, FALSE); g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->priv->stamp, FALSE); - if (G_NODE (iter->user_data)->next) + if (G_NODE (iter->user_data)->next == NULL) { - iter->user_data = G_NODE (iter->user_data)->next; - return TRUE; + iter->stamp = 0; + return FALSE; } - else + + iter->user_data = G_NODE (iter->user_data)->next; + + return TRUE; +} + +static gboolean +gtk_tree_store_iter_previous (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + g_return_val_if_fail (iter->user_data != NULL, FALSE); + g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->priv->stamp, FALSE); + + if (G_NODE (iter->user_data)->prev == NULL) { iter->stamp = 0; return FALSE; } + + iter->user_data = G_NODE (iter->user_data)->prev; + + return TRUE; } static gboolean @@ -821,14 +847,13 @@ gtk_tree_store_real_set_value (GtkTreeStore *tree_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, @@ -836,6 +861,8 @@ gtk_tree_store_real_set_value (GtkTreeStore *tree_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", @@ -1012,7 +1039,7 @@ gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store, while (column != -1) { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; gchar *error = NULL; if (column < 0 || column >= priv->n_columns) @@ -1020,9 +1047,9 @@ gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store, g_warning ("%s: Invalid column number %d added to iter (remember to end your list of columns with a -1)", G_STRLOC, column); break; } - g_value_init (&value, priv->column_headers[column]); - G_VALUE_COLLECT (&value, var_args, 0, &error); + G_VALUE_COLLECT_INIT (&value, priv->column_headers[column], + var_args, 0, &error); if (error) { g_warning ("%s: %s", G_STRLOC, error); @@ -1064,6 +1091,7 @@ gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store, * the number of columns to change is not known until run-time. * * Since: 2.12 + * Rename to: gtk_tree_store_set **/ void gtk_tree_store_set_valuesv (GtkTreeStore *tree_store, @@ -1141,13 +1169,13 @@ gtk_tree_store_set_valist (GtkTreeStore *tree_store, * gtk_tree_store_set: * @tree_store: A #GtkTreeStore * @iter: A valid #GtkTreeIter for the row being modified - * @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, - * each column number followed by the value to be set. + * each column number followed by the value to be set. * The list is terminated by a -1. For example, to set column 0 with type - * %G_TYPE_STRING to "Foo", you would write + * %G_TYPE_STRING to "Foo", you would write * gtk_tree_store_set (store, iter, 0, "Foo", -1). * * The value will be referenced by the store if it is a %G_TYPE_OBJECT, and it @@ -1238,14 +1266,14 @@ gtk_tree_store_remove (GtkTreeStore *tree_store, * @tree_store: A #GtkTreeStore * @iter: (out): An unset #GtkTreeIter to set to the new row * @parent: (allow-none): A valid #GtkTreeIter, or %NULL - * @position: position to insert the new row + * @position: position to insert the new row, or -1 for last * * Creates a new row at @position. If parent is non-%NULL, then the row will be * made a child of @parent. Otherwise, the row will be created at the toplevel. - * If @position is larger than the number of rows at that level, then the new - * row will be inserted to the end of the list. @iter will be changed to point - * to this new row. The row will be empty after this function is called. To - * fill in values, you need to call gtk_tree_store_set() or + * If @position is -1 or is larger than the number of rows at that level, then + * the new row will be inserted to the end of the list. @iter will be changed + * to point to this new row. The row will be empty after this function is + * called. To fill in values, you need to call gtk_tree_store_set() or * gtk_tree_store_set_value(). * **/ @@ -1463,12 +1491,12 @@ gtk_tree_store_insert_after (GtkTreeStore *tree_store, * @tree_store: A #GtkTreeStore * @iter: (out) (allow-none): An unset #GtkTreeIter to set the new row, or %NULL. * @parent: (allow-none): A valid #GtkTreeIter, or %NULL - * @position: position to insert the new row - * @Varargs: pairs of column number and value, terminated with -1 + * @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 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 + * 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 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 @@ -1555,9 +1583,9 @@ gtk_tree_store_insert_with_values (GtkTreeStore *tree_store, * @tree_store: A #GtkTreeStore * @iter: (out) (allow-none): An unset #GtkTreeIter to set the new row, or %NULL. * @parent: (allow-none): A valid #GtkTreeIter, or %NULL - * @position: position to insert the new row - * @columns: an array of column numbers - * @values: an array of GValues + * @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 * * A variant of gtk_tree_store_insert_with_values() which takes @@ -1565,6 +1593,7 @@ gtk_tree_store_insert_with_values (GtkTreeStore *tree_store, * function is mainly intended for language bindings. * * Since: 2.10 + * Rename to: gtk_tree_store_insert_with_values */ void gtk_tree_store_insert_with_valuesv (GtkTreeStore *tree_store, @@ -2225,10 +2254,10 @@ gtk_tree_store_reorder_func (gconstpointer a, } /** - * gtk_tree_store_reorder: + * gtk_tree_store_reorder: (skip) * @tree_store: A #GtkTreeStore. * @parent: A #GtkTreeIter. - * @new_order: an array of integers mapping the new position of each child + * @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. *