]> Pileus Git - ~andy/gtk/blob - tests/treestoretest.c
Ignore the sgml directory made by gtkdoc. Use gtk_window_set_resizable
[~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   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
63
64   entry = gtk_object_get_user_data (GTK_OBJECT (button));
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 (model,
70                              &iter,
71                              &selected,
72                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
73     }
74   else
75     {
76       gtk_tree_store_insert (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_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
87 {
88   GtkTreeIter iter;
89   GtkTreeIter selected;
90   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
91
92   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
93                                        NULL,
94                                        &selected))
95     {
96       gtk_tree_store_insert_before (model,
97                                     &iter,
98                                     NULL,
99                                     &selected);
100     }
101   else
102     {
103       gtk_tree_store_insert_before (model,
104                                     &iter,
105                                     NULL,
106                                     NULL);
107     }
108
109   node_set (&iter);
110 }
111
112 static void
113 iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
114 {
115   GtkTreeIter iter;
116   GtkTreeIter selected;
117   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
118
119   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
120                                        NULL,
121                                        &selected))
122     {
123       if (GTK_IS_TREE_STORE (model))
124         {
125           gtk_tree_store_insert_after (model,
126                                        &iter,
127                                        NULL,
128                                        &selected);
129           node_set (&iter);
130         }
131     }
132   else
133     {
134       if (GTK_IS_TREE_STORE (model))
135         {
136           gtk_tree_store_insert_after (model,
137                                        &iter,
138                                        NULL,
139                                        NULL);
140           node_set (&iter);
141         }
142     }
143 }
144
145 static void
146 iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
147 {
148   GtkTreeIter iter;
149   GtkTreeIter selected;
150   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
151   GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
152
153   if (gtk_tree_selection_get_selected (selection, NULL, &selected))
154     {
155       if (GTK_IS_TREE_STORE (model))
156         {
157           gtk_tree_store_prepend (GTK_TREE_STORE (model),
158                                   &iter,
159                                   &selected);
160           node_set (&iter);
161         }
162     }
163   else
164     {
165       if (GTK_IS_TREE_STORE (model))
166         {
167           gtk_tree_store_prepend (GTK_TREE_STORE (model),
168                                   &iter,
169                                   NULL);
170           node_set (&iter);
171         }
172     }
173 }
174
175 static void
176 iter_append (GtkWidget *button, GtkTreeView *tree_view)
177 {
178   GtkTreeIter iter;
179   GtkTreeIter selected;
180   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
181
182   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
183                                        NULL,
184                                        &selected))
185     {
186       if (GTK_IS_TREE_STORE (model))
187         {
188           gtk_tree_store_append (model, &iter, &selected);
189           node_set (&iter);
190         }
191     }
192   else
193     {
194       if (GTK_IS_TREE_STORE (model))
195         {
196           gtk_tree_store_append (model, &iter, NULL);
197           node_set (&iter);
198         }
199     }
200 }
201
202 static void
203 make_window (gint view_type)
204 {
205   GtkWidget *window;
206   GtkWidget *vbox;
207   GtkWidget *hbox, *entry;
208   GtkWidget *button;
209   GtkWidget *scrolled_window;
210   GtkWidget *tree_view;
211   GtkTreeViewColumn *column;
212   GtkCellRenderer *cell;
213   GObject *selection;
214
215   /* Make the Widgets/Objects */
216   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
217   switch (view_type)
218     {
219     case 0:
220       gtk_window_set_title (GTK_WINDOW (window), "Unsorted list");
221       break;
222     case 1:
223       gtk_window_set_title (GTK_WINDOW (window), "Sorted list");
224       break;
225     }
226
227   vbox = gtk_vbox_new (FALSE, 8);
228   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
229   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
230   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
231   switch (view_type)
232     {
233     case 0:
234       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (base_model));
235       break;
236     case 1:
237       {
238         GtkTreeModel *sort_model;
239         
240         sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model));
241         tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
242       }
243       break;
244     default:
245       g_assert_not_reached ();
246       tree_view = NULL; /* Quiet compiler */
247       break;
248     }
249
250   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
251   selection = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
252   gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection), GTK_TREE_SELECTION_SINGLE);
253
254   /* Put them together */
255   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
256   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
257   gtk_container_add (GTK_CONTAINER (window), vbox);
258   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
259                                   GTK_POLICY_AUTOMATIC,
260                                   GTK_POLICY_AUTOMATIC);
261   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
262
263   /* buttons */
264   button = gtk_button_new_with_label ("gtk_tree_store_remove");
265   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
266   g_signal_connect (G_OBJECT (selection),
267                     "changed",
268                     selection_changed,
269                     button);
270   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_remove, tree_view);
271   gtk_widget_set_sensitive (button, FALSE);
272
273   button = gtk_button_new_with_label ("gtk_tree_store_insert");
274   hbox = gtk_hbox_new (FALSE, 8);
275   entry = gtk_entry_new ();
276   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
277   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
278   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
279   gtk_object_set_user_data (GTK_OBJECT (button), entry);
280   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert, tree_view);
281
282   
283   button = gtk_button_new_with_label ("gtk_tree_store_insert_before");
284   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
285   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_before, tree_view);
286   g_signal_connect (G_OBJECT (selection),
287                     "changed",
288                     selection_changed,
289                     button);
290   gtk_widget_set_sensitive (button, FALSE);
291
292   button = gtk_button_new_with_label ("gtk_tree_store_insert_after");
293   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
294   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_after, tree_view);
295   g_signal_connect (G_OBJECT (selection),
296                     "changed",
297                     selection_changed,
298                     button);
299   gtk_widget_set_sensitive (button, FALSE);
300
301   button = gtk_button_new_with_label ("gtk_tree_store_prepend");
302   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
303   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_prepend, tree_view);
304
305   button = gtk_button_new_with_label ("gtk_tree_store_append");
306   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
307   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_append, tree_view);
308
309   /* The selected column */
310   cell = gtk_cell_renderer_text_new ();
311   column = gtk_tree_view_column_new_with_attributes ("Node ID", cell, "markup", 0, NULL);
312   gtk_tree_view_column_set_sort_column_id (column, 0);
313   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
314   g_object_unref (G_OBJECT (cell));
315   g_object_unref (G_OBJECT (column));
316
317   cell = gtk_cell_renderer_text_new ();
318   column = gtk_tree_view_column_new_with_attributes ("Random Number", cell, "text", 1, NULL);
319   gtk_tree_view_column_set_sort_column_id (column, 1);
320   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
321   g_object_unref (G_OBJECT (cell));
322   g_object_unref (G_OBJECT (column));
323
324   /* A few to start */
325   if (view_type == 0)
326     {
327       iter_append (NULL, GTK_TREE_VIEW (tree_view));
328       iter_append (NULL, GTK_TREE_VIEW (tree_view));
329       iter_append (NULL, GTK_TREE_VIEW (tree_view));
330       iter_append (NULL, GTK_TREE_VIEW (tree_view));
331       iter_append (NULL, GTK_TREE_VIEW (tree_view));
332       iter_append (NULL, GTK_TREE_VIEW (tree_view));
333     }
334   /* Show it all */
335   gtk_widget_show_all (window);
336 }
337
338 int
339 main (int argc, char *argv[])
340 {
341   gtk_init (&argc, &argv);
342
343   base_model = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
344
345   /* FIXME: reverse this */
346   make_window (0);
347   make_window (1);
348
349   gtk_main ();
350
351   return 0;
352 }
353