X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=tests%2Ftesttreeview.c;h=8ee688a937fc679e5da92fe5e6eacc4f17f5ff6d;hb=becb5057fc26e721e49d16b2cd1edc4834d65ce3;hp=eea9d5c852771332faab218af76f3f7d2a67d7e2;hpb=334a40e8939c84d9f164677524e3b265fc801eda;p=~andy%2Fgtk diff --git a/tests/testtreeview.c b/tests/testtreeview.c index eea9d5c85..8ee688a93 100644 --- a/tests/testtreeview.c +++ b/tests/testtreeview.c @@ -1,7 +1,28 @@ +/* testtreeview.c + * Copyright (C) 2001 Red Hat, Inc + * Author: Jonathan Blandford + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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. + */ -#include +#undef GTK_DISABLE_DEPRECATED #include - +#include "prop-editor.h" +#include +#include /* Don't copy this bad example; inline RGB data is always a better * idea than inline XPMs. @@ -32,30 +53,29 @@ static char *book_closed_xpm[] = { " " }; -static GtkWidget* create_prop_editor (GObject *object); static void run_automated_tests (void); /* This custom model is to test custom model use. */ -#define GTK_TYPE_MODEL_TYPES (gtk_tree_model_types_get_type ()) -#define GTK_TREE_MODEL_TYPES(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_MODEL_TYPES, GtkTreeModelTypes)) -#define GTK_TREE_MODEL_TYPES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_MODEL_TYPES, GtkTreeModelTypesClass)) -#define GTK_IS_TREE_MODEL_TYPES(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_MODEL_TYPES)) -#define GTK_IS_TREE_MODEL_TYPES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), GTK_TYPE_MODEL_TYPES)) +#define GTK_TYPE_MODEL_TYPES (gtk_tree_model_types_get_type ()) +#define GTK_TREE_MODEL_TYPES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_MODEL_TYPES, GtkTreeModelTypes)) +#define GTK_TREE_MODEL_TYPES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_MODEL_TYPES, GtkTreeModelTypesClass)) +#define GTK_IS_TREE_MODEL_TYPES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_MODEL_TYPES)) +#define GTK_IS_TREE_MODEL_TYPES_GET_CLASS(klass) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_MODEL_TYPES)) typedef struct _GtkTreeModelTypes GtkTreeModelTypes; typedef struct _GtkTreeModelTypesClass GtkTreeModelTypesClass; struct _GtkTreeModelTypes { - GtkObject parent; + GObject parent; gint stamp; }; struct _GtkTreeModelTypesClass { - GtkObjectClass parent_class; + GObjectClass parent_class; guint (* get_flags) (GtkTreeModel *tree_model); gint (* get_n_columns) (GtkTreeModel *tree_model); @@ -105,7 +125,7 @@ struct _GtkTreeModelTypesClass GtkTreePath *path); }; -GtkType gtk_tree_model_types_get_type (void); +GType gtk_tree_model_types_get_type (void) G_GNUC_CONST; GtkTreeModelTypes *gtk_tree_model_types_new (void); typedef enum @@ -151,7 +171,7 @@ col_clicked_cb (GtkTreeViewColumn *col, gpointer data) { GtkWindow *win; - win = GTK_WINDOW (create_prop_editor (G_OBJECT (col))); + win = GTK_WINDOW (create_prop_editor (G_OBJECT (col), GTK_TYPE_TREE_VIEW_COLUMN)); gtk_window_set_title (win, gtk_tree_view_column_get_title (col)); } @@ -159,13 +179,11 @@ col_clicked_cb (GtkTreeViewColumn *col, gpointer data) static void setup_column (GtkTreeViewColumn *col) { - g_signal_connect_data (G_OBJECT (col), - "clicked", - (GCallback) col_clicked_cb, - NULL, - NULL, - FALSE, - FALSE); + gtk_tree_view_column_set_clickable (col, TRUE); + g_signal_connect (col, + "clicked", + G_CALLBACK (col_clicked_cb), + NULL); } static void @@ -240,6 +258,66 @@ toggled_callback (GtkCellRendererToggle *celltoggle, g_type_name (G_TYPE_FROM_INSTANCE (model))); } +static void +edited_callback (GtkCellRendererText *renderer, + const gchar *path_string, + const gchar *new_text, + GtkTreeView *tree_view) +{ + GtkTreeModel *model = NULL; + GtkTreeModelSort *sort_model = NULL; + GtkTreePath *path; + GtkTreeIter iter; + guint value = atoi (new_text); + + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + + model = gtk_tree_view_get_model (tree_view); + + if (GTK_IS_TREE_MODEL_SORT (model)) + { + sort_model = GTK_TREE_MODEL_SORT (model); + model = gtk_tree_model_sort_get_model (sort_model); + } + + if (model == NULL) + return; + + if (sort_model) + { + g_warning ("FIXME implement conversion from TreeModelSort iter to child model iter"); + return; + } + + path = gtk_tree_path_new_from_string (path_string); + if (!gtk_tree_model_get_iter (model, + &iter, path)) + { + g_warning ("%s: bad path?", G_STRLOC); + return; + } + gtk_tree_path_free (path); + + if (GTK_IS_LIST_STORE (model)) + { + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, + 4, + value, + -1); + } + else if (GTK_IS_TREE_STORE (model)) + { + gtk_tree_store_set (GTK_TREE_STORE (model), + &iter, + 4, + value, + -1); + } + else + g_warning ("don't know how to actually toggle value for model type %s", + g_type_name (G_TYPE_FROM_INSTANCE (model))); +} static ColumnsType current_column_type = COLUMNS_LOTS; @@ -250,7 +328,8 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) GtkCellRenderer *rend; GdkPixbuf *pixbuf; GtkWidget *image; - + GtkObject *adjustment; + current_column_type = type; col = gtk_tree_view_get_column (tree_view, 0); @@ -282,29 +361,26 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - - rend = gtk_cell_renderer_text_pixbuf_new (); + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title (col, "Column 2"); - col = gtk_tree_view_column_new_with_attributes ("Column 2", - rend, - "text", 0, - "pixbuf", 2, - NULL); + rend = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (col, rend, FALSE); + gtk_tree_view_column_add_attribute (col, rend, "pixbuf", 2); + rend = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (col, rend, TRUE); + gtk_tree_view_column_add_attribute (col, rend, "text", 0); setup_column (col); + gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); + gtk_tree_view_set_expander_column (tree_view, col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - rend = gtk_cell_renderer_toggle_new (); - g_signal_connect_data (G_OBJECT (rend), "toggled", - toggled_callback, tree_view, - NULL, FALSE, FALSE); + g_signal_connect (rend, "toggled", + G_CALLBACK (toggled_callback), tree_view); col = gtk_tree_view_column_new_with_attributes ("Column 3", rend, @@ -315,29 +391,25 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm); + pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm); image = gtk_image_new_from_pixbuf (pixbuf); - g_object_unref (G_OBJECT (pixbuf)); + g_object_unref (pixbuf); gtk_widget_show (image); gtk_tree_view_column_set_widget (col, image); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - rend = gtk_cell_renderer_toggle_new (); /* you could also set this per-row by tying it to a column * in the model of course. */ - g_object_set (G_OBJECT (rend), "radio", TRUE, NULL); + g_object_set (rend, "radio", TRUE, NULL); - g_signal_connect_data (G_OBJECT (rend), "toggled", - toggled_callback, tree_view, - NULL, FALSE, FALSE); + g_signal_connect (rend, "toggled", + G_CALLBACK (toggled_callback), tree_view); col = gtk_tree_view_column_new_with_attributes ("Column 4", rend, @@ -347,27 +419,26 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) setup_column (col); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); -#if 0 + rend = gtk_cell_renderer_spin_new (); + + adjustment = gtk_adjustment_new (0, 0, 10000, 100, 100, 100); + g_object_set (rend, "editable", TRUE, NULL); + g_object_set (rend, "adjustment", adjustment, NULL); + + g_signal_connect (rend, "edited", + G_CALLBACK (edited_callback), tree_view); - rend = gtk_cell_renderer_text_new (); - col = gtk_tree_view_column_new_with_attributes ("Column 5", rend, - "text", 3, + "text", 4, NULL); setup_column (col); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); +#if 0 - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - - rend = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes ("Column 6", @@ -379,10 +450,6 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - - rend = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes ("Column 7", @@ -394,9 +461,6 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - rend = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes ("Column 8", @@ -408,10 +472,6 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - - rend = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes ("Column 9", @@ -423,10 +483,6 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - - rend = gtk_cell_renderer_text_new (); col = gtk_tree_view_column_new_with_attributes ("Column 10", @@ -438,13 +494,8 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - #endif - gtk_tree_view_set_expander_column (tree_view, 1); - /* FALL THRU */ case COLUMNS_ONE: @@ -458,10 +509,6 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) setup_column (col); gtk_tree_view_insert_column (GTK_TREE_VIEW (tree_view), col, 0); - - g_object_unref (G_OBJECT (rend)); - g_object_unref (G_OBJECT (col)); - default: break; } @@ -510,10 +557,10 @@ create_list_model (void) t = get_model_types (); - store = gtk_list_store_new_with_types (N_COLUMNS, - t[0], t[1], t[2], - t[3], t[4], t[5], - t[6], t[7], t[8]); + store = gtk_list_store_new (N_COLUMNS, + t[0], t[1], t[2], + t[3], t[4], t[5], + t[6], t[7], t[8]); i = 0; while (i < 200) @@ -552,7 +599,7 @@ typesystem_recurse (GType type, gtk_tree_store_append (store, &iter, parent_iter); - str = g_strdup_printf ("%d", type); + str = g_strdup_printf ("%ld", (glong)type); gtk_tree_store_set (store, &iter, 0, str, 1, g_type_name (type), 2, our_pixbuf, 3, 7.0, 4, (guint) 9000, @@ -594,13 +641,13 @@ create_tree_model (void) t = get_model_types (); - store = gtk_tree_store_new_with_types (N_COLUMNS, - t[0], t[1], t[2], - t[3], t[4], t[5], - t[6], t[7], t[8]); + store = gtk_tree_store_new (N_COLUMNS, + t[0], t[1], t[2], + t[3], t[4], t[5], + t[6], t[7], t[8]); i = 0; - while (i < G_TYPE_LAST_RESERVED_FUNDAMENTAL) + while (i < G_TYPE_FUNDAMENTAL_MAX) { typesystem_recurse (i, NULL, store); @@ -673,23 +720,23 @@ main (int argc, models[MODEL_TREE] = create_tree_model (); model = create_list_model (); - models[MODEL_SORTED_LIST] = gtk_tree_model_sort_new_with_model (model, NULL, 0); - g_object_unref (G_OBJECT (model)); + models[MODEL_SORTED_LIST] = gtk_tree_model_sort_new_with_model (model); + g_object_unref (model); model = create_tree_model (); - models[MODEL_SORTED_TREE] = gtk_tree_model_sort_new_with_model (model, NULL, 0); - g_object_unref (G_OBJECT (model)); + models[MODEL_SORTED_TREE] = gtk_tree_model_sort_new_with_model (model); + g_object_unref (model); - models[MODEL_EMPTY_LIST] = GTK_TREE_MODEL (gtk_list_store_new ()); - models[MODEL_EMPTY_TREE] = GTK_TREE_MODEL (gtk_tree_store_new ()); + models[MODEL_EMPTY_LIST] = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_INT)); + models[MODEL_EMPTY_TREE] = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_INT)); models[MODEL_NULL] = NULL; run_automated_tests (); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - gtk_window_set_default_size (GTK_WINDOW (window), 400, 400); + g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); + gtk_window_set_default_size (GTK_WINDOW (window), 430, 400); table = gtk_table_new (3, 1, FALSE); @@ -697,18 +744,16 @@ main (int argc, tv = gtk_tree_view_new_with_model (models[0]); - gtk_tree_view_set_rows_drag_source (GTK_TREE_VIEW (tv), - GDK_BUTTON1_MASK, - row_targets, - G_N_ELEMENTS (row_targets), - GDK_ACTION_MOVE | GDK_ACTION_COPY, - NULL, NULL); - - gtk_tree_view_set_rows_drag_dest (GTK_TREE_VIEW (tv), - row_targets, - G_N_ELEMENTS (row_targets), - GDK_ACTION_MOVE | GDK_ACTION_COPY, - NULL, NULL); + gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (tv), + GDK_BUTTON1_MASK, + row_targets, + G_N_ELEMENTS (row_targets), + GDK_ACTION_MOVE | GDK_ACTION_COPY); + + gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (tv), + row_targets, + G_N_ELEMENTS (row_targets), + GDK_ACTION_MOVE | GDK_ACTION_COPY); /* Model menu */ @@ -745,10 +790,10 @@ main (int argc, 0, 0, 0, 0); - gtk_signal_connect (GTK_OBJECT (om), - "changed", - GTK_SIGNAL_FUNC (model_selected), - tv); + g_signal_connect (om, + "changed", + G_CALLBACK (model_selected), + tv); /* Columns menu */ @@ -781,10 +826,10 @@ main (int argc, set_columns_type (GTK_TREE_VIEW (tv), COLUMNS_LOTS); gtk_option_menu_set_history (GTK_OPTION_MENU (om), COLUMNS_LOTS); - gtk_signal_connect (GTK_OBJECT (om), - "changed", - GTK_SIGNAL_FUNC (columns_selected), - tv); + g_signal_connect (om, + "changed", + G_CALLBACK (columns_selected), + tv); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), @@ -810,17 +855,7 @@ main (int argc, * GtkTreeModelTypes */ -enum { - CHANGED, - INSERTED, - CHILD_TOGGLED, - DELETED, - - LAST_SIGNAL -}; - static void gtk_tree_model_types_init (GtkTreeModelTypes *model_types); -static void gtk_tree_model_types_class_init (GtkTreeModelTypesClass *class); static void gtk_tree_model_types_tree_model_init (GtkTreeModelIface *iface); static gint gtk_real_model_types_get_n_columns (GtkTreeModel *tree_model); static GType gtk_real_model_types_get_column_type (GtkTreeModel *tree_model, @@ -849,13 +884,10 @@ static gboolean gtk_real_model_types_iter_parent (GtkTreeModel *t GtkTreeIter *child); -static guint model_types_signals[LAST_SIGNAL] = { 0 }; - - -GtkType +GType gtk_tree_model_types_get_type (void) { - static GtkType model_types_type = 0; + static GType model_types_type = 0; if (!model_types_type) { @@ -864,7 +896,7 @@ gtk_tree_model_types_get_type (void) sizeof (GtkTreeModelTypesClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc) gtk_tree_model_types_class_init, + NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (GtkTreeModelTypes), @@ -879,7 +911,9 @@ gtk_tree_model_types_get_type (void) NULL }; - model_types_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkTreeModelTypes", &model_types_info, 0); + model_types_type = g_type_register_static (G_TYPE_OBJECT, + "GtkTreeModelTypes", + &model_types_info, 0); g_type_add_interface_static (model_types_type, GTK_TYPE_TREE_MODEL, &tree_model_info); @@ -893,59 +927,11 @@ gtk_tree_model_types_new (void) { GtkTreeModelTypes *retval; - retval = GTK_TREE_MODEL_TYPES (g_object_new (GTK_TYPE_MODEL_TYPES, NULL)); + retval = g_object_new (GTK_TYPE_MODEL_TYPES, NULL); return retval; } -static void -gtk_tree_model_types_class_init (GtkTreeModelTypesClass *class) -{ - GObjectClass *object_class; - - object_class = (GObjectClass*) class; - - model_types_signals[CHANGED] = - g_signal_newc ("changed", - GTK_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, changed), - NULL, - gtk_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - model_types_signals[INSERTED] = - g_signal_newc ("inserted", - GTK_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, inserted), - NULL, - gtk_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - model_types_signals[CHILD_TOGGLED] = - g_signal_newc ("child_toggled", - GTK_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, child_toggled), - NULL, - gtk_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - model_types_signals[DELETED] = - g_signal_newc ("deleted", - GTK_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, deleted), - NULL, - gtk_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - G_TYPE_POINTER); -} - static void gtk_tree_model_types_tree_model_init (GtkTreeModelIface *iface) { @@ -1064,7 +1050,7 @@ gtk_real_model_types_get_value (GtkTreeModel *tree_model, g_value_init (value, G_TYPE_STRING); - str = g_strdup_printf ("%d", type); + str = g_strdup_printf ("%ld", (long int) type); g_value_set_string (value, str); g_free (str); } @@ -1091,13 +1077,17 @@ gtk_real_model_types_iter_next (GtkTreeModel *tree_model, type = GPOINTER_TO_INT (iter->user_data); parent = g_type_parent (type); - + if (parent == G_TYPE_INVALID) { - /* fundamental type, add 1 */ - if ((type + 1) < G_TYPE_LAST_RESERVED_FUNDAMENTAL) - { - iter->user_data = GINT_TO_POINTER (type + 1); + /* find next _valid_ fundamental type */ + do + type++; + while (!g_type_name (type) && type <= G_TYPE_FUNDAMENTAL_MAX); + if (type <= G_TYPE_FUNDAMENTAL_MAX) + { + /* found one */ + iter->user_data = GINT_TO_POINTER (type); return TRUE; } else @@ -1183,7 +1173,7 @@ gtk_real_model_types_iter_n_children (GtkTreeModel *tree_model, { if (iter == NULL) { - return G_TYPE_LAST_RESERVED_FUNDAMENTAL - 1; + return G_TYPE_FUNDAMENTAL_MAX; } else { @@ -1210,7 +1200,7 @@ gtk_real_model_types_iter_nth_child (GtkTreeModel *tree_model, if (parent == NULL) { /* fundamental type */ - if (n < G_TYPE_LAST_RESERVED_FUNDAMENTAL) + if (n < G_TYPE_FUNDAMENTAL_MAX) { iter->user_data = GINT_TO_POINTER (n); return TRUE; @@ -1258,8 +1248,10 @@ gtk_real_model_types_iter_parent (GtkTreeModel *tree_model, if (parent == G_TYPE_INVALID) { - if (type >= G_TYPE_LAST_RESERVED_FUNDAMENTAL) - g_warning ("no parent for %d %s\n", type, g_type_name (type)); + if (type > G_TYPE_FUNDAMENTAL_MAX) + g_warning ("no parent for %ld %s\n", + (long int) type, + g_type_name (type)); return FALSE; } else @@ -1270,469 +1262,6 @@ gtk_real_model_types_iter_parent (GtkTreeModel *tree_model, } } -/* - * Property editor thingy - */ - -static void -get_param_specs (GObject *object, - GParamSpec ***specs, - gint *n_specs) -{ - /* Use private interface for now, fix later */ - *specs = G_OBJECT_GET_CLASS (object)->property_specs; - *n_specs = G_OBJECT_GET_CLASS (object)->n_property_specs; -} - -typedef struct -{ - gpointer instance; - guint id; -} DisconnectData; - -static void -disconnect_func (gpointer data) -{ - DisconnectData *dd = data; - - g_signal_handler_disconnect (dd->instance, dd->id); - g_free (dd); -} - -static void -g_object_connect_property (GObject *object, - const gchar *prop_name, - GtkSignalFunc func, - gpointer data, - GObject *alive_object) -{ - gchar *with_detail = g_strconcat ("notify::", prop_name, NULL); - DisconnectData *dd; - - dd = g_new (DisconnectData, 1); - - dd->id = g_signal_connect_data (object, with_detail, - func, data, - NULL, FALSE, FALSE); - - dd->instance = object; - - g_object_set_data_full (G_OBJECT (alive_object), - "alive-object", - dd, - disconnect_func); - - g_free (with_detail); -} - -typedef struct -{ - GObject *obj; - gchar *prop; -} ObjectProperty; - -static void -free_object_property (ObjectProperty *p) -{ - g_free (p->prop); - g_free (p); -} - -static void -connect_controller (GObject *controller, - const gchar *signal, - GObject *model, - const gchar *prop_name, - GtkSignalFunc func) -{ - ObjectProperty *p; - - p = g_new (ObjectProperty, 1); - p->obj = model; - p->prop = g_strdup (prop_name); - - g_signal_connect_data (controller, signal, func, p, - (GClosureNotify)free_object_property, - FALSE, FALSE); -} - -static void -int_modified (GtkAdjustment *adj, gpointer data) -{ - ObjectProperty *p = data; - - g_object_set (p->obj, p->prop, (int) adj->value, NULL); -} - -static void -int_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkAdjustment *adj = GTK_ADJUSTMENT (data); - GValue val = { 0, }; - - g_value_init (&val, G_TYPE_INT); - g_object_get_property (object, pspec->name, &val); - - if (g_value_get_int (&val) != (int)adj->value) - gtk_adjustment_set_value (adj, g_value_get_int (&val)); - - g_value_unset (&val); -} - -static void -float_modified (GtkAdjustment *adj, gpointer data) -{ - ObjectProperty *p = data; - - g_object_set (p->obj, p->prop, (float) adj->value, NULL); -} - -static void -float_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkAdjustment *adj = GTK_ADJUSTMENT (data); - GValue val = { 0, }; - - g_value_init (&val, G_TYPE_FLOAT); - g_object_get_property (object, pspec->name, &val); - - if (g_value_get_float (&val) != (float) adj->value) - gtk_adjustment_set_value (adj, g_value_get_float (&val)); - - g_value_unset (&val); -} - -static void -string_modified (GtkEntry *entry, gpointer data) -{ - ObjectProperty *p = data; - gchar *text; - - text = gtk_entry_get_text (entry); - - g_object_set (p->obj, p->prop, text, NULL); -} - -static void -string_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkEntry *entry = GTK_ENTRY (data); - GValue val = { 0, }; - gchar *str; - gchar *text; - - g_value_init (&val, G_TYPE_STRING); - g_object_get_property (object, pspec->name, &val); - - str = g_value_get_string (&val); - if (str == NULL) - str = ""; - text = gtk_entry_get_text (entry); - - if (strcmp (str, text) != 0) - gtk_entry_set_text (entry, str); - - g_value_unset (&val); -} - -static void -bool_modified (GtkToggleButton *tb, gpointer data) -{ - ObjectProperty *p = data; - - g_object_set (p->obj, p->prop, (int) tb->active, NULL); -} - -static void -bool_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkToggleButton *tb = GTK_TOGGLE_BUTTON (data); - GValue val = { 0, }; - - g_value_init (&val, G_TYPE_BOOLEAN); - g_object_get_property (object, pspec->name, &val); - - if (g_value_get_boolean (&val) != tb->active) - gtk_toggle_button_set_active (tb, g_value_get_boolean (&val)); - - gtk_label_set_text (GTK_LABEL (GTK_BIN (tb)->child), g_value_get_boolean (&val) ? - "TRUE" : "FALSE"); - - g_value_unset (&val); -} - - -static void -enum_modified (GtkOptionMenu *om, gpointer data) -{ - ObjectProperty *p = data; - gint i; - GParamSpec *spec; - GEnumClass *eclass; - - spec = g_object_class_find_property (G_OBJECT_GET_CLASS (p->obj), - p->prop); - - eclass = G_ENUM_CLASS (g_type_class_peek (spec->value_type)); - - i = gtk_option_menu_get_history (om); - - g_object_set (p->obj, p->prop, eclass->values[i].value, NULL); -} - -static void -enum_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkOptionMenu *om = GTK_OPTION_MENU (data); - GValue val = { 0, }; - GEnumClass *eclass; - gint i; - - eclass = G_ENUM_CLASS (g_type_class_peek (pspec->value_type)); - - g_value_init (&val, pspec->value_type); - g_object_get_property (object, pspec->name, &val); - - i = 0; - while (i < eclass->n_values) - { - if (eclass->values[i].value == g_value_get_enum (&val)) - break; - ++i; - } - - if (gtk_option_menu_get_history (om) != i) - gtk_option_menu_set_history (om, i); - - g_value_unset (&val); -} - -static GtkWidget* -create_prop_editor (GObject *object) -{ - GtkWidget *win; - GtkWidget *vbox; - GtkWidget *hbox; - GtkWidget *label; - GtkWidget *prop_edit; - GtkWidget *sw; - gint n_specs = 0; - GParamSpec **specs = NULL; - gint i; - GtkAdjustment *adj; - - win = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - /* hold a strong ref to the object we're editing */ - g_object_ref (G_OBJECT (object)); - g_object_set_data_full (G_OBJECT (win), "model-object", - object, (GDestroyNotify)g_object_unref); - - vbox = gtk_vbox_new (TRUE, 2); - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), vbox); - gtk_container_add (GTK_CONTAINER (win), sw); - - get_param_specs (object, &specs, &n_specs); - - i = 0; - while (i < n_specs) - { - GParamSpec *spec = specs[i]; - gboolean can_modify; - - prop_edit = NULL; - - can_modify = ((spec->flags & G_PARAM_WRITABLE) != 0 && - (spec->flags & G_PARAM_CONSTRUCT_ONLY) == 0); - - if ((spec->flags & G_PARAM_READABLE) == 0) - { - /* can't display unreadable properties */ - ++i; - continue; - } - - switch (spec->value_type) - { - case G_TYPE_INT: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - adj = GTK_ADJUSTMENT (gtk_adjustment_new (G_PARAM_SPEC_INT (spec)->default_value, - G_PARAM_SPEC_INT (spec)->minimum, - G_PARAM_SPEC_INT (spec)->maximum, - 1, - MAX ((G_PARAM_SPEC_INT (spec)->maximum - - G_PARAM_SPEC_INT (spec)->minimum) / 10, 1), - 0.0)); - - prop_edit = gtk_spin_button_new (adj, 1.0, 0); - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (int_changed), - adj, G_OBJECT (adj)); - - if (can_modify) - connect_controller (G_OBJECT (adj), "value_changed", - object, spec->name, (GtkSignalFunc) int_modified); - break; - - case G_TYPE_FLOAT: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - adj = GTK_ADJUSTMENT (gtk_adjustment_new (G_PARAM_SPEC_FLOAT (spec)->default_value, - G_PARAM_SPEC_FLOAT (spec)->minimum, - G_PARAM_SPEC_FLOAT (spec)->maximum, - 0.1, - MAX ((G_PARAM_SPEC_FLOAT (spec)->maximum - - G_PARAM_SPEC_FLOAT (spec)->minimum) / 10, 0.1), - 0.0)); - - prop_edit = gtk_spin_button_new (adj, 0.1, 2); - - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (float_changed), - adj, G_OBJECT (adj)); - - if (can_modify) - connect_controller (G_OBJECT (adj), "value_changed", - object, spec->name, (GtkSignalFunc) float_modified); - break; - - case G_TYPE_STRING: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - prop_edit = gtk_entry_new (); - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (string_changed), - prop_edit, G_OBJECT (prop_edit)); - - if (can_modify) - connect_controller (G_OBJECT (prop_edit), "changed", - object, spec->name, (GtkSignalFunc) string_modified); - break; - - case G_TYPE_BOOLEAN: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - prop_edit = gtk_toggle_button_new_with_label (""); - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (bool_changed), - prop_edit, G_OBJECT (prop_edit)); - - if (can_modify) - connect_controller (G_OBJECT (prop_edit), "toggled", - object, spec->name, (GtkSignalFunc) bool_modified); - break; - - default: - if (g_type_is_a (spec->value_type, G_TYPE_ENUM)) - { - GtkWidget *menu; - GEnumClass *eclass; - gint i; - - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - prop_edit = gtk_option_menu_new (); - - menu = gtk_menu_new (); - - eclass = G_ENUM_CLASS (g_type_class_peek (spec->value_type)); - - i = 0; - while (i < eclass->n_values) - { - GtkWidget *mi; - - mi = gtk_menu_item_new_with_label (eclass->values[i].value_name); - - gtk_widget_show (mi); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - - ++i; - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (prop_edit), menu); - - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (enum_changed), - prop_edit, G_OBJECT (prop_edit)); - - if (can_modify) - connect_controller (G_OBJECT (prop_edit), "changed", - object, spec->name, (GtkSignalFunc) enum_modified); - } - else - { - gchar *msg = g_strdup_printf ("%s: don't know how to edit type %s", - spec->nick, g_type_name (spec->value_type)); - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (msg); - g_free (msg); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - } - break; - } - - if (prop_edit) - { - if (!can_modify) - gtk_widget_set_sensitive (prop_edit, FALSE); - - /* set initial value */ - g_object_notify (object, spec->name); - } - - ++i; - } - - gtk_window_set_default_size (GTK_WINDOW (win), 300, 500); - - gtk_widget_show_all (win); - - return win; -} - /* * Automated testing */ @@ -1842,7 +1371,7 @@ run_automated_tests (void) gint i; GtkTreeIter iter; - store = gtk_list_store_new_with_types (1, G_TYPE_INT); + store = gtk_list_store_new (1, G_TYPE_INT); model = GTK_TREE_MODEL (store); @@ -1853,7 +1382,7 @@ run_automated_tests (void) ++i; } - while (gtk_tree_model_get_first (model, &iter)) + while (gtk_tree_model_get_iter_first (model, &iter)) gtk_list_store_remove (store, &iter); gtk_list_store_append (store, &iter); @@ -1885,7 +1414,7 @@ run_automated_tests (void) } /* remove everything again */ - while (gtk_tree_model_get_first (model, &iter)) + while (gtk_tree_model_get_iter_first (model, &iter)) gtk_list_store_remove (store, &iter); @@ -1900,21 +1429,23 @@ run_automated_tests (void) } /* remove everything again */ - while (gtk_tree_model_get_first (model, &iter)) + while (gtk_tree_model_get_iter_first (model, &iter)) gtk_list_store_remove (store, &iter); - g_object_unref (G_OBJECT (store)); + g_object_unref (store); } { /* Make sure tree store mutations don't crash anything */ GtkTreeStore *store; + GtkTreeIter root; + + store = gtk_tree_store_new (1, G_TYPE_INT); + gtk_tree_store_append (GTK_TREE_STORE (store), &root, NULL); + /* Remove test until it is rewritten to work */ + /* treestore_torture_recurse (store, &root, 0);*/ - store = gtk_tree_store_new_with_types (1, G_TYPE_INT); - - treestore_torture_recurse (store, NULL, 0); - - g_object_unref (G_OBJECT (store)); + g_object_unref (store); } g_print ("Passed.\n");