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