]> Pileus Git - ~andy/gtk/blob - tests/testtreeedit.c
Make a GtkCellEditable (get_widget_window_size): Change to let it honor
[~andy/gtk] / tests / testtreeedit.c
1 #include <gtk/gtk.h>
2
3 typedef struct {
4   const gchar *string;
5   gboolean is_editable;
6 } ListEntry;
7
8 enum {
9   STRING_COLUMN,
10   IS_EDITABLE_COLUMN,
11   NUM_COLUMNS
12 };
13
14 static ListEntry model_strings[] =
15 {
16   {"A simple string", TRUE },
17   {"Another string!", TRUE },
18   {"Guess what, a third string. This one can't be edited", FALSE },
19   {"And then a fourth string. Neither can this", FALSE },
20   {"Multiline\nFun!", TRUE },
21   { NULL }
22 };
23
24 static GtkTreeModel *
25 create_model (void)
26 {
27   GtkListStore *model;
28   GtkTreeIter iter;
29   gint i;
30   
31   model = gtk_list_store_new (NUM_COLUMNS,
32                               G_TYPE_STRING,
33                               G_TYPE_BOOLEAN);
34
35   for (i = 0; model_strings[i].string != NULL; i++)
36     {
37       gtk_list_store_append (model, &iter);
38
39       gtk_list_store_set (model, &iter,
40                           STRING_COLUMN, model_strings[i].string,
41                           IS_EDITABLE_COLUMN, model_strings[i].is_editable,
42                           -1);
43     }
44   
45   return GTK_TREE_MODEL (model);
46 }
47
48 static void
49 toggled (GtkCellRendererToggle *cell,
50          gchar                 *path_string,
51          gpointer               data)
52 {
53   GtkTreeModel *model = GTK_TREE_MODEL (data);
54   GtkTreeIter iter;
55   GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
56   gboolean value;
57
58   gtk_tree_model_get_iter (model, &iter, path);
59   gtk_tree_model_get (model, &iter, IS_EDITABLE_COLUMN, &value, -1);
60
61   value = !value;
62   gtk_list_store_set (GTK_LIST_STORE (model), &iter, IS_EDITABLE_COLUMN, value, -1);
63
64   gtk_tree_path_free (path);
65 }
66
67 static void
68 edited (GtkCellRendererText *cell,
69         gchar               *path_string,
70         gchar               *new_text,
71         gpointer             data)
72 {
73   GtkTreeModel *model = GTK_TREE_MODEL (data);
74   GtkTreeIter iter;
75   GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
76
77   gtk_tree_model_get_iter (model, &iter, path);
78   gtk_list_store_set (GTK_LIST_STORE (model), &iter, STRING_COLUMN, new_text, -1);
79
80   gtk_tree_path_free (path);
81 }
82
83 gint
84 main (gint argc, gchar **argv)
85 {
86   GtkWidget *window;
87   GtkWidget *scrolled_window;
88   GtkWidget *tree_view;
89   GtkTreeModel *tree_model;
90   GtkCellRenderer *renderer;
91   
92   gtk_init (&argc, &argv);
93
94   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
95   gtk_window_set_title (GTK_WINDOW (window), "GtkTreeView editing sample");
96   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
97
98   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
99   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
100   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
101   gtk_container_add (GTK_CONTAINER (window), scrolled_window);
102
103   tree_model = create_model ();
104   tree_view = gtk_tree_view_new_with_model (tree_model);
105   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
106   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
107
108   renderer = gtk_cell_renderer_text_new ();
109   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
110                                                -1, "String",
111                                                renderer,
112                                                "text", STRING_COLUMN,
113                                                "editable", IS_EDITABLE_COLUMN,
114                                                NULL);
115
116   g_signal_connect (G_OBJECT (renderer), "edited",
117                     G_CALLBACK (edited), tree_model);
118   renderer = gtk_cell_renderer_toggle_new ();
119   g_signal_connect (G_OBJECT (renderer), "toggled",
120                     G_CALLBACK (toggled), tree_model);
121   
122   g_object_set (G_OBJECT (renderer),
123                 "xalign", 0.0,
124                 "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
125                 NULL);
126   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
127                                                -1, "Editable",
128                                                renderer,
129                                                "active", IS_EDITABLE_COLUMN,
130                                                NULL);
131   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
132   
133   gtk_window_set_default_size (GTK_WINDOW (window),
134                                650, 400);
135
136   gtk_widget_show_all (window);
137   gtk_main ();
138
139   return 0;
140 }