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