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