]> Pileus Git - ~andy/gtk/blob - gtk/treestoretest.c
8079137a3cf5fc0ae009560affcb93d6362828c7
[~andy/gtk] / gtk / treestoretest.c
1 #include <gtk/gtk.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 GtkTreeStore *base_model;
6
7 static void
8 selection_changed (GtkTreeSelection *selection,
9                    GtkWidget        *button)
10 {
11   if (gtk_tree_selection_get_selected (selection, NULL, NULL))
12     gtk_widget_set_sensitive (button, TRUE);
13   else
14     gtk_widget_set_sensitive (button, FALSE);
15 }
16
17 static void
18 node_set (GtkTreeIter *iter)
19 {
20   static gint i = 0;
21   gint n;
22   gchar *str;
23
24   str = g_strdup_printf ("Row (%d)", i++);
25   gtk_tree_store_set (base_model, iter, 0, str, -1);
26   g_free (str);
27
28   n = g_random_int ();
29   if (n < 0)
30     n *= -1;
31   str = g_strdup_printf ("%d", n);
32
33   gtk_tree_store_set (base_model, iter, 1, str, -1);
34   g_free (str);
35 }
36
37 static void
38 iter_remove (GtkWidget *button, GtkTreeView *tree_view)
39 {
40   GtkTreeIter selected;
41   GtkTreeIter s_selected;
42   GtkTreeModel *model;
43
44   model = gtk_tree_view_get_model (tree_view);
45
46   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree_view),
47                                        NULL,
48                                        &selected))
49     {
50       if (GTK_IS_TREE_STORE (model))
51         {
52           gtk_tree_store_remove (GTK_TREE_STORE (model), &selected);
53         }
54     }
55 }
56
57 static void
58 iter_insert (GtkWidget *button, GtkTreeView *tree_view)
59 {
60   GtkWidget *entry;
61   GtkTreeIter iter;
62   GtkTreeIter selected;
63   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
64
65   entry = gtk_object_get_user_data (GTK_OBJECT (button));
66   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
67                                        NULL,
68                                        &selected))
69     {
70       gtk_tree_store_insert (model,
71                              &iter,
72                              &selected,
73                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
74     }
75   else
76     {
77       gtk_tree_store_insert (model,
78                              &iter,
79                              NULL,
80                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
81     }
82
83   node_set (&iter);
84 }
85
86 static void
87 iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
88 {
89   GtkTreeIter iter;
90   GtkTreeIter selected;
91   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
92
93   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
94                                        NULL,
95                                        &selected))
96     {
97       gtk_tree_store_insert_before (model,
98                                     &iter,
99                                     NULL,
100                                     &selected);
101     }
102   else
103     {
104       gtk_tree_store_insert_before (model,
105                                     &iter,
106                                     NULL,
107                                     NULL);
108     }
109
110   node_set (&iter);
111 }
112
113 static void
114 iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
115 {
116   GtkTreeIter iter;
117   GtkTreeIter selected;
118   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
119
120   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
121                                        NULL,
122                                        &selected))
123     {
124       if (GTK_IS_TREE_STORE (model))
125         {
126           gtk_tree_store_insert_after (model,
127                                        &iter,
128                                        NULL,
129                                        &selected);
130           node_set (&iter);
131         }
132     }
133   else
134     {
135       if (GTK_IS_TREE_STORE (model))
136         {
137           gtk_tree_store_insert_after (model,
138                                        &iter,
139                                        NULL,
140                                        NULL);
141           node_set (&iter);
142         }
143     }
144 }
145
146 static void
147 iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
148 {
149   GtkTreeIter iter;
150   GtkTreeIter selected;
151   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
152   GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
153
154   if (gtk_tree_selection_get_selected (selection, NULL, &selected))
155     {
156       if (GTK_IS_TREE_STORE (model))
157         {
158           gtk_tree_store_prepend (GTK_TREE_STORE (model),
159                                   &iter,
160                                   &selected);
161           node_set (&iter);
162         }
163     }
164   else
165     {
166       if (GTK_IS_TREE_STORE (model))
167         {
168           gtk_tree_store_prepend (GTK_TREE_STORE (model),
169                                   &iter,
170                                   NULL);
171           node_set (&iter);
172         }
173     }
174 }
175
176 static void
177 iter_append (GtkWidget *button, GtkTreeView *tree_view)
178 {
179   GtkTreeIter iter;
180   GtkTreeIter selected;
181   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
182
183   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
184                                        NULL,
185                                        &selected))
186     {
187       if (GTK_IS_TREE_STORE (model))
188         {
189           gtk_tree_store_append (model, &iter, &selected);
190           node_set (&iter);
191         }
192     }
193   else
194     {
195       if (GTK_IS_TREE_STORE (model))
196         {
197           gtk_tree_store_append (model, &iter, NULL);
198           node_set (&iter);
199         }
200     }
201 }
202
203 static void
204 uppercase_value (const GValue *src, GValue *dest, gpointer data)
205 {
206   gchar *str;
207   
208   g_value_init (dest, G_TYPE_STRING);
209   str = g_strdup (g_value_get_string (src));
210   if (str)
211     g_strup (str);
212   g_value_set_string (dest, str);
213   g_free (str);
214 }
215
216 static void
217 make_window (gint view_type)
218 {
219   GtkWidget *window;
220   GtkWidget *vbox;
221   GtkWidget *hbox, *entry;
222   GtkWidget *button;
223   GtkWidget *scrolled_window;
224   GtkWidget *tree_view;
225   GtkTreeViewColumn *column;
226   GtkCellRenderer *cell;
227   GtkObject *selection;
228
229   /* Make the Widgets/Objects */
230   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
231   switch (view_type)
232     {
233     case 0:
234       gtk_window_set_title (GTK_WINDOW (window), "Unsorted list");
235       break;
236     case 1:
237       gtk_window_set_title (GTK_WINDOW (window), "Sorted list");
238       break;
239     case 2:
240       gtk_window_set_title (GTK_WINDOW (window), "Uppercase flipped list");
241       break;
242     }
243
244   vbox = gtk_vbox_new (FALSE, 8);
245   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
246   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
247   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
248   switch (view_type)
249     {
250     case 0:
251       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (base_model));
252       break;
253     case 1:
254       {
255         GtkTreeModel *sort_model;
256         
257         sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model),
258                                                          NULL, 1);
259         tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
260       }
261       break;
262     case 2:
263       {
264         GtkTreeModel *map_model;
265         
266         map_model = gtk_tree_model_mapping_new_with_model (GTK_TREE_MODEL (base_model));
267
268         gtk_tree_model_mapping_set_n_columns (GTK_TREE_MODEL_MAPPING (map_model), 2);
269         gtk_tree_model_mapping_set_column_mapping (GTK_TREE_MODEL_MAPPING (map_model),
270                                                    0,
271                                                    1,
272                                                    G_TYPE_STRING,
273                                                    uppercase_value,
274                                                    NULL);
275         gtk_tree_model_mapping_set_column_mapping (GTK_TREE_MODEL_MAPPING (map_model),
276                                                    1,
277                                                    0,
278                                                    G_TYPE_STRING,
279                                                    uppercase_value,
280                                                    NULL);
281         
282         tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (map_model));
283         
284       }
285       break;
286     }
287
288   selection = GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
289   gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection), GTK_TREE_SELECTION_SINGLE);
290
291   /* Put them together */
292   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
293   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
294   gtk_container_add (GTK_CONTAINER (window), vbox);
295   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
296                                   GTK_POLICY_AUTOMATIC,
297                                   GTK_POLICY_AUTOMATIC);
298   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
299
300   /* buttons */
301   button = gtk_button_new_with_label ("gtk_tree_store_remove");
302   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
303   gtk_signal_connect (GTK_OBJECT (selection),
304                       "selection_changed",
305                       selection_changed,
306                       button);
307   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_remove, tree_view);
308   gtk_widget_set_sensitive (button, FALSE);
309
310   button = gtk_button_new_with_label ("gtk_tree_store_insert");
311   hbox = gtk_hbox_new (FALSE, 8);
312   entry = gtk_entry_new ();
313   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
314   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
315   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
316   gtk_object_set_user_data (GTK_OBJECT (button), entry);
317   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert, tree_view);
318
319   
320   button = gtk_button_new_with_label ("gtk_tree_store_insert_before");
321   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
322   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_before, tree_view);
323   gtk_signal_connect (GTK_OBJECT (selection),
324                       "selection_changed",
325                       selection_changed,
326                       button);
327   gtk_widget_set_sensitive (button, FALSE);
328
329   button = gtk_button_new_with_label ("gtk_tree_store_insert_after");
330   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
331   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_after, tree_view);
332   gtk_signal_connect (GTK_OBJECT (selection),
333                       "selection_changed",
334                       selection_changed,
335                       button);
336   gtk_widget_set_sensitive (button, FALSE);
337
338   button = gtk_button_new_with_label ("gtk_tree_store_prepend");
339   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
340   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_prepend, tree_view);
341
342   button = gtk_button_new_with_label ("gtk_tree_store_append");
343   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
344   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_append, tree_view);
345
346   /* The selected column */
347   cell = gtk_cell_renderer_text_new ();
348   column = gtk_tree_view_column_new_with_attributes ("Node ID", cell, "text", 0, NULL);
349   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
350
351   cell = gtk_cell_renderer_text_new ();
352   column = gtk_tree_view_column_new_with_attributes ("Random Number", cell, "text", 1, NULL);
353   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
354
355   /* A few to start */
356   if (view_type == 0)
357     {
358       iter_append (NULL, GTK_TREE_VIEW (tree_view));
359       iter_append (NULL, GTK_TREE_VIEW (tree_view));
360       iter_append (NULL, GTK_TREE_VIEW (tree_view));
361       iter_append (NULL, GTK_TREE_VIEW (tree_view));
362       iter_append (NULL, GTK_TREE_VIEW (tree_view));
363       iter_append (NULL, GTK_TREE_VIEW (tree_view));
364     }
365   /* Show it all */
366   gtk_widget_show_all (window);
367 }
368
369 int
370 main (int argc, char *argv[])
371 {
372   gtk_init (&argc, &argv);
373
374   base_model = gtk_tree_store_new_with_types (2, G_TYPE_STRING, G_TYPE_STRING);
375
376   /* FIXME: reverse this */
377   make_window (0);
378   make_window (1);
379   make_window (2);
380
381   gtk_main ();
382
383   return 0;
384 }
385