]> Pileus Git - ~andy/gtk/blob - tests/treestoretest.c
New function proposed by Guy Harris <gharris@flashcom.net>. Also, added
[~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     gtk_widget_set_sensitive (button, TRUE);
12   else
13     gtk_widget_set_sensitive (button, FALSE);
14 }
15
16 static GtkTreeNode *
17 node_new ()
18 {
19   static GValue value = {0, };
20   static gint i = 0;
21   gchar *str;
22   GtkTreeNode *node = gtk_tree_store_node_new ();
23
24   g_value_init (&value, G_TYPE_STRING);
25   str = g_strdup_printf ("FOO: %d", i++);
26   g_value_set_string (&value, str);
27   g_free (str);
28   gtk_tree_store_node_set_cell (GTK_TREE_STORE (model), node, 0, &value);
29   g_value_unset (&value);
30
31   return node;
32 }
33
34 static void
35 node_remove (GtkWidget *button, GtkTreeView *tree_view)
36 {
37   GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
38   gtk_tree_store_node_remove (GTK_TREE_STORE (model),
39                               selected);
40 }
41
42 static void
43 node_insert (GtkWidget *button, GtkTreeView *tree_view)
44 {
45   GtkWidget *entry;
46   GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
47
48   entry = gtk_object_get_user_data (GTK_OBJECT (button));
49   gtk_tree_store_node_insert (GTK_TREE_STORE (model),
50                               selected,
51                               atoi (gtk_entry_get_text (GTK_ENTRY (entry))),
52                               node_new ());
53 }
54
55 static void
56 node_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
57 {
58   GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
59   gtk_tree_store_node_insert_before (GTK_TREE_STORE (model),
60                                     NULL,
61                                     selected,
62                                     node_new ());
63 }
64
65 static void
66 node_insert_after (GtkWidget *button, GtkTreeView *tree_view)
67 {
68   GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
69   gtk_tree_store_node_insert_after (GTK_TREE_STORE (model),
70                                     NULL,
71                                     selected,
72                                     node_new ());
73 }
74
75 static void
76 node_prepend (GtkWidget *button, GtkTreeView *tree_view)
77 {
78   GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
79   gtk_tree_store_node_prepend (GTK_TREE_STORE (model),
80                                selected,
81                                node_new ());
82 }
83
84 static void
85 node_append (GtkWidget *button, GtkTreeView *tree_view)
86 {
87   GtkTreeNode *selected = gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
88   gtk_tree_store_node_append (GTK_TREE_STORE (model),
89                               selected,
90                               node_new ());
91 }
92
93 static void
94 make_window ()
95 {
96   GtkWidget *window;
97   GtkWidget *vbox;
98   GtkWidget *hbox, *entry;
99   GtkWidget *button;
100   GtkWidget *scrolled_window;
101   GtkWidget *tree_view;
102   GtkObject *column;
103   GtkCellRenderer *cell;
104   GtkObject *selection;
105
106   /* Make the Widgets/Objects */
107   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
108   vbox = gtk_vbox_new (FALSE, 8);
109   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
110   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
111   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
112   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
113   selection = GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
114   gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection), GTK_TREE_SELECTION_SINGLE);
115
116   /* Put them together */
117   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
118   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
119   gtk_container_add (GTK_CONTAINER (window), vbox);
120   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
121                                   GTK_POLICY_AUTOMATIC,
122                                   GTK_POLICY_AUTOMATIC);
123   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
124
125   /* buttons */
126   button = gtk_button_new_with_label ("gtk_tree_store_node_remove");
127   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
128   gtk_signal_connect (GTK_OBJECT (selection),
129                       "selection_changed",
130                       selection_changed,
131                       button);
132   gtk_signal_connect (GTK_OBJECT (button), "clicked", node_remove, tree_view);
133   gtk_widget_set_sensitive (button, FALSE);
134
135   button = gtk_button_new_with_label ("gtk_tree_store_node_insert");
136   hbox = gtk_hbox_new (FALSE, 8);
137   entry = gtk_entry_new ();
138   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
139   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
140   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
141   gtk_object_set_user_data (GTK_OBJECT (button), entry);
142   gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert, tree_view);
143
144   
145   button = gtk_button_new_with_label ("gtk_tree_store_node_insert_before");
146   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
147   gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert_before, tree_view);
148   gtk_signal_connect (GTK_OBJECT (selection),
149                       "selection_changed",
150                       selection_changed,
151                       button);
152   gtk_widget_set_sensitive (button, FALSE);
153
154   button = gtk_button_new_with_label ("gtk_tree_store_node_insert_after");
155   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
156   gtk_signal_connect (GTK_OBJECT (button), "clicked", node_insert_after, tree_view);
157   gtk_signal_connect (GTK_OBJECT (selection),
158                       "selection_changed",
159                       selection_changed,
160                       button);
161   gtk_widget_set_sensitive (button, FALSE);
162
163   button = gtk_button_new_with_label ("gtk_tree_store_node_prepend");
164   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
165   gtk_signal_connect (GTK_OBJECT (button), "clicked", node_prepend, tree_view);
166
167   button = gtk_button_new_with_label ("gtk_tree_store_node_append");
168   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
169   gtk_signal_connect (GTK_OBJECT (button), "clicked", node_append, tree_view);
170
171   /* The selected column */
172   cell = gtk_cell_renderer_text_new ();
173   column = gtk_tree_view_column_new_with_attributes ("nodes", cell, "text", 0, NULL);
174   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column));
175
176   /* Show it all */
177   gtk_widget_show_all (window);
178 }
179
180 int
181 main (int argc, char *argv[])
182 {
183   gtk_init (&argc, &argv);
184
185   model = gtk_tree_store_new_with_values (2, G_TYPE_STRING, G_TYPE_STRING);
186
187   make_window ();
188   make_window ();
189
190   /* A few to start */
191   gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
192   gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
193   gtk_tree_store_node_append (GTK_TREE_STORE (model), NULL, node_new ());
194
195   gtk_main ();
196
197   return 0;
198 }