X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktreemodel.c;h=2f8294b62111b87a411bdf19f3698da276253b77;hb=8f98233affcb8c3e1a3dbf4e11c45266d3a5be1e;hp=bf77aff8344820e18303eb6b38315db48c6f8672;hpb=278873e4b7ccb8356f99cfa5ab433daf76668dac;p=~andy%2Fgtk diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c index bf77aff83..2f8294b62 100644 --- a/gtk/gtktreemodel.c +++ b/gtk/gtktreemodel.c @@ -27,6 +27,7 @@ #include "gtktreeview.h" #include "gtktreeprivate.h" #include "gtkmarshalers.h" +#include "gtkintl.h" #include "gtkalias.h" @@ -101,7 +102,7 @@ gtk_tree_model_get_type (void) if (! tree_model_type) { - static const GTypeInfo tree_model_info = + const GTypeInfo tree_model_info = { sizeof (GtkTreeModelIface), /* class_size */ gtk_tree_model_base_init, /* base_init */ @@ -115,7 +116,7 @@ gtk_tree_model_get_type (void) }; tree_model_type = - g_type_register_static (G_TYPE_INTERFACE, "GtkTreeModel", + g_type_register_static (G_TYPE_INTERFACE, I_("GtkTreeModel"), &tree_model_info, 0); g_type_interface_add_prerequisite (tree_model_type, G_TYPE_OBJECT); @@ -136,24 +137,32 @@ gtk_tree_model_base_init (gpointer g_class) GType row_deleted_params[1]; GType rows_reordered_params[3]; - row_inserted_params[0] = GTK_TYPE_TREE_PATH; + row_inserted_params[0] = GTK_TYPE_TREE_PATH | G_SIGNAL_TYPE_STATIC_SCOPE; row_inserted_params[1] = GTK_TYPE_TREE_ITER; - row_deleted_params[0] = GTK_TYPE_TREE_PATH; + row_deleted_params[0] = GTK_TYPE_TREE_PATH | G_SIGNAL_TYPE_STATIC_SCOPE; - rows_reordered_params[0] = GTK_TYPE_TREE_PATH; + rows_reordered_params[0] = GTK_TYPE_TREE_PATH | G_SIGNAL_TYPE_STATIC_SCOPE; rows_reordered_params[1] = GTK_TYPE_TREE_ITER; rows_reordered_params[2] = G_TYPE_POINTER; + /** + * GtkTreeModel::row-changed: + * @tree_model: the #GtkTreeModel on which the signal is emitted + * @path: a #GtkTreePath identifying the changed row + * @iter: a valid #GtkTreeIter pointing to the changed row + * + * This signal is emitted when a row in the model has changed. + */ tree_model_signals[ROW_CHANGED] = - g_signal_new ("row_changed", + g_signal_new (I_("row_changed"), GTK_TYPE_TREE_MODEL, - G_SIGNAL_RUN_LAST, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTreeModelIface, row_changed), NULL, NULL, _gtk_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, - GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_PATH | G_SIGNAL_TYPE_STATIC_SCOPE, GTK_TYPE_TREE_ITER); /* We need to get notification about structure changes @@ -168,10 +177,23 @@ gtk_tree_model_base_init (gpointer g_class) * is to keep proper ordering with respect to signal handlers * connected normally and after. */ + + /** + * GtkTreeModel::row-inserted: + * @tree_model: the #GtkTreeModel on which the signal is emitted + * @path: a #GtkTreePath identifying the new row + * @iter: a valid #GtkTreeIter pointing to the new row + * + * This signal is emitted when a new row has been inserted in the model. + * + * Note that the row may still be empty at this point, since + * it is a common pattern to first insert an empty row, and + * then fill it with the desired values. + */ closure = g_closure_new_simple (sizeof (GClosure), NULL); g_closure_set_marshal (closure, row_inserted_marshal); tree_model_signals[ROW_INSERTED] = - g_signal_newv ("row_inserted", + g_signal_newv (I_("row_inserted"), GTK_TYPE_TREE_MODEL, G_SIGNAL_RUN_FIRST, closure, @@ -180,21 +202,47 @@ gtk_tree_model_base_init (gpointer g_class) G_TYPE_NONE, 2, row_inserted_params); + /** + * GtkTreeModel::row-has-child-toggled: + * @tree_model: the #GtkTreeModel on which the signal is emitted + * @path: a #GtkTreePath identifying the row + * @iter: a valid #GtkTreeIter pointing to the row + * + * This signal is emitted when a row has gotten the first child row or lost + * its last child row. + */ tree_model_signals[ROW_HAS_CHILD_TOGGLED] = - g_signal_new ("row_has_child_toggled", + g_signal_new (I_("row_has_child_toggled"), GTK_TYPE_TREE_MODEL, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkTreeModelIface, row_has_child_toggled), NULL, NULL, _gtk_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, - GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_PATH | G_SIGNAL_TYPE_STATIC_SCOPE, GTK_TYPE_TREE_ITER); + /** + * GtkTreeModel::row-deleted: + * @tree_model: the #GtkTreeModel on which the signal is emitted + * @path: a #GtkTreePath identifying the row + * + * This signal is emitted when a row has been deleted. + * + * Note that no iterator is passed to the signal handler, + * since the row is already deleted. + * + * Implementations of GtkTreeModel must emit row-deleted + * before removing the node from its + * internal data structures. This is because models and + * views which access and monitor this model might have + * references on the node which need to be released in the + * row-deleted handler. + */ closure = g_closure_new_simple (sizeof (GClosure), NULL); g_closure_set_marshal (closure, row_deleted_marshal); tree_model_signals[ROW_DELETED] = - g_signal_newv ("row_deleted", + g_signal_newv (I_("row_deleted"), GTK_TYPE_TREE_MODEL, G_SIGNAL_RUN_FIRST, closure, @@ -203,10 +251,24 @@ gtk_tree_model_base_init (gpointer g_class) G_TYPE_NONE, 1, row_deleted_params); + /** + * GtkTreeModel::rows-reordered: + * @tree_model: the #GtkTreeModel on which the signal is emitted + * @path: a #GtkTreePath identifying the tree node whose children + * have been reordered + * @iter: a valid #GtkTreeIter pointing to the node whose + * + * This signal is emitted when the children of a node in the #GtkTreeModel + * have been reordered. + * + * Note that this signal is not emitted + * when rows are reordered by DND, since this is implemented + * by removing and then reinserting the row. + */ closure = g_closure_new_simple (sizeof (GClosure), NULL); g_closure_set_marshal (closure, rows_reordered_marshal); tree_model_signals[ROWS_REORDERED] = - g_signal_newv ("rows_reordered", + g_signal_newv (I_("rows_reordered"), GTK_TYPE_TREE_MODEL, G_SIGNAL_RUN_FIRST, closure, @@ -327,7 +389,7 @@ GtkTreePath * gtk_tree_path_new (void) { GtkTreePath *retval; - retval = (GtkTreePath *) g_new (GtkTreePath, 1); + retval = g_new (GtkTreePath, 1); retval->depth = 0; retval->indices = NULL; @@ -432,22 +494,24 @@ gtk_tree_path_new_from_indices (gint first_index, gchar * gtk_tree_path_to_string (GtkTreePath *path) { - gchar *retval, *ptr; - gint i; + gchar *retval, *ptr, *end; + gint i, n; g_return_val_if_fail (path != NULL, NULL); if (path->depth == 0) return NULL; - ptr = retval = (gchar *) g_new0 (char *, path->depth*8); - g_sprintf (retval, "%d", path->indices[0]); - while (*ptr != '\000') + n = path->depth * 12; + ptr = retval = g_new0 (gchar, n); + end = ptr + n; + g_snprintf (retval, end - ptr, "%d", path->indices[0]); + while (*ptr != '\000') ptr++; for (i = 1; i < path->depth; i++) { - g_sprintf (ptr, ":%d", path->indices[i]); + g_snprintf (ptr, end - ptr, ":%d", path->indices[i]); while (*ptr != '\000') ptr++; } @@ -599,7 +663,7 @@ gtk_tree_path_get_type (void) static GType our_type = 0; if (our_type == 0) - our_type = g_boxed_type_register_static ("GtkTreePath", + our_type = g_boxed_type_register_static (I_("GtkTreePath"), (GBoxedCopyFunc) gtk_tree_path_copy, (GBoxedFreeFunc) gtk_tree_path_free); @@ -800,7 +864,7 @@ gtk_tree_iter_copy (GtkTreeIter *iter) g_return_val_if_fail (iter != NULL, NULL); - retval = g_new (GtkTreeIter, 1); + retval = g_slice_new (GtkTreeIter); *retval = *iter; return retval; @@ -818,7 +882,7 @@ gtk_tree_iter_free (GtkTreeIter *iter) { g_return_if_fail (iter != NULL); - g_free (iter); + g_slice_free (GtkTreeIter, iter); } GType @@ -827,7 +891,7 @@ gtk_tree_iter_get_type (void) static GType our_type = 0; if (our_type == 0) - our_type = g_boxed_type_register_static ("GtkTreeIter", + our_type = g_boxed_type_register_static (I_("GtkTreeIter"), (GBoxedCopyFunc) gtk_tree_iter_copy, (GBoxedFreeFunc) gtk_tree_iter_free); @@ -1479,7 +1543,7 @@ gtk_tree_model_row_deleted (GtkTreeModel *tree_model, * @path: A #GtkTreePath pointing to the tree node whose children have been * reordered * @iter: A valid #GtkTreeIter pointing to the node whose children have been - * reordered + * reordered, or %NULL if the depth of @path is 0. * @new_order: an array of integers mapping the current position of each child * to its old position before the re-ordering, * i.e. @new_order[newpos] = oldpos. @@ -1535,9 +1599,9 @@ gtk_tree_model_foreach_helper (GtkTreeModel *model, * @func: A function to be called on each row * @user_data: User data to passed to func. * - * Calls func on each node in model in a depth-first fashion. If func returns - * %TRUE, then the tree ceases to be walked, and gtk_tree_model_foreach() - * returns. + * Calls func on each node in model in a depth-first fashion. + * If @func returns %TRUE, then the tree ceases to be walked, and + * gtk_tree_model_foreach() returns. **/ void gtk_tree_model_foreach (GtkTreeModel *model, @@ -1577,7 +1641,7 @@ gtk_tree_row_reference_get_type (void) static GType our_type = 0; if (our_type == 0) - our_type = g_boxed_type_register_static ("GtkTreeRowReference", + our_type = g_boxed_type_register_static (I_("GtkTreeRowReference"), (GBoxedCopyFunc) gtk_tree_row_reference_copy, (GBoxedFreeFunc) gtk_tree_row_reference_free); @@ -1913,7 +1977,7 @@ gtk_tree_row_reference_new_proxy (GObject *proxy, refs->list = NULL; g_object_set_data_full (G_OBJECT (proxy), - ROW_REF_DATA_STRING, + I_(ROW_REF_DATA_STRING), refs, release_row_references); } @@ -2027,7 +2091,7 @@ gtk_tree_row_reference_free (GtkTreeRowReference *reference) if (refs->list == NULL) { g_object_set_data (G_OBJECT (reference->proxy), - ROW_REF_DATA_STRING, + I_(ROW_REF_DATA_STRING), NULL); }