]> Pileus Git - ~andy/gtk/blob - tests/testtreefocus.c
Fix up focus code a lot.
[~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 havoc;
8   gboolean owen;
9   TreeStruct *children;
10 };
11
12 static TreeStruct january[] =
13 {
14   {"New Years Day", TRUE, TRUE, NULL},
15   {"Presidential Inauguration", TRUE, TRUE, NULL},
16   {"Martin Luther King Jr. day", TRUE, TRUE, NULL},
17   { NULL }
18 };
19
20 static TreeStruct february[] =
21 {
22   { "Presidents' Day", TRUE, TRUE, NULL },
23   { "Groundhog Day", FALSE, FALSE, NULL },
24   { "Valentine's Day", FALSE, FALSE, NULL },
25   { NULL }
26 };
27
28 static TreeStruct march[] =
29 {
30   { "National Tree Planting Day", FALSE, FALSE, NULL },
31   { "St Patrick's Day", FALSE, FALSE, NULL },
32   { NULL }
33 };
34
35 static TreeStruct april[] =
36 {
37   { "April Fools' Day", FALSE, FALSE, NULL },
38   { "Army Day", FALSE, FALSE, NULL },
39   { "Earth Day", FALSE, FALSE, NULL },
40   { "Administrative Professionals' Day", FALSE, FALSE, NULL },
41   { NULL }
42 };
43
44 static TreeStruct may[] =
45 {
46   { "Nurses' Day", FALSE, FALSE, NULL },
47   { "National Day of Prayer", FALSE, FALSE, NULL },
48   { "Mothers' Day", FALSE, FALSE, NULL },
49   { "Armed Forces Day", FALSE, FALSE, NULL },
50   { "Memorial Day", TRUE, TRUE, NULL },
51   { NULL }
52 };
53
54 static TreeStruct june[] =
55 {
56   { "June Fathers' Day", FALSE, FALSE, NULL },
57   { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, NULL },
58   { "Flag Day", TRUE, TRUE, NULL },
59   { NULL }
60 };
61
62 static TreeStruct july[] =
63 {
64   { "Parents' Day", FALSE, FALSE, NULL },
65   { "Independence Day", TRUE, TRUE, NULL },
66   { NULL }
67 };
68
69 static TreeStruct august[] =
70 {
71   { "Air Force Day", FALSE, FALSE, NULL },
72   { "Coast Guard Day", FALSE, FALSE, NULL },
73   { "Friendship Day", FALSE, FALSE, NULL },
74   { NULL }
75 };
76
77 static TreeStruct september[] =
78 {
79   { "Grandparents' Day", FALSE, FALSE, NULL },
80   { "Citizenship Day or Constitution Day", FALSE, FALSE, NULL },
81   { "Labor Day", TRUE, TRUE, NULL },
82   { NULL }
83 };
84
85 static TreeStruct october[] =
86 {
87   { "National Children's Day", FALSE, FALSE, NULL },
88   { "Bosses' Day", FALSE, FALSE, NULL },
89   { "Sweetest Day", FALSE, FALSE, NULL },
90   { "Mother-in-Law's Day", FALSE, FALSE, NULL },
91   { "Navy Day", FALSE, FALSE, NULL },
92   { "Columbus Day", TRUE, TRUE, NULL },
93   { "Halloween", FALSE, FALSE, NULL },
94   { NULL }
95 };
96
97 static TreeStruct november[] =
98 {
99   { "Marine Corps Day", FALSE, FALSE, NULL },
100   { "Veterans' Day", TRUE, TRUE, NULL },
101   { "Thanksgiving", TRUE, TRUE, NULL },
102   { NULL }
103 };
104
105 static TreeStruct december[] =
106 {
107   { "Pearl Harbor Remembrance Day", FALSE, FALSE, NULL },
108   { "Christmas", TRUE, TRUE, NULL },
109   { "Kwanzaa", FALSE, FALSE, NULL },
110   { NULL }
111 };
112
113
114 static TreeStruct toplevel[] =
115 {
116   {"January", FALSE, FALSE, january},
117   {"February", FALSE, FALSE, february},
118   {"March", FALSE, FALSE, march},
119   {"April", FALSE, FALSE, april},
120   {"May", FALSE, FALSE, may},
121   {"June", FALSE, FALSE, june},
122   {"July", FALSE, FALSE, july},
123   {"August", FALSE, FALSE, august},
124   {"September", FALSE, FALSE, september},
125   {"October", FALSE, FALSE, october},
126   {"November", FALSE, FALSE, november},
127   {"December", FALSE, FALSE, december},
128   {NULL}
129 };
130
131
132 enum
133 {
134   HOLIDAY_COLUMN = 0,
135   HAVOC_COLUMN,
136   OWEN_COLUMN,
137   VISIBLE_COLUMN,
138   NUM_COLUMNS
139 };
140
141 static GtkTreeModel *
142 make_model (void)
143 {
144   GtkTreeStore *model;
145   TreeStruct *month = toplevel;
146   GtkTreeIter iter;
147
148   model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
149
150   while (month->label)
151     {
152       TreeStruct *holiday = month->children;
153
154       gtk_tree_store_append (model, &iter, NULL);
155       gtk_tree_store_set (model, &iter,
156                           HOLIDAY_COLUMN, month->label,
157                           HAVOC_COLUMN, FALSE,
158                           OWEN_COLUMN, FALSE,
159                           VISIBLE_COLUMN, FALSE,
160                           -1);
161       while (holiday->label)
162         {
163           GtkTreeIter child_iter;
164
165           gtk_tree_store_append (model, &child_iter, &iter);
166           gtk_tree_store_set (model, &child_iter,
167                               HOLIDAY_COLUMN, holiday->label,
168                               HAVOC_COLUMN, holiday->havoc,
169                               OWEN_COLUMN, holiday->owen,
170                               VISIBLE_COLUMN, TRUE,
171                               -1);
172
173           holiday ++;
174         }
175       month ++;
176     }
177
178   return GTK_TREE_MODEL (model);
179 }
180
181 static void
182 havoc_toggled (GtkCellRendererToggle *cell,
183                gchar                 *path_str,
184                gpointer               data)
185 {
186   GtkTreeModel *model = (GtkTreeModel *) data;
187   GtkTreeIter iter;
188   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
189   gboolean havoc;
190
191   gtk_tree_model_get_iter (model, &iter, path);
192   gtk_tree_model_get (model, &iter, HAVOC_COLUMN, &havoc, -1);
193
194   havoc = !havoc;
195   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, HAVOC_COLUMN, havoc, -1);
196
197   gtk_tree_path_free (path);
198 }
199
200 static void
201 owen_toggled (GtkCellRendererToggle *cell,
202                gchar                 *path_str,
203                gpointer               data)
204 {
205   GtkTreeModel *model = (GtkTreeModel *) data;
206   GtkTreeIter iter;
207   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
208   gboolean owen;
209
210   gtk_tree_model_get_iter (model, &iter, path);
211   gtk_tree_model_get (model, &iter, OWEN_COLUMN, &owen, -1);
212
213   owen = !owen;
214   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, OWEN_COLUMN, owen, -1);
215
216   gtk_tree_path_free (path);
217 }
218
219 int
220 main (int argc, char *argv[])
221 {
222   GtkWidget *window;
223   GtkWidget *vbox;
224   GtkWidget *scrolled_window;
225   GtkWidget *tree_view;
226   GtkTreeModel *model;
227   GtkCellRenderer *renderer;
228
229   gtk_init (&argc, &argv);
230
231   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
232   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
233   vbox = gtk_vbox_new (FALSE, 8);
234   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
235   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Jonathan's Holiday Card Planning Sheet"), FALSE, FALSE, 0);
236   gtk_container_add (GTK_CONTAINER (window), vbox);
237
238   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
239   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
240   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
241   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
242
243   model = make_model ();
244   tree_view = gtk_tree_view_new_with_model (model);
245   //  g_object_set (G_OBJECT (tree_view), "model", model, NULL);
246   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
247   renderer = gtk_cell_renderer_text_new ();
248   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
249                                                -1, "Holiday",
250                                                renderer,
251                                                "text", HOLIDAY_COLUMN, NULL);
252   g_object_unref (renderer);
253   renderer = gtk_cell_renderer_toggle_new ();
254   g_signal_connect_data (G_OBJECT (renderer), "toggled", havoc_toggled, model, NULL, FALSE, FALSE);
255
256   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
257   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
258                                                -1, "Havoc",
259                                                renderer,
260                                                "active", HAVOC_COLUMN,
261                                                "visible", VISIBLE_COLUMN,
262                                                NULL);
263   g_object_unref (renderer);
264   renderer = gtk_cell_renderer_toggle_new ();
265   g_signal_connect_data (G_OBJECT (renderer), "toggled", owen_toggled, model, NULL, FALSE, FALSE);
266   g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
267   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
268                                                -1, "Owen",
269                                                renderer,
270                                                "active", OWEN_COLUMN,
271                                                "visible", VISIBLE_COLUMN,
272                                                NULL);
273   g_object_unref (renderer);
274   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
275
276
277   gtk_widget_show_all (window);
278   gtk_main ();
279
280   return 0;
281 }
282