]> Pileus Git - ~andy/gtk/blob - tests/treestoretest.c
Add convertion functions to let you convert to and from relative path's
[~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
22   gchar *str;
23
24   str = g_strdup_printf ("FOO: %d", i++);
25   gtk_tree_store_set (base_model, iter, 0, str, -1);
26   g_free (str);
27
28   str = g_strdup_printf ("%d", g_random_int ());
29   gtk_tree_store_set (base_model, iter, 1, str, -1);
30   g_free (str);
31 }
32
33 static void
34 iter_remove (GtkWidget *button, GtkTreeView *tree_view)
35 {
36   GtkTreeIter selected;
37   GtkTreeIter s_selected;
38   GtkTreeModel *model;
39
40   model = gtk_tree_view_get_model (tree_view);
41
42   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree_view),
43                                        NULL,
44                                        &selected))
45     {
46       if (GTK_IS_TREE_STORE (model))
47         {
48           gtk_tree_store_remove (GTK_TREE_STORE (model), &selected);
49         }
50     }
51 }
52
53 static void
54 iter_insert (GtkWidget *button, GtkTreeView *tree_view)
55 {
56   GtkWidget *entry;
57   GtkTreeIter iter;
58   GtkTreeIter selected;
59   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
60
61   entry = gtk_object_get_user_data (GTK_OBJECT (button));
62   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
63                                        NULL,
64                                        &selected))
65     {
66       gtk_tree_store_insert (model,
67                              &iter,
68                              &selected,
69                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
70     }
71   else
72     {
73       gtk_tree_store_insert (model,
74                              &iter,
75                              NULL,
76                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
77     }
78
79   node_set (&iter);
80 }
81
82 static void
83 iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
84 {
85   GtkTreeIter iter;
86   GtkTreeIter selected;
87   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
88
89   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
90                                        NULL,
91                                        &selected))
92     {
93       gtk_tree_store_insert_before (model,
94                                     &iter,
95                                     NULL,
96                                     &selected);
97     }
98   else
99     {
100       gtk_tree_store_insert_before (model,
101                                     &iter,
102                                     NULL,
103                                     NULL);
104     }
105
106   node_set (&iter);
107 }
108
109 static void
110 iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
111 {
112   GtkTreeIter iter;
113   GtkTreeIter selected;
114   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
115
116   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
117                                        NULL,
118                                        &selected))
119     {
120       gtk_tree_store_insert_after (model,
121                                    &iter,
122                                    NULL,
123                                    &selected);
124     }
125   else
126     {
127       gtk_tree_store_insert_after (model,
128                                    &iter,
129                                    NULL,
130                                    &selected);
131     }
132
133   node_set (&iter);
134 }
135
136 static void
137 iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
138 {
139   GtkTreeIter iter;
140   GtkTreeIter selected;
141   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
142   GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
143
144   if (gtk_tree_selection_get_selected (selection, NULL, &selected))
145     {
146       if (GTK_IS_TREE_STORE (model))
147         {
148           gtk_tree_store_prepend (GTK_TREE_STORE (model),
149                                   &iter,
150                                   &selected);
151           node_set (&iter);
152         }
153     }
154   else
155     {
156       if (GTK_IS_TREE_STORE (model))
157         {
158           gtk_tree_store_prepend (GTK_TREE_STORE (model),
159                                   &iter,
160                                   NULL);
161           node_set (&iter);
162         }
163     }
164 }
165
166 static void
167 iter_append (GtkWidget *button, GtkTreeView *tree_view)
168 {
169   GtkTreeIter iter;
170   GtkTreeIter selected;
171   GtkTreeStore *model = gtk_tree_view_get_model (tree_view);
172
173   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
174                                        NULL,
175                                        &selected))
176     {
177       if (GTK_IS_TREE_STORE (model))
178         {
179           gtk_tree_store_append (model, &iter, &selected);
180           node_set (&iter);
181         }
182     }
183   else
184     {
185       if (GTK_IS_TREE_STORE (model))
186         {
187           gtk_tree_store_append (model, &iter, NULL);
188           node_set (&iter);
189         }
190     }
191 }
192
193 static void
194 make_window (gboolean use_sort)
195 {
196   GtkWidget *window;
197   GtkWidget *vbox;
198   GtkWidget *hbox, *entry;
199   GtkWidget *button;
200   GtkWidget *scrolled_window;
201   GtkWidget *tree_view;
202   GtkTreeViewColumn *column;
203   GtkCellRenderer *cell;
204   GtkObject *selection;
205
206   /* Make the Widgets/Objects */
207   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
208   if (use_sort)
209     gtk_window_set_title (GTK_WINDOW (window), "Sorted list");
210   else
211     gtk_window_set_title (GTK_WINDOW (window), "Unsorted list");
212
213   vbox = gtk_vbox_new (FALSE, 8);
214   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
215   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
216   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
217   if (use_sort)
218     {
219       GtkTreeModel *sort_model;
220
221       sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model),
222                                                        NULL, 0);
223       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
224     }
225   else
226     {
227       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (base_model));
228     }
229
230   selection = GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
231   gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection), GTK_TREE_SELECTION_SINGLE);
232
233   /* Put them together */
234   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
235   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
236   gtk_container_add (GTK_CONTAINER (window), vbox);
237   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
238                                   GTK_POLICY_AUTOMATIC,
239                                   GTK_POLICY_AUTOMATIC);
240   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
241
242   /* buttons */
243   button = gtk_button_new_with_label ("gtk_tree_store_remove");
244   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
245   gtk_signal_connect (GTK_OBJECT (selection),
246                       "selection_changed",
247                       selection_changed,
248                       button);
249   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_remove, tree_view);
250   gtk_widget_set_sensitive (button, FALSE);
251
252   button = gtk_button_new_with_label ("gtk_tree_store_insert");
253   hbox = gtk_hbox_new (FALSE, 8);
254   entry = gtk_entry_new ();
255   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
256   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
257   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
258   gtk_object_set_user_data (GTK_OBJECT (button), entry);
259   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert, tree_view);
260
261   
262   button = gtk_button_new_with_label ("gtk_tree_store_insert_before");
263   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
264   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_before, tree_view);
265   gtk_signal_connect (GTK_OBJECT (selection),
266                       "selection_changed",
267                       selection_changed,
268                       button);
269   gtk_widget_set_sensitive (button, FALSE);
270
271   button = gtk_button_new_with_label ("gtk_tree_store_insert_after");
272   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
273   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_after, tree_view);
274   gtk_signal_connect (GTK_OBJECT (selection),
275                       "selection_changed",
276                       selection_changed,
277                       button);
278   gtk_widget_set_sensitive (button, FALSE);
279
280   button = gtk_button_new_with_label ("gtk_tree_store_prepend");
281   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
282   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_prepend, tree_view);
283
284   button = gtk_button_new_with_label ("gtk_tree_store_append");
285   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
286   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_append, tree_view);
287
288   /* The selected column */
289   cell = gtk_cell_renderer_text_new ();
290   column = gtk_tree_view_column_new_with_attributes ("Node ID", cell, "text", 0, NULL);
291   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
292
293   cell = gtk_cell_renderer_text_new ();
294   column = gtk_tree_view_column_new_with_attributes ("Random Number", cell, "text", 1, NULL);
295   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
296
297   /* A few to start */
298   if (!use_sort)
299     {
300       iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
301       iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
302       iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
303     }
304   /* Show it all */
305   gtk_widget_show_all (window);
306 }
307
308 int
309 main (int argc, char *argv[])
310 {
311   gtk_init (&argc, &argv);
312
313   base_model = gtk_tree_store_new_with_types (2, G_TYPE_STRING, G_TYPE_STRING);
314
315   /* FIXME: reverse this */
316   make_window (FALSE);
317   make_window (TRUE);
318
319   gtk_main ();
320
321   return 0;
322 }