From f8faec4574fbc9651f369768da85d54ebadc5cbb Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Fri, 10 Nov 2000 19:38:53 +0000 Subject: [PATCH] use the new BOXED marshallers. Fri Nov 10 12:10:34 2000 Jonathan Blandford * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new BOXED marshallers. * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. (gtk_list_store_class_init): use the new BOXED marshallers. * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change new_with_values to new_with_types. (gtk_tree_store_get_column_type): add this. (gtk_tree_store_class_init): use the new BOXED marshallers. * gtk/gtkmarshal.list: Added a number of BOXED marshallers to mirror some POINTER marshallers. --- ChangeLog | 16 ++++ ChangeLog.pre-2-0 | 16 ++++ ChangeLog.pre-2-10 | 16 ++++ ChangeLog.pre-2-2 | 16 ++++ ChangeLog.pre-2-4 | 16 ++++ ChangeLog.pre-2-6 | 16 ++++ ChangeLog.pre-2-8 | 16 ++++ demos/gtk-demo/main.c | 2 +- demos/testgtk/main.c | 2 +- gtk/gtkliststore.c | 45 +++++++---- gtk/gtkmarshal.list | 10 ++- gtk/gtkmarshalers.list | 10 ++- gtk/gtkmodelsimple.c | 103 ++++++++++++------------ gtk/gtktreemodelsort.c | 179 ++++++++++++++++++++++++++--------------- gtk/gtktreestore.c | 48 +++++++---- gtk/gtktreestore.h | 2 +- gtk/treestoretest.c | 2 +- tests/treestoretest.c | 2 +- 18 files changed, 359 insertions(+), 158 deletions(-) diff --git a/ChangeLog b/ChangeLog index e19d8625c..25d6f67f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index e19d8625c..25d6f67f7 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index e19d8625c..25d6f67f7 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index e19d8625c..25d6f67f7 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index e19d8625c..25d6f67f7 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index e19d8625c..25d6f67f7 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index e19d8625c..25d6f67f7 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,19 @@ +Fri Nov 10 12:10:34 2000 Jonathan Blandford + + * gtk/gtkliststore.c (gtk_model_simple_class_init): use the new + BOXED marshallers. + + * gtk/gtkliststore.c (gtk_list_store_get_column_type): Add this. + (gtk_list_store_class_init): use the new BOXED marshallers. + + * gtk/gtktreestore.c (gtk_tree_store_new_with_types): change + new_with_values to new_with_types. + (gtk_tree_store_get_column_type): add this. + (gtk_tree_store_class_init): use the new BOXED marshallers. + + * gtk/gtkmarshal.list: Added a number of BOXED marshallers to + mirror some POINTER marshallers. + Thu Nov 9 11:23:22 2000 Jonathan Blandford * gtk/gtktreemodel.h (struct _GtkTreeIter): added more fields to diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c index baa906d0a..56a094eca 100644 --- a/demos/gtk-demo/main.c +++ b/demos/gtk-demo/main.c @@ -299,7 +299,7 @@ create_tree (void) GtkTreeIter iter; gint i; - model = gtk_tree_store_new_with_values (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); + model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); diff --git a/demos/testgtk/main.c b/demos/testgtk/main.c index baa906d0a..56a094eca 100644 --- a/demos/testgtk/main.c +++ b/demos/testgtk/main.c @@ -299,7 +299,7 @@ create_tree (void) GtkTreeIter iter; gint i; - model = gtk_tree_store_new_with_values (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); + model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c index c50974b4e..fb23aadfb 100644 --- a/gtk/gtkliststore.c +++ b/gtk/gtkliststore.c @@ -40,6 +40,8 @@ static void gtk_list_store_class_init (GtkListStoreClass *class); static void gtk_list_store_tree_model_init (GtkTreeModelIface *iface); static guint gtk_list_store_get_flags (GtkTreeModel *tree_model); static gint gtk_list_store_get_n_columns (GtkTreeModel *tree_model); +static GType gtk_list_store_get_column_type (GtkTreeModel *tree_model, + gint index); static gboolean gtk_list_store_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path); @@ -115,36 +117,36 @@ gtk_list_store_class_init (GtkListStoreClass *class) GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkListStoreClass, changed), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); list_store_signals[INSERTED] = gtk_signal_new ("inserted", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkListStoreClass, inserted), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); list_store_signals[CHILD_TOGGLED] = gtk_signal_new ("child_toggled", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkListStoreClass, child_toggled), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); list_store_signals[DELETED] = gtk_signal_new ("deleted", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkListStoreClass, deleted), - gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + GTK_TYPE_TREE_PATH); gtk_object_class_add_signals (object_class, list_store_signals, LAST_SIGNAL); @@ -155,6 +157,7 @@ gtk_list_store_tree_model_init (GtkTreeModelIface *iface) { iface->get_flags = gtk_list_store_get_flags; iface->get_n_columns = gtk_list_store_get_n_columns; + iface->get_column_type = gtk_list_store_get_column_type; iface->get_iter = gtk_list_store_get_iter; iface->get_path = gtk_list_store_get_path; iface->get_value = gtk_list_store_get_value; @@ -260,6 +263,17 @@ gtk_list_store_get_n_columns (GtkTreeModel *tree_model) return GTK_LIST_STORE (tree_model)->n_columns; } +static GType +gtk_list_store_get_column_type (GtkTreeModel *tree_model, + gint index) +{ + g_return_val_if_fail (GTK_IS_LIST_STORE (tree_model), G_TYPE_INVALID); + g_return_val_if_fail (index < GTK_LIST_STORE (tree_model)->n_columns && + index >= 0, G_TYPE_INVALID); + + return GTK_LIST_STORE (tree_model)->column_headers[index]; +} + static gboolean gtk_list_store_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, @@ -643,7 +657,6 @@ gtk_list_store_append (GtkListStore *list_store, g_return_if_fail (list_store != NULL); g_return_if_fail (GTK_IS_LIST_STORE (list_store)); g_return_if_fail (iter != NULL); - g_return_if_fail (G_SLIST (iter)->next == NULL); iter->stamp = list_store->stamp; iter->tree_node = g_slist_alloc (); diff --git a/gtk/gtkmarshal.list b/gtk/gtkmarshal.list index 5e01c765e..f011f28b7 100644 --- a/gtk/gtkmarshal.list +++ b/gtk/gtkmarshal.list @@ -21,6 +21,9 @@ # NONE deprecated alias for VOID # BOOL deprecated alias for BOOLEAN +BOOLEAN:BOXED +BOOLEAN:BOXED,BOXED +BOOLEAN:BOXED,BOXED,INT BOOLEAN:POINTER BOOLEAN:POINTER,POINTER BOOLEAN:POINTER,INT,INT @@ -29,8 +32,10 @@ BOOLEAN:POINTER,POINTER,INT BOOLEAN:POINTER,POINTER,INT,INT BOOLEAN:POINTER,STRING,STRING,POINTER BOOLEAN:VOID +BOXED:BOXED ENUM:ENUM INT:INT +INT:BOXED INT:OBJECT,BOXED,BOXED INT:POINTER INT:POINTER,CHAR,CHAR @@ -40,9 +45,11 @@ POINTER:POINTER,INT POINTER:VOID VOID:BOOLEAN VOID:BOXED -VOID:BOXED,OBJECT +VOID:BOXED,BOXED VOID:BOXED,BOXED,BOOLEAN VOID:BOXED,BOXED,INT,BOOLEAN +VOID:BOXED,INT,POINTER +VOID:BOXED,OBJECT VOID:BOXED,UINT,FLAGS VOID:ENUM VOID:ENUM,FLOAT @@ -63,7 +70,6 @@ VOID:POINTER,BOOLEAN VOID:POINTER,INT VOID:POINTER,INT,INT,POINTER,UINT,UINT VOID:POINTER,INT,POINTER -VOID:POINTER,POINTER VOID:POINTER,POINTER,BOOLEAN VOID:POINTER,POINTER,INT VOID:POINTER,POINTER,INT,BOOLEAN diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list index 5e01c765e..f011f28b7 100644 --- a/gtk/gtkmarshalers.list +++ b/gtk/gtkmarshalers.list @@ -21,6 +21,9 @@ # NONE deprecated alias for VOID # BOOL deprecated alias for BOOLEAN +BOOLEAN:BOXED +BOOLEAN:BOXED,BOXED +BOOLEAN:BOXED,BOXED,INT BOOLEAN:POINTER BOOLEAN:POINTER,POINTER BOOLEAN:POINTER,INT,INT @@ -29,8 +32,10 @@ BOOLEAN:POINTER,POINTER,INT BOOLEAN:POINTER,POINTER,INT,INT BOOLEAN:POINTER,STRING,STRING,POINTER BOOLEAN:VOID +BOXED:BOXED ENUM:ENUM INT:INT +INT:BOXED INT:OBJECT,BOXED,BOXED INT:POINTER INT:POINTER,CHAR,CHAR @@ -40,9 +45,11 @@ POINTER:POINTER,INT POINTER:VOID VOID:BOOLEAN VOID:BOXED -VOID:BOXED,OBJECT +VOID:BOXED,BOXED VOID:BOXED,BOXED,BOOLEAN VOID:BOXED,BOXED,INT,BOOLEAN +VOID:BOXED,INT,POINTER +VOID:BOXED,OBJECT VOID:BOXED,UINT,FLAGS VOID:ENUM VOID:ENUM,FLOAT @@ -63,7 +70,6 @@ VOID:POINTER,BOOLEAN VOID:POINTER,INT VOID:POINTER,INT,INT,POINTER,UINT,UINT VOID:POINTER,INT,POINTER -VOID:POINTER,POINTER VOID:POINTER,POINTER,BOOLEAN VOID:POINTER,POINTER,INT VOID:POINTER,POINTER,INT,BOOLEAN diff --git a/gtk/gtkmodelsimple.c b/gtk/gtkmodelsimple.c index ddfc733f7..12da7adfa 100644 --- a/gtk/gtkmodelsimple.c +++ b/gtk/gtkmodelsimple.c @@ -135,36 +135,36 @@ gtk_model_simple_class_init (GtkModelSimpleClass *class) GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkModelSimpleClass, changed), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); model_simple_signals[INSERTED] = gtk_signal_new ("inserted", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkModelSimpleClass, inserted), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); model_simple_signals[CHILD_TOGGLED] = gtk_signal_new ("child_toggled", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkModelSimpleClass, child_toggled), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); model_simple_signals[DELETED] = gtk_signal_new ("deleted", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkModelSimpleClass, deleted), - gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + GTK_TYPE_TREE_PATH); model_simple_signals[GET_N_COLUMNS] = gtk_signal_new ("get_n_columns", @@ -172,93 +172,94 @@ gtk_model_simple_class_init (GtkModelSimpleClass *class) GTK_CLASS_TYPE (object_class), 0, gtk_marshal_INT__VOID, - GTK_TYPE_INT, 0); + G_TYPE_INT, 0); model_simple_signals[GET_COLUMN_TYPE] = gtk_signal_new ("get_column_type", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, gtk_marshal_INT__INT, - GTK_TYPE_INT, 1, - GTK_TYPE_INT); + G_TYPE_INT, 1, + G_TYPE_INT); model_simple_signals[GET_ITER] = gtk_signal_new ("get_iter", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_BOOLEAN__POINTER_POINTER, - GTK_TYPE_BOOL, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_BOOLEAN__BOXED_BOXED, + G_TYPE_BOOLEAN, 2, + GTK_TYPE_TREE_ITER, + GTK_TYPE_TREE_PATH); model_simple_signals[GET_PATH] = gtk_signal_new ("get_path", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_POINTER__POINTER, - GTK_TYPE_POINTER, 1, - GTK_TYPE_POINTER); + gtk_marshal_BOXED__BOXED, + GTK_TYPE_TREE_PATH, 1, + GTK_TYPE_TREE_ITER); model_simple_signals[GET_VALUE] = gtk_signal_new ("get_value", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_VOID__POINTER_INT_POINTER, - GTK_TYPE_NONE, 3, - GTK_TYPE_POINTER, - GTK_TYPE_INT, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_INT_POINTER, + G_TYPE_NONE, 3, + GTK_TYPE_TREE_ITER, + G_TYPE_INT, + G_TYPE_POINTER); model_simple_signals[ITER_NEXT] = gtk_signal_new ("iter_next", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_BOOLEAN__POINTER, - GTK_TYPE_BOOL, 1, - GTK_TYPE_POINTER); + gtk_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, + GTK_TYPE_TREE_ITER); model_simple_signals[ITER_CHILDREN] = gtk_signal_new ("iter_children", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_BOOLEAN__POINTER_POINTER, - GTK_TYPE_POINTER, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_BOOLEAN__BOXED_BOXED, + G_TYPE_BOOLEAN, 2, + GTK_TYPE_TREE_ITER, + GTK_TYPE_TREE_ITER); model_simple_signals[ITER_HAS_CHILD] = gtk_signal_new ("iter_has_child", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_BOOLEAN__POINTER, - GTK_TYPE_BOOL, 1, - GTK_TYPE_POINTER); + gtk_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, + GTK_TYPE_TREE_ITER); model_simple_signals[ITER_N_CHILDREN] = gtk_signal_new ("iter_n_children", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_INT__POINTER, - GTK_TYPE_INT, 1, - GTK_TYPE_POINTER); + gtk_marshal_INT__BOXED, + G_TYPE_INT, 1, + GTK_TYPE_TREE_ITER); model_simple_signals[ITER_NTH_CHILD] = gtk_signal_new ("node_nth_child", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_BOOLEAN__POINTER_POINTER_INT, - GTK_TYPE_BOOL, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_BOOLEAN__BOXED_BOXED_INT, + GTK_TYPE_BOOL, 3, + GTK_TYPE_TREE_ITER, + GTK_TYPE_TREE_ITER, + G_TYPE_INT); model_simple_signals[ITER_PARENT] = gtk_signal_new ("node_parent", GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), 0, - gtk_marshal_BOOLEAN__POINTER_POINTER, - GTK_TYPE_BOOL, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_BOOLEAN__BOXED_BOXED, + G_TYPE_BOOLEAN, 2, + GTK_TYPE_TREE_ITER, + GTK_TYPE_TREE_ITER); gtk_object_class_add_signals (object_class, model_simple_signals, LAST_SIGNAL); } diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c index 608aeb84f..bbfbd5e1c 100644 --- a/gtk/gtktreemodelsort.c +++ b/gtk/gtktreemodelsort.c @@ -17,8 +17,16 @@ * Boston, MA 02111-1307, USA. */ + +/* NOTE: There is a potential for confusion in this code as to whether an iter, + * path or value refers to the GtkTreeModelSort model, or the model being + * sorted. As a convention, variables referencing the sorted model will have an + * s_ prefix before them (ie. s_iter, s_value, s_path); + */ + #include "gtktreemodelsort.h" #include "gtksignal.h" +#include enum { CHANGED, @@ -372,27 +380,31 @@ gtk_tree_model_sort_finalize (GObject *object) } static void -gtk_tree_model_sort_changed (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, +gtk_tree_model_sort_changed (GtkTreeModel *s_model, + GtkTreePath *s_path, + GtkTreeIter *s_iter, gpointer data) { GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data); - GtkTreePath *local_path; - GtkTreeIter local_iter; + GtkTreePath *path; + GtkTreeIter iter; + gboolean free_s_path = FALSE; + + g_return_if_fail (s_path != NULL || s_iter != NULL); - g_return_if_fail (path != NULL || iter != NULL); + if (s_path == NULL) + { + free_s_path = TRUE; + s_path = gtk_tree_model_get_path (s_model, s_iter); + } - if (path == NULL) - path = gtk_tree_model_get_path (model, iter); + path = gtk_tree_model_sort_convert_path (tree_model_sort, s_path); + gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path); + gtk_signal_emit_by_name (GTK_OBJECT (data), "changed", path, &iter); - local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path); - gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &local_iter, local_path); - gtk_signal_emit_by_name (GTK_OBJECT (data), - "changed", - local_path, - &local_iter); - gtk_tree_path_free (local_path); + gtk_tree_path_free (path); + if (free_s_path) + gtk_tree_path_free (s_path); } #if 0 @@ -442,14 +454,17 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort, new_elt.parent = ((SortElt *) iter.tree_node); new_elt.children = NULL; - last = 0; - j = array->len/2; + low = 0; + high = array->len; + middle = (low + high)/2; + + /* Insert the value into the array */ while (1) { gint cmp; - tmp_elt = &(g_array_index (array, SortElt, j)); + tmp_elt = &(g_array_index (array, SortElt,middle)); gtk_tree_model_get_value (sort->model, tmp_elt, sort->sort_col, &tmp_value); - + cmp = ((func) (&tmp_value, value)); if (retval < 0) ; @@ -463,91 +478,123 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort, #endif static void -gtk_tree_model_sort_inserted (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, +gtk_tree_model_sort_inserted (GtkTreeModel *s_model, + GtkTreePath *s_path, + GtkTreeIter *s_iter, gpointer data) { GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data); - GtkTreePath *local_path; - GtkTreeIter local_iter; - GValue value; + GtkTreePath *path; + GtkTreeIter iter; - g_return_if_fail (path != NULL || iter != NULL); + g_return_if_fail (s_path != NULL || s_iter != NULL); - if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST) && - (tree_model_sort->root != NULL)) + if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST)) { gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root); tree_model_sort->root = NULL; } + else + { + } - if (path == NULL) - path = gtk_tree_model_get_path (model, iter); + if (s_path == NULL) + s_path = gtk_tree_model_get_path (s_model, s_iter); - local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path); - gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &local_iter, local_path); - gtk_signal_emit_by_name (GTK_OBJECT (data), - "inserted", - local_path, - &local_iter); - gtk_tree_path_free (local_path); + path = gtk_tree_model_sort_convert_path (tree_model_sort, s_path); + gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path); + gtk_signal_emit_by_name (GTK_OBJECT (data), "inserted", path, iter); + gtk_tree_path_free (path); } static void -gtk_tree_model_sort_child_toggled (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, +gtk_tree_model_sort_child_toggled (GtkTreeModel *s_model, + GtkTreePath *s_path, + GtkTreeIter *s_iter, gpointer data) { GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data); - GtkTreePath *local_path; - GtkTreeIter local_iter; + GtkTreePath *path; + GtkTreeIter iter; + gboolean free_s_path = FALSE; - g_return_if_fail (path != NULL || iter != NULL); + g_return_if_fail (s_path != NULL || s_iter != NULL); - if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST) && - (tree_model_sort->root != NULL)) + if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST)) { gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root); tree_model_sort->root = NULL; } - if (path == NULL) - path = gtk_tree_model_get_path (model, iter); + if (s_path == NULL) + { + s_path = gtk_tree_model_get_path (s_model, s_iter); + free_s_path = TRUE; + } - local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path); - gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &local_iter, local_path); + path = gtk_tree_model_sort_convert_path (tree_model_sort, s_path); + gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path); gtk_signal_emit_by_name (GTK_OBJECT (data), "child_toggled", - local_path, - &local_iter); - gtk_tree_path_free (local_path); + path, &iter); + gtk_tree_path_free (path); + if (free_s_path) + gtk_tree_path_free (s_path); } static void -gtk_tree_model_sort_deleted (GtkTreeModel *model, - GtkTreePath *path, +gtk_tree_model_sort_deleted (GtkTreeModel *s_model, + GtkTreePath *s_path, gpointer data) { GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data); - GtkTreePath *local_path; + GtkTreePath *path; + g_return_if_fail (s_path != NULL); + path = gtk_tree_model_sort_convert_path (tree_model_sort, s_path); g_return_if_fail (path != NULL); - if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST) && - (tree_model_sort->root != NULL)) + if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST)) { gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root); tree_model_sort->root = NULL; } - local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path); - tree_model_sort->stamp++; - gtk_signal_emit_by_name (GTK_OBJECT (data), - "deleted", - local_path); + else + { + GArray *array; + GtkTreeIter iter; + SortElt *elt; + gint offset; + gint i; + + gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_model_sort), &iter, path); + elt = (SortElt *) iter.tree_node; + offset = elt->offset; + array = get_array (elt, tree_model_sort); + if (array->len == 1) + { + if (((SortElt *)array->data)->parent == NULL) + tree_model_sort->root = NULL; + else + (((SortElt *)array->data)->parent)->children = NULL; + gtk_tree_model_sort_free_level (array); + } + else + { + g_array_remove_index (array, elt - ((SortElt *) array->data)); - gtk_tree_path_free (local_path); + for (i = 0; i < array->len; i++) + { + elt = & (g_array_index (array, SortElt, i)); + if (elt->offset > offset) + elt->offset--; + } + } + } + + tree_model_sort->stamp++; + gtk_signal_emit_by_name (GTK_OBJECT (data), "deleted", path); + gtk_tree_path_free (path); } static gint @@ -822,7 +869,7 @@ static void gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort, SortElt *place) { - gint n, i; + gint n, i = 0; GArray *children; GtkTreeIter *parent_iter = NULL; GtkTreeIter iter; @@ -848,7 +895,6 @@ gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort, &iter, parent_iter); - i = 0; do { elt.iter = iter; @@ -869,6 +915,9 @@ gtk_tree_model_sort_free_level (GArray *array) { gint i; + if (array == NULL) + return; + for (i = 0; i < array->len; i++) { SortElt *elt; diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index 44befc800..c85c251b8 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -42,6 +42,8 @@ static void gtk_tree_store_class_init (GtkTreeStoreClass *tree_stor static void gtk_tree_store_tree_model_init (GtkTreeModelIface *iface); static guint gtk_tree_store_get_flags (GtkTreeModel *tree_model); static gint gtk_tree_store_get_n_columns (GtkTreeModel *tree_model); +static GType gtk_tree_store_get_column_type (GtkTreeModel *tree_model, + gint index); static GtkTreePath *gtk_tree_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter); static void gtk_tree_store_get_value (GtkTreeModel *tree_model, @@ -114,36 +116,36 @@ gtk_tree_store_class_init (GtkTreeStoreClass *tree_store_class) GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkTreeStoreClass, changed), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); tree_store_signals[INSERTED] = gtk_signal_new ("inserted", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkTreeStoreClass, inserted), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); tree_store_signals[CHILD_TOGGLED] = gtk_signal_new ("child_toggled", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkTreeStoreClass, child_toggled), - gtk_marshal_VOID__POINTER_POINTER, - GTK_TYPE_NONE, 2, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); tree_store_signals[DELETED] = gtk_signal_new ("deleted", GTK_RUN_FIRST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkTreeStoreClass, deleted), - gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); + gtk_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + GTK_TYPE_TREE_PATH); gtk_object_class_add_signals (object_class, tree_store_signals, LAST_SIGNAL); } @@ -153,6 +155,7 @@ gtk_tree_store_tree_model_init (GtkTreeModelIface *iface) { iface->get_flags = gtk_tree_store_get_flags; iface->get_n_columns = gtk_tree_store_get_n_columns; + iface->get_column_type = gtk_tree_store_get_column_type; iface->get_path = gtk_tree_store_get_path; iface->get_value = gtk_tree_store_get_value; iface->iter_next = gtk_tree_store_iter_next; @@ -177,8 +180,8 @@ gtk_tree_store_new (void) } GtkTreeStore * -gtk_tree_store_new_with_values (gint n_columns, - ...) +gtk_tree_store_new_with_types (gint n_columns, + ...) { GtkTreeStore *retval; va_list args; @@ -262,6 +265,17 @@ gtk_tree_store_get_n_columns (GtkTreeModel *tree_model) return GTK_TREE_STORE (tree_model)->n_columns; } +static GType +gtk_tree_store_get_column_type (GtkTreeModel *tree_model, + gint index) +{ + g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), G_TYPE_INVALID); + g_return_val_if_fail (index < GTK_TREE_STORE (tree_model)->n_columns && + index >= 0, G_TYPE_INVALID); + + return GTK_TREE_STORE (tree_model)->column_headers[index]; +} + static GtkTreePath * gtk_tree_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter) diff --git a/gtk/gtktreestore.h b/gtk/gtktreestore.h index 48e2a0b1d..373c11792 100644 --- a/gtk/gtktreestore.h +++ b/gtk/gtktreestore.h @@ -70,7 +70,7 @@ struct _GtkTreeStoreClass GtkType gtk_tree_store_get_type (void); GtkTreeStore *gtk_tree_store_new (void); -GtkTreeStore *gtk_tree_store_new_with_values (gint n_columns, +GtkTreeStore *gtk_tree_store_new_with_types (gint n_columns, ...); void gtk_tree_store_set_n_columns (GtkTreeStore *tree_store, gint n_columns); diff --git a/gtk/treestoretest.c b/gtk/treestoretest.c index 3835d9d17..15ac08230 100644 --- a/gtk/treestoretest.c +++ b/gtk/treestoretest.c @@ -261,7 +261,7 @@ main (int argc, char *argv[]) { gtk_init (&argc, &argv); - model = gtk_tree_store_new_with_values (2, G_TYPE_STRING, G_TYPE_STRING); + model = gtk_tree_store_new_with_types (2, G_TYPE_STRING, G_TYPE_STRING); make_window (); make_window (); diff --git a/tests/treestoretest.c b/tests/treestoretest.c index 3835d9d17..15ac08230 100644 --- a/tests/treestoretest.c +++ b/tests/treestoretest.c @@ -261,7 +261,7 @@ main (int argc, char *argv[]) { gtk_init (&argc, &argv); - model = gtk_tree_store_new_with_values (2, G_TYPE_STRING, G_TYPE_STRING); + model = gtk_tree_store_new_with_types (2, G_TYPE_STRING, G_TYPE_STRING); make_window (); make_window (); -- 2.43.2