]> Pileus Git - ~andy/gtk/blob - tests/treestoretest.c
gtk: remove "gboolean homogeneous" from gtk_box_new()
[~andy/gtk] / tests / treestoretest.c
1 /* treestoretest.c
2  * Copyright (C) 2001 Red Hat, Inc
3  * Author: Jonathan Blandford
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 #include "config.h"
21 #include <gtk/gtk.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 GtkTreeStore *base_model;
26 static gint node_count = 0;
27
28 static void
29 selection_changed (GtkTreeSelection *selection,
30                    GtkWidget        *button)
31 {
32   if (gtk_tree_selection_get_selected (selection, NULL, NULL))
33     gtk_widget_set_sensitive (button, TRUE);
34   else
35     gtk_widget_set_sensitive (button, FALSE);
36 }
37
38 static void
39 node_set (GtkTreeIter *iter)
40 {
41   gint n;
42   gchar *str;
43
44   str = g_strdup_printf ("Row (<span color=\"red\">%d</span>)", node_count++);
45   gtk_tree_store_set (base_model, iter, 0, str, -1);
46   g_free (str);
47
48   n = g_random_int_range (10000,99999);
49   if (n < 0)
50     n *= -1;
51   str = g_strdup_printf ("%d", n);
52
53   gtk_tree_store_set (base_model, iter, 1, str, -1);
54   g_free (str);
55 }
56
57 static void
58 iter_remove (GtkWidget *button, GtkTreeView *tree_view)
59 {
60   GtkTreeIter selected;
61   GtkTreeModel *model;
62
63   model = gtk_tree_view_get_model (tree_view);
64
65   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree_view),
66                                        NULL,
67                                        &selected))
68     {
69       if (GTK_IS_TREE_STORE (model))
70         {
71           gtk_tree_store_remove (GTK_TREE_STORE (model), &selected);
72         }
73     }
74 }
75
76 static void
77 iter_insert (GtkWidget *button, GtkTreeView *tree_view)
78 {
79   GtkWidget *entry;
80   GtkTreeIter iter;
81   GtkTreeIter selected;
82   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
83
84   entry = g_object_get_data (G_OBJECT (button), "user_data");
85   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
86                                        NULL,
87                                        &selected))
88     {
89       gtk_tree_store_insert (GTK_TREE_STORE (model),
90                              &iter,
91                              &selected,
92                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
93     }
94   else
95     {
96       gtk_tree_store_insert (GTK_TREE_STORE (model),
97                              &iter,
98                              NULL,
99                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
100     }
101
102   node_set (&iter);
103 }
104
105 static void
106 iter_change (GtkWidget *button, GtkTreeView *tree_view)
107 {
108   GtkWidget *entry;
109   GtkTreeIter selected;
110   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
111
112   entry = g_object_get_data (G_OBJECT (button), "user_data");
113   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
114                                        NULL, &selected))
115     {
116       gtk_tree_store_set (GTK_TREE_STORE (model),
117                           &selected,
118                           1,
119                           gtk_entry_get_text (GTK_ENTRY (entry)),
120                           -1);
121     }
122 }
123
124 static void
125 iter_insert_with_values (GtkWidget *button, GtkTreeView *tree_view)
126 {
127   GtkWidget *entry;
128   GtkTreeIter iter;
129   GtkTreeIter selected;
130   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
131   gchar *str1, *str2;
132
133   entry = g_object_get_data (G_OBJECT (button), "user_data");
134   str1 = g_strdup_printf ("Row (<span color=\"red\">%d</span>)", node_count++);
135   str2 = g_strdup_printf ("%d", atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
136
137   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
138                                        NULL,
139                                        &selected))
140     {
141       gtk_tree_store_insert_with_values (GTK_TREE_STORE (model),
142                                          &iter,
143                                          &selected,
144                                          -1,
145                                          0, str1,
146                                          1, str2,
147                                          -1);
148     }
149   else
150     {
151       gtk_tree_store_insert_with_values (GTK_TREE_STORE (model),
152                                          &iter,
153                                          NULL,
154                                          -1,
155                                          0, str1,
156                                          1, str2,
157                                          -1);
158     }
159
160   g_free (str1);
161   g_free (str2);
162 }
163
164 static void
165 iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
166 {
167   GtkTreeIter iter;
168   GtkTreeIter selected;
169   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
170
171   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
172                                        NULL,
173                                        &selected))
174     {
175       gtk_tree_store_insert_before (GTK_TREE_STORE (model),
176                                     &iter,
177                                     NULL,
178                                     &selected);
179     }
180   else
181     {
182       gtk_tree_store_insert_before (GTK_TREE_STORE (model),
183                                     &iter,
184                                     NULL,
185                                     NULL);
186     }
187
188   node_set (&iter);
189 }
190
191 static void
192 iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
193 {
194   GtkTreeIter iter;
195   GtkTreeIter selected;
196   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
197
198   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
199                                        NULL,
200                                        &selected))
201     {
202       if (GTK_IS_TREE_STORE (model))
203         {
204           gtk_tree_store_insert_after (GTK_TREE_STORE (model),
205                                        &iter,
206                                        NULL,
207                                        &selected);
208           node_set (&iter);
209         }
210     }
211   else
212     {
213       if (GTK_IS_TREE_STORE (model))
214         {
215           gtk_tree_store_insert_after (GTK_TREE_STORE (model),
216                                        &iter,
217                                        NULL,
218                                        NULL);
219           node_set (&iter);
220         }
221     }
222 }
223
224 static void
225 iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
226 {
227   GtkTreeIter iter;
228   GtkTreeIter selected;
229   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
230   GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
231
232   if (gtk_tree_selection_get_selected (selection, NULL, &selected))
233     {
234       if (GTK_IS_TREE_STORE (model))
235         {
236           gtk_tree_store_prepend (GTK_TREE_STORE (model),
237                                   &iter,
238                                   &selected);
239           node_set (&iter);
240         }
241     }
242   else
243     {
244       if (GTK_IS_TREE_STORE (model))
245         {
246           gtk_tree_store_prepend (GTK_TREE_STORE (model),
247                                   &iter,
248                                   NULL);
249           node_set (&iter);
250         }
251     }
252 }
253
254 static void
255 iter_append (GtkWidget *button, GtkTreeView *tree_view)
256 {
257   GtkTreeIter iter;
258   GtkTreeIter selected;
259   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
260
261   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
262                                        NULL,
263                                        &selected))
264     {
265       if (GTK_IS_TREE_STORE (model))
266         {
267           gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &selected);
268           node_set (&iter);
269         }
270     }
271   else
272     {
273       if (GTK_IS_TREE_STORE (model))
274         {
275           gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
276           node_set (&iter);
277         }
278     }
279 }
280
281 static void
282 make_window (gint view_type)
283 {
284   GtkWidget *window;
285   GtkWidget *vbox;
286   GtkWidget *hbox, *entry;
287   GtkWidget *button;
288   GtkWidget *scrolled_window;
289   GtkWidget *tree_view;
290   GtkTreeViewColumn *column;
291   GtkCellRenderer *cell;
292   GObject *selection;
293
294   /* Make the Widgets/Objects */
295   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
296   switch (view_type)
297     {
298     case 0:
299       gtk_window_set_title (GTK_WINDOW (window), "Unsorted list");
300       break;
301     case 1:
302       gtk_window_set_title (GTK_WINDOW (window), "Sorted list");
303       break;
304     }
305
306   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
307   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
308   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
309   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
310   switch (view_type)
311     {
312     case 0:
313       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (base_model));
314       break;
315     case 1:
316       {
317         GtkTreeModel *sort_model;
318         
319         sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model));
320         tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
321       }
322       break;
323     default:
324       g_assert_not_reached ();
325       tree_view = NULL; /* Quiet compiler */
326       break;
327     }
328
329   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
330   selection = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
331   gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection), GTK_SELECTION_SINGLE);
332
333   /* Put them together */
334   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
335   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
336   gtk_container_add (GTK_CONTAINER (window), vbox);
337   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
338                                   GTK_POLICY_AUTOMATIC,
339                                   GTK_POLICY_AUTOMATIC);
340   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
341
342   /* buttons */
343   button = gtk_button_new_with_label ("gtk_tree_store_remove");
344   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
345   g_signal_connect (selection, "changed",
346                     G_CALLBACK (selection_changed),
347                     button);
348   g_signal_connect (button, "clicked", 
349                     G_CALLBACK (iter_remove), 
350                     tree_view);
351   gtk_widget_set_sensitive (button, FALSE);
352
353   button = gtk_button_new_with_label ("gtk_tree_store_insert");
354   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
355   entry = gtk_entry_new ();
356   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
357   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
358   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
359   g_object_set_data (G_OBJECT (button), "user_data", entry);
360   g_signal_connect (button, "clicked", 
361                     G_CALLBACK (iter_insert), 
362                     tree_view);
363   
364   button = gtk_button_new_with_label ("gtk_tree_store_set");
365   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
366   entry = gtk_entry_new ();
367   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
368   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
369   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
370   g_object_set_data (G_OBJECT (button), "user_data", entry);
371   g_signal_connect (button, "clicked",
372                     G_CALLBACK (iter_change),
373                     tree_view);
374
375   button = gtk_button_new_with_label ("gtk_tree_store_insert_with_values");
376   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
377   entry = gtk_entry_new ();
378   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
379   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
380   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
381   g_object_set_data (G_OBJECT (button), "user_data", entry);
382   g_signal_connect (button, "clicked",
383                     G_CALLBACK (iter_insert_with_values),
384                     tree_view);
385   
386   button = gtk_button_new_with_label ("gtk_tree_store_insert_before");
387   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
388   g_signal_connect (button, "clicked", 
389                     G_CALLBACK (iter_insert_before), 
390                     tree_view);
391   g_signal_connect (selection, "changed",
392                     G_CALLBACK (selection_changed),
393                     button);
394   gtk_widget_set_sensitive (button, FALSE);
395
396   button = gtk_button_new_with_label ("gtk_tree_store_insert_after");
397   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
398   g_signal_connect (button, "clicked", 
399                     G_CALLBACK (iter_insert_after), 
400                     tree_view);
401   g_signal_connect (selection, "changed",
402                     G_CALLBACK (selection_changed),
403                     button);
404   gtk_widget_set_sensitive (button, FALSE);
405
406   button = gtk_button_new_with_label ("gtk_tree_store_prepend");
407   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
408   g_signal_connect (button, "clicked", 
409                     G_CALLBACK (iter_prepend), 
410                     tree_view);
411
412   button = gtk_button_new_with_label ("gtk_tree_store_append");
413   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
414   g_signal_connect (button, "clicked", 
415                     G_CALLBACK (iter_append), 
416                     tree_view);
417
418   /* The selected column */
419   cell = gtk_cell_renderer_text_new ();
420   column = gtk_tree_view_column_new_with_attributes ("Node ID", cell, "markup", 0, NULL);
421   gtk_tree_view_column_set_sort_column_id (column, 0);
422   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
423
424   cell = gtk_cell_renderer_text_new ();
425   column = gtk_tree_view_column_new_with_attributes ("Random Number", cell, "text", 1, NULL);
426   gtk_tree_view_column_set_sort_column_id (column, 1);
427   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
428
429   /* A few to start */
430   if (view_type == 0)
431     {
432       iter_append (NULL, GTK_TREE_VIEW (tree_view));
433       iter_append (NULL, GTK_TREE_VIEW (tree_view));
434       iter_append (NULL, GTK_TREE_VIEW (tree_view));
435       iter_append (NULL, GTK_TREE_VIEW (tree_view));
436       iter_append (NULL, GTK_TREE_VIEW (tree_view));
437       iter_append (NULL, GTK_TREE_VIEW (tree_view));
438     }
439   /* Show it all */
440   gtk_widget_show_all (window);
441 }
442
443 int
444 main (int argc, char *argv[])
445 {
446   gtk_init (&argc, &argv);
447
448   base_model = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
449
450   /* FIXME: reverse this */
451   make_window (0);
452   make_window (1);
453
454   gtk_main ();
455
456   return 0;
457 }
458