]> Pileus Git - ~andy/gtk/blob - tests/treestoretest.c
added more fields to allow more interesting iterators. Also, made the
[~andy/gtk] / tests / treestoretest.c
1 #include <gtk/gtk.h>
2 #include <stdlib.h>
3
4 GtkTreeStore *model;
5
6 static void
7 selection_changed (GtkTreeSelection *selection,
8                    GtkWidget        *button)
9 {
10   if (gtk_tree_selection_get_selected (selection, NULL, NULL))
11     gtk_widget_set_sensitive (button, TRUE);
12   else
13     gtk_widget_set_sensitive (button, FALSE);
14 }
15
16 static void
17 node_set (GtkTreeIter *iter)
18 {
19   static gint i = 0;
20   gchar *str;
21
22   str = g_strdup_printf ("FOO: %d", i++);
23   gtk_tree_store_set (model, iter, 0, str, -1);
24   g_free (str);
25
26 }
27
28 static void
29 iter_remove (GtkWidget *button, GtkTreeView *tree_view)
30 {
31   GtkTreeIter selected;
32   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
33                                        NULL,
34                                        &selected))
35     {
36       gtk_tree_store_remove (model, &selected);
37     }
38 }
39
40 static void
41 iter_insert (GtkWidget *button, GtkTreeView *tree_view)
42 {
43   GtkWidget *entry;
44   GtkTreeIter iter;
45   GtkTreeIter selected;
46
47   entry = gtk_object_get_user_data (GTK_OBJECT (button));
48   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
49                                        NULL,
50                                        &selected))
51     {
52       gtk_tree_store_insert (model,
53                              &iter,
54                              &selected,
55                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
56     }
57   else
58     {
59       gtk_tree_store_insert (model,
60                              &iter,
61                              NULL,
62                              atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
63     }
64
65   node_set (&iter);
66 }
67
68 static void
69 iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
70 {
71   GtkTreeIter iter;
72   GtkTreeIter selected;
73
74   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
75                                        NULL,
76                                        &selected))
77     {
78       gtk_tree_store_insert_before (model,
79                                     &iter,
80                                     NULL,
81                                     &selected);
82     }
83   else
84     {
85       gtk_tree_store_insert_before (model,
86                                     &iter,
87                                     NULL,
88                                     NULL);
89     }
90
91   node_set (&iter);
92 }
93
94 static void
95 iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
96 {
97   GtkTreeIter iter;
98   GtkTreeIter selected;
99
100   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
101                                        NULL,
102                                        &selected))
103     {
104       gtk_tree_store_insert_after (model,
105                                    &iter,
106                                    NULL,
107                                    &selected);
108     }
109   else
110     {
111       gtk_tree_store_insert_after (model,
112                                    &iter,
113                                    NULL,
114                                    &selected);
115     }
116
117   node_set (&iter);
118 }
119
120 static void
121 iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
122 {
123   GtkTreeIter iter;
124   GtkTreeIter selected;
125
126   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
127                                        NULL,
128                                        &selected))
129     {
130       gtk_tree_store_prepend (model,
131                               &iter,
132                               &selected);
133     }
134   else
135     {
136       gtk_tree_store_prepend (model,
137                               &iter,
138                               NULL);
139     }
140
141   node_set (&iter);
142 }
143
144 static void
145 iter_append (GtkWidget *button, GtkTreeView *tree_view)
146 {
147   GtkTreeIter iter;
148   GtkTreeIter selected;
149
150   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
151                                        NULL,
152                                        &selected))
153     {
154       gtk_tree_store_append (model, &iter, &selected);
155     }
156   else
157     {
158       gtk_tree_store_append (model, &iter, NULL);
159     }
160
161   node_set (&iter);
162 }
163
164 static void
165 make_window ()
166 {
167   GtkTreeModel *sort_model;
168   GtkWidget *window;
169   GtkWidget *vbox;
170   GtkWidget *hbox, *entry;
171   GtkWidget *button;
172   GtkWidget *scrolled_window;
173   GtkWidget *tree_view;
174   GtkTreeViewColumn *column;
175   GtkCellRenderer *cell;
176   GtkObject *selection;
177
178   /* Make the Widgets/Objects */
179   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
180   vbox = gtk_vbox_new (FALSE, 8);
181   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
182   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
183   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
184   sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model),
185                                                    NULL, 0);
186   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
187   selection = GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
188   gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection), GTK_TREE_SELECTION_SINGLE);
189
190   /* Put them together */
191   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
192   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
193   gtk_container_add (GTK_CONTAINER (window), vbox);
194   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
195                                   GTK_POLICY_AUTOMATIC,
196                                   GTK_POLICY_AUTOMATIC);
197   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
198
199   /* buttons */
200   button = gtk_button_new_with_label ("gtk_tree_store_remove");
201   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
202   gtk_signal_connect (GTK_OBJECT (selection),
203                       "selection_changed",
204                       selection_changed,
205                       button);
206   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_remove, tree_view);
207   gtk_widget_set_sensitive (button, FALSE);
208
209   button = gtk_button_new_with_label ("gtk_tree_store_insert");
210   hbox = gtk_hbox_new (FALSE, 8);
211   entry = gtk_entry_new ();
212   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
213   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
214   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
215   gtk_object_set_user_data (GTK_OBJECT (button), entry);
216   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert, tree_view);
217
218   
219   button = gtk_button_new_with_label ("gtk_tree_store_insert_before");
220   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
221   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_before, tree_view);
222   gtk_signal_connect (GTK_OBJECT (selection),
223                       "selection_changed",
224                       selection_changed,
225                       button);
226   gtk_widget_set_sensitive (button, FALSE);
227
228   button = gtk_button_new_with_label ("gtk_tree_store_insert_after");
229   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
230   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_insert_after, tree_view);
231   gtk_signal_connect (GTK_OBJECT (selection),
232                       "selection_changed",
233                       selection_changed,
234                       button);
235   gtk_widget_set_sensitive (button, FALSE);
236
237   button = gtk_button_new_with_label ("gtk_tree_store_prepend");
238   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
239   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_prepend, tree_view);
240
241   button = gtk_button_new_with_label ("gtk_tree_store_append");
242   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
243   gtk_signal_connect (GTK_OBJECT (button), "clicked", iter_append, tree_view);
244
245   /* The selected column */
246   cell = gtk_cell_renderer_text_new ();
247   column = gtk_tree_view_column_new_with_attributes ("nodes", cell, "text", 0, NULL);
248   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
249
250   /* A few to start */
251   iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
252   iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
253   iter_prepend (NULL, GTK_TREE_VIEW (tree_view));
254
255   /* Show it all */
256   gtk_widget_show_all (window);
257 }
258
259 int
260 main (int argc, char *argv[])
261 {
262   gtk_init (&argc, &argv);
263
264   model = gtk_tree_store_new_with_values (2, G_TYPE_STRING, G_TYPE_STRING);
265   
266   make_window ();
267   make_window ();
268
269   gtk_main ();
270
271   return 0;
272 }