]> Pileus Git - ~andy/gtk/blob - tests/testtreefocus.c
Changed prototype to allow for getting the location of the cell relative
[~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
270 int
271 main (int argc, char *argv[])
272 {
273   GtkWidget *window;
274   GtkWidget *vbox;
275   GtkWidget *scrolled_window;
276   GtkWidget *tree_view;
277   GtkTreeModel *model;
278   GtkCellRenderer *renderer;
279   gint col_offset;
280   GtkTreeViewColumn *column;
281
282   gtk_init (&argc, &argv);
283
284   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
285   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
286   vbox = gtk_vbox_new (FALSE, 8);
287   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
288   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Jonathan's Holiday Card Planning Sheet"), FALSE, FALSE, 0);
289   gtk_container_add (GTK_CONTAINER (window), vbox);
290
291   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
292   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
293   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
294   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
295
296   model = make_model ();
297   tree_view = gtk_tree_view_new_with_model (model);
298   g_object_unref (G_OBJECT (model));
299   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
300
301   renderer = gtk_cell_renderer_text_new ();
302   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
303                                                -1, "Holiday",
304                                                renderer,
305                                                "text", HOLIDAY_COLUMN, NULL);
306   g_object_unref (renderer);
307
308   /* Alex Column */
309   renderer = gtk_cell_renderer_toggle_new ();
310   g_signal_connect_data (G_OBJECT (renderer), "toggled", alex_toggled, model, NULL, FALSE, FALSE);
311
312   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
313   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
314                                                             -1, "Alex",
315                                                             renderer,
316                                                             "active", ALEX_COLUMN,
317                                                             "visible", VISIBLE_COLUMN,
318                                                             "can_activate", WORLD_COLUMN,
319                                                             NULL);
320   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
321   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
322   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
323   g_object_unref (renderer);
324
325   /* Havoc Column */
326   renderer = gtk_cell_renderer_toggle_new ();
327   g_signal_connect_data (G_OBJECT (renderer), "toggled", havoc_toggled, model, NULL, FALSE, FALSE);
328
329   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
330   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
331                                                             -1, "Havoc",
332                                                             renderer,
333                                                             "active", HAVOC_COLUMN,
334                                                             "visible", VISIBLE_COLUMN,
335                                                             NULL);
336   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
337   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
338   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
339   g_object_unref (renderer);
340
341   /* Tim Column */
342   renderer = gtk_cell_renderer_toggle_new ();
343   g_signal_connect_data (G_OBJECT (renderer), "toggled", tim_toggled, model, NULL, FALSE, FALSE);
344
345   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
346   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
347                                                -1, "Tim",
348                                                renderer,
349                                                "active", TIM_COLUMN,
350                                                "visible", VISIBLE_COLUMN,
351                                                "can_activate", WORLD_COLUMN,
352                                                NULL);
353   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
354   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
355   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
356   g_object_unref (renderer);
357
358   /* Owen Column */
359   renderer = gtk_cell_renderer_toggle_new ();
360   g_signal_connect_data (G_OBJECT (renderer), "toggled", owen_toggled, model, NULL, FALSE, FALSE);
361   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
362   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
363                                                -1, "Owen",
364                                                renderer,
365                                                "active", OWEN_COLUMN,
366                                                "visible", VISIBLE_COLUMN,
367                                                NULL);
368   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
369   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
370   gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50);
371   g_object_unref (renderer);
372
373
374   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
375   gtk_widget_show_all (window);
376
377   gtk_main ();
378
379   return 0;
380 }
381