]> Pileus Git - ~andy/gtk/blob - tests/testtreefocus.c
s/GTK_TREE_COLUMN/GTK_TREE_VIEW_COLUMN
[~andy/gtk] / tests / testtreefocus.c
1 #include <gtk/gtk.h>
2
3 typedef struct _TreeStruct TreeStruct;
4 struct _TreeStruct
5 {
6   const gchar *label;
7   gboolean alex;
8   gboolean havoc;
9   gboolean tim;
10   gboolean owen;
11   gboolean world_holiday; /* shared by the european hackers */
12   TreeStruct *children;
13 };
14
15 static TreeStruct january[] =
16 {
17   {"New Years Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL},
18   {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, NULL},
19   {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL},
20   { NULL }
21 };
22
23 static TreeStruct february[] =
24 {
25   { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL },
26   { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
27   { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
28   { NULL }
29 };
30
31 static TreeStruct march[] =
32 {
33   { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
34   { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
35   { NULL }
36 };
37
38 static TreeStruct april[] =
39 {
40   { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
41   { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
42   { "Earth Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
43   { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
44   { NULL }
45 };
46
47 static TreeStruct may[] =
48 {
49   { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
50   { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
51   { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
52   { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
53   { "Memorial Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL },
54   { NULL }
55 };
56
57 static TreeStruct june[] =
58 {
59   { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
60   { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
61   { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL },
62   { NULL }
63 };
64
65 static TreeStruct july[] =
66 {
67   { "Parents' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
68   { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL },
69   { NULL }
70 };
71
72 static TreeStruct august[] =
73 {
74   { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
75   { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
76   { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
77   { NULL }
78 };
79
80 static TreeStruct september[] =
81 {
82   { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
83   { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
84   { "Labor Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL },
85   { NULL }
86 };
87
88 static TreeStruct october[] =
89 {
90   { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
91   { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
92   { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
93   { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
94   { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
95   { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL },
96   { "Halloween", FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
97   { NULL }
98 };
99
100 static TreeStruct november[] =
101 {
102   { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
103   { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL },
104   { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, NULL },
105   { NULL }
106 };
107
108 static TreeStruct december[] =
109 {
110   { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
111   { "Christmas", TRUE, TRUE, TRUE, TRUE, TRUE, NULL },
112   { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
113   { NULL }
114 };
115
116
117 static TreeStruct toplevel[] =
118 {
119   {"January", FALSE, FALSE, FALSE, FALSE, FALSE, january},
120   {"February", FALSE, FALSE, FALSE, FALSE, FALSE, february},
121   {"March", FALSE, FALSE, FALSE, FALSE, FALSE, march},
122   {"April", FALSE, FALSE, FALSE, FALSE, FALSE, april},
123   {"May", FALSE, FALSE, FALSE, FALSE, FALSE, may},
124   {"June", FALSE, FALSE, FALSE, FALSE, FALSE, june},
125   {"July", FALSE, FALSE, FALSE, FALSE, FALSE, july},
126   {"August", FALSE, FALSE, FALSE, FALSE, FALSE, august},
127   {"September", FALSE, FALSE, FALSE, FALSE, FALSE, september},
128   {"October", FALSE, FALSE, FALSE, FALSE, FALSE, october},
129   {"November", FALSE, FALSE, FALSE, FALSE, FALSE, november},
130   {"December", FALSE, FALSE, FALSE, FALSE, FALSE, december},
131   {NULL}
132 };
133
134
135 enum
136 {
137   HOLIDAY_COLUMN = 0,
138   ALEX_COLUMN,
139   HAVOC_COLUMN,
140   TIM_COLUMN,
141   OWEN_COLUMN,
142   VISIBLE_COLUMN,
143   WORLD_COLUMN,
144   NUM_COLUMNS
145 };
146
147 static GtkTreeModel *
148 make_model (void)
149 {
150   GtkTreeStore *model;
151   TreeStruct *month = toplevel;
152   GtkTreeIter iter;
153
154   model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
155
156   while (month->label)
157     {
158       TreeStruct *holiday = month->children;
159
160       gtk_tree_store_append (model, &iter, NULL);
161       gtk_tree_store_set (model, &iter,
162                           HOLIDAY_COLUMN, month->label,
163                           ALEX_COLUMN, FALSE,
164                           HAVOC_COLUMN, FALSE,
165                           TIM_COLUMN, FALSE,
166                           OWEN_COLUMN, FALSE,
167                           VISIBLE_COLUMN, FALSE,
168                           WORLD_COLUMN, FALSE,
169                           -1);
170       while (holiday->label)
171         {
172           GtkTreeIter child_iter;
173
174           gtk_tree_store_append (model, &child_iter, &iter);
175           gtk_tree_store_set (model, &child_iter,
176                               HOLIDAY_COLUMN, holiday->label,
177                               ALEX_COLUMN, holiday->alex,
178                               HAVOC_COLUMN, holiday->havoc,
179                               TIM_COLUMN, holiday->tim,
180                               OWEN_COLUMN, holiday->owen,
181                               VISIBLE_COLUMN, TRUE,
182                               WORLD_COLUMN, holiday->world_holiday,
183                               -1);
184
185           holiday ++;
186         }
187       month ++;
188     }
189
190   return GTK_TREE_MODEL (model);
191 }
192
193 static void
194 alex_toggled (GtkCellRendererToggle *cell,
195               gchar                 *path_str,
196               gpointer               data)
197 {
198   GtkTreeModel *model = (GtkTreeModel *) data;
199   GtkTreeIter iter;
200   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
201   gboolean alex;
202
203   gtk_tree_model_get_iter (model, &iter, path);
204   gtk_tree_model_get (model, &iter, ALEX_COLUMN, &alex, -1);
205
206   alex = !alex;
207   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, ALEX_COLUMN, alex, -1);
208
209   gtk_tree_path_free (path);
210 }
211
212 static void
213 havoc_toggled (GtkCellRendererToggle *cell,
214                gchar                 *path_str,
215                gpointer               data)
216 {
217   GtkTreeModel *model = (GtkTreeModel *) data;
218   GtkTreeIter iter;
219   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
220   gboolean havoc;
221
222   gtk_tree_model_get_iter (model, &iter, path);
223   gtk_tree_model_get (model, &iter, HAVOC_COLUMN, &havoc, -1);
224
225   havoc = !havoc;
226   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, HAVOC_COLUMN, havoc, -1);
227
228   gtk_tree_path_free (path);
229 }
230
231 static void
232 owen_toggled (GtkCellRendererToggle *cell,
233               gchar                 *path_str,
234               gpointer               data)
235 {
236   GtkTreeModel *model = (GtkTreeModel *) data;
237   GtkTreeIter iter;
238   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
239   gboolean owen;
240
241   gtk_tree_model_get_iter (model, &iter, path);
242   gtk_tree_model_get (model, &iter, OWEN_COLUMN, &owen, -1);
243
244   owen = !owen;
245   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, OWEN_COLUMN, owen, -1);
246
247   gtk_tree_path_free (path);
248 }
249
250 static void
251 tim_toggled (GtkCellRendererToggle *cell,
252              gchar                 *path_str,
253              gpointer               data)
254 {
255   GtkTreeModel *model = (GtkTreeModel *) data;
256   GtkTreeIter iter;
257   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
258   gboolean tim;
259
260   gtk_tree_model_get_iter (model, &iter, path);
261   gtk_tree_model_get (model, &iter, TIM_COLUMN, &tim, -1);
262
263   tim = !tim;
264   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, TIM_COLUMN, tim, -1);
265
266   gtk_tree_path_free (path);
267 }
268
269 int
270 main (int argc, char *argv[])
271 {
272   GtkWidget *window;
273   GtkWidget *vbox;
274   GtkWidget *scrolled_window;
275   GtkWidget *tree_view;
276   GtkTreeModel *model;
277   GtkCellRenderer *renderer;
278   gint col_offset;
279   GtkTreeViewColumn *column;
280
281   gtk_init (&argc, &argv);
282
283   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
284   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
285   vbox = gtk_vbox_new (FALSE, 8);
286   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
287   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Jonathan's Holiday Card Planning Sheet"), FALSE, FALSE, 0);
288   gtk_container_add (GTK_CONTAINER (window), vbox);
289
290   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
291   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
292   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
293   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
294
295   model = make_model ();
296   tree_view = gtk_tree_view_new_with_model (model);
297   g_object_unref (G_OBJECT (model));
298   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
299
300   renderer = gtk_cell_renderer_text_new ();
301   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
302                                                -1, "Holiday",
303                                                renderer,
304                                                "text", HOLIDAY_COLUMN, NULL);
305   g_object_unref (renderer);
306
307   /* Alex Column */
308   renderer = gtk_cell_renderer_toggle_new ();
309   g_signal_connect_data (G_OBJECT (renderer), "toggled", alex_toggled, model, NULL, FALSE, FALSE);
310
311   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
312   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
313                                                             -1, "Alex",
314                                                             renderer,
315                                                             "active", ALEX_COLUMN,
316                                                             "visible", VISIBLE_COLUMN,
317                                                             "can_activate", WORLD_COLUMN,
318                                                             NULL);
319   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
320   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
321   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
322   g_object_unref (renderer);
323
324   /* Havoc Column */
325   renderer = gtk_cell_renderer_toggle_new ();
326   g_signal_connect_data (G_OBJECT (renderer), "toggled", havoc_toggled, model, NULL, FALSE, FALSE);
327
328   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
329   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
330                                                             -1, "Havoc",
331                                                             renderer,
332                                                             "active", HAVOC_COLUMN,
333                                                             "visible", VISIBLE_COLUMN,
334                                                             NULL);
335   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
336   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
337   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
338   g_object_unref (renderer);
339
340   /* Tim Column */
341   renderer = gtk_cell_renderer_toggle_new ();
342   g_signal_connect_data (G_OBJECT (renderer), "toggled", tim_toggled, model, NULL, FALSE, FALSE);
343
344   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
345   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
346                                                -1, "Tim",
347                                                renderer,
348                                                "active", TIM_COLUMN,
349                                                "visible", VISIBLE_COLUMN,
350                                                "can_activate", WORLD_COLUMN,
351                                                NULL);
352   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
353   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
354   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
355   g_object_unref (renderer);
356
357   /* Owen Column */
358   renderer = gtk_cell_renderer_toggle_new ();
359   g_signal_connect_data (G_OBJECT (renderer), "toggled", owen_toggled, model, NULL, FALSE, FALSE);
360   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
361   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
362                                                -1, "Owen",
363                                                renderer,
364                                                "active", OWEN_COLUMN,
365                                                "visible", VISIBLE_COLUMN,
366                                                NULL);
367   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
368   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
369   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
370   g_object_unref (renderer);
371
372   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
373
374   gtk_widget_show_all (window);
375   gtk_main ();
376
377   return 0;
378 }
379