]> Pileus Git - ~andy/gtk/blob - tests/testtreecolumns.c
Bug fix to make trees work again when not sorted.
[~andy/gtk] / tests / testtreecolumns.c
1 #include <gtk/gtk.h>
2
3
4 GtkWidget *left_tree_view;
5 GtkWidget *top_right_tree_view;
6 GtkWidget *bottom_right_tree_view;
7 GtkTreeModel *left_tree_model;
8 GtkTreeModel *top_right_tree_model;
9 GtkTreeModel *bottom_right_tree_model;
10 GtkWidget *sample_tree_view_top;
11 GtkWidget *sample_tree_view_bottom;
12
13 static void
14 add_clicked (GtkWidget *button, gpointer data)
15 {
16   GtkTreeIter iter;
17   GtkTreeViewColumn *column;
18   GtkCellRenderer *cell;
19   static gint i = 0;
20   gchar *label = g_strdup_printf ("Column %d", i);
21
22   cell = gtk_cell_renderer_text_new ();
23   column = gtk_tree_view_column_new_with_attributes (label, cell, "text", 0, NULL);
24   gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_RESIZEABLE);
25   gtk_list_store_append (GTK_LIST_STORE (left_tree_model), &iter);
26   gtk_list_store_set (GTK_LIST_STORE (left_tree_model), &iter, 0, label, 1, column, -1);
27   g_free (label);
28   i++;
29 }
30
31 static void
32 get_visible (GtkTreeViewColumn *tree_column,
33              GtkCellRenderer   *cell,
34              GtkTreeModel      *tree_model,
35              GtkTreeIter       *iter,
36              gpointer           data)
37 {
38   GtkTreeViewColumn *column;
39
40   gtk_tree_model_get (tree_model, iter, 1, &column, -1);
41   if (column)
42     {
43       gtk_cell_renderer_toggle_set_active (GTK_CELL_RENDERER_TOGGLE (cell),
44                                            column->visible);
45     }
46 }
47
48 static void
49 set_visible (GtkCellRendererToggle *cell,
50              gchar                 *path_str,
51              gpointer               data)
52 {
53   GtkTreeView *tree_view = (GtkTreeView *) data;
54   GtkTreeViewColumn *column;
55   GtkTreeModel *model;
56   GtkTreeIter iter;
57   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
58
59   model = gtk_tree_view_get_model (tree_view);
60
61   gtk_tree_model_get_iter (model, &iter, path);
62   gtk_tree_model_get (model, &iter, 1, &column, -1);
63
64   if (column)
65     {
66       gtk_tree_view_column_set_visible (column, ! gtk_tree_view_column_get_visible (column));
67       gtk_tree_model_range_changed (model, path, &iter, path, &iter);
68     }
69   gtk_tree_path_free (path);
70 }
71
72 static void
73 add_left_clicked (GtkWidget *button, gpointer data)
74 {
75   GtkTreeIter iter;
76   gchar *label;
77   GtkTreeViewColumn *column;
78
79   GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data));
80
81   gtk_tree_selection_get_selected (selection, NULL, &iter);
82   gtk_tree_model_get (gtk_tree_view_get_model (GTK_TREE_VIEW (data)),
83                       &iter, 0, &label, 1, &column, -1);
84
85   if (GTK_WIDGET (data) == top_right_tree_view)
86     gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_top), column);
87   else
88     gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_bottom), column);
89
90   gtk_list_store_remove (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (data))), &iter);
91
92   gtk_list_store_append (GTK_LIST_STORE (left_tree_model), &iter);
93   gtk_list_store_set (GTK_LIST_STORE (left_tree_model), &iter, 0, label, 1, column, -1);
94   g_free (label);
95 }
96
97
98
99 static void
100 add_right_clicked (GtkWidget *button, gpointer data)
101 {
102   GtkTreeIter iter;
103   gchar *label;
104   GtkTreeViewColumn *column;
105
106   GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
107
108   gtk_tree_selection_get_selected (selection, NULL, &iter);
109   gtk_tree_model_get (GTK_TREE_MODEL (left_tree_model),
110                       &iter, 0, &label, 1, &column, -1);
111   gtk_list_store_remove (GTK_LIST_STORE (left_tree_model), &iter);
112
113   gtk_list_store_append (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (data))), &iter);
114   gtk_list_store_set (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (data))), &iter, 0, label, 1, column, -1);
115
116   if (GTK_WIDGET (data) == top_right_tree_view)
117     gtk_tree_view_append_column (GTK_TREE_VIEW (sample_tree_view_top), column);
118   else
119     gtk_tree_view_append_column (GTK_TREE_VIEW (sample_tree_view_bottom), column);
120   g_free (label);
121 }
122
123 static void
124 selection_changed (GtkTreeSelection *selection, GtkWidget *button)
125 {
126   if (gtk_tree_selection_get_selected (selection, NULL, NULL))
127     gtk_widget_set_sensitive (button, TRUE);
128   else
129     gtk_widget_set_sensitive (button, FALSE);
130 }
131
132 int
133 main (int argc, char *argv[])
134 {
135   GtkWidget *window;
136   GtkWidget *hbox, *vbox;
137   GtkWidget *vbox2, *bbox;
138   GtkWidget *button;
139   GtkTreeViewColumn *column;
140   GtkCellRenderer *cell;
141   GtkWidget *swindow;
142   GtkTreeModel *sample_model;
143   gint i;
144
145   gtk_init (&argc, &argv);
146
147   /* First initialize all the models for signal purposes */
148   left_tree_model = (GtkTreeModel *) gtk_list_store_new_with_types (2, G_TYPE_STRING, GTK_TYPE_POINTER);
149   top_right_tree_model = (GtkTreeModel *) gtk_list_store_new_with_types (2, G_TYPE_STRING, GTK_TYPE_POINTER);
150   bottom_right_tree_model = (GtkTreeModel *) gtk_list_store_new_with_types (2, G_TYPE_STRING, GTK_TYPE_POINTER);
151   top_right_tree_view = gtk_tree_view_new_with_model (top_right_tree_model);
152   bottom_right_tree_view = gtk_tree_view_new_with_model (bottom_right_tree_model);
153   sample_model = (GtkTreeModel *) gtk_list_store_new_with_types (1, G_TYPE_STRING);
154
155   for (i = 0; i < 10; i++)
156     {
157       GtkTreeIter iter;
158       gchar *string = g_strdup_printf ("%d", i);
159       gtk_list_store_append (GTK_LIST_STORE (sample_model), &iter);
160       gtk_list_store_set (GTK_LIST_STORE (sample_model), &iter, 0, string, -1);
161       g_free (string);
162     }
163
164   /* Set up the test windows. */
165   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
166   gtk_window_set_title (GTK_WINDOW (window), "Top Window");
167   swindow = gtk_scrolled_window_new (NULL, NULL);
168   sample_tree_view_top = gtk_tree_view_new_with_model (sample_model);
169   gtk_container_add (GTK_CONTAINER (window), swindow);
170   gtk_container_add (GTK_CONTAINER (swindow), sample_tree_view_top);
171   gtk_widget_show_all (window);
172
173   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
174   gtk_window_set_title (GTK_WINDOW (window), "Bottom Window");
175   swindow = gtk_scrolled_window_new (NULL, NULL);
176   sample_tree_view_bottom = gtk_tree_view_new_with_model (sample_model);
177   gtk_container_add (GTK_CONTAINER (window), swindow);
178   gtk_container_add (GTK_CONTAINER (swindow), sample_tree_view_bottom);
179   gtk_widget_show_all (window);
180
181   /* Set up the main window */
182   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
183   gtk_window_set_default_size (GTK_WINDOW (window), 500, 300);
184   vbox = gtk_vbox_new (FALSE, 8);
185   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
186   gtk_container_add (GTK_CONTAINER (window), vbox);
187
188   hbox = gtk_hbox_new (FALSE, 8);
189   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
190
191   /* Left Pane */
192   cell = gtk_cell_renderer_text_new ();
193
194   swindow = gtk_scrolled_window_new (NULL, NULL);
195   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
196   left_tree_view = gtk_tree_view_new_with_model (left_tree_model);
197   gtk_container_add (GTK_CONTAINER (swindow), left_tree_view);
198   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (left_tree_view), -1,
199                                                "Unattached Columns", cell, "text", 0, NULL);
200   cell = gtk_cell_renderer_toggle_new ();
201   g_signal_connect_data (G_OBJECT (cell), "toggled", set_visible, left_tree_view, NULL, FALSE, FALSE);
202   column = gtk_tree_view_column_new_with_attributes ("Visible", cell, NULL);
203   gtk_tree_view_append_column (GTK_TREE_VIEW (left_tree_view), column);
204   g_object_unref (G_OBJECT (column));
205   gtk_tree_view_column_set_cell_data_func (column, get_visible, NULL, NULL);
206   gtk_box_pack_start (GTK_BOX (hbox), swindow, TRUE, TRUE, 0);
207
208   /* Middle Pane */
209   vbox2 = gtk_vbox_new (FALSE, 8);
210   gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
211   
212   bbox = gtk_vbutton_box_new ();
213   gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
214   gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), 0, 0);
215   gtk_box_pack_start (GTK_BOX (vbox2), bbox, TRUE, TRUE, 0);
216
217   button = gtk_button_new_with_label ("<<");
218   gtk_widget_set_sensitive (button, FALSE);
219   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (add_left_clicked), top_right_tree_view);
220   gtk_signal_connect (GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (top_right_tree_view))),
221                       "selection-changed", GTK_SIGNAL_FUNC (selection_changed), button);
222   gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
223
224   button = gtk_button_new_with_label (">>");
225   gtk_widget_set_sensitive (button, FALSE);
226   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (add_right_clicked), top_right_tree_view);
227   gtk_signal_connect (GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view))),
228                       "selection-changed", GTK_SIGNAL_FUNC (selection_changed), button);
229   gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
230
231   bbox = gtk_vbutton_box_new ();
232   gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
233   gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), 0, 0);
234   gtk_box_pack_start (GTK_BOX (vbox2), bbox, TRUE, TRUE, 0);
235
236   button = gtk_button_new_with_label ("<<");
237   gtk_widget_set_sensitive (button, FALSE);
238   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (add_left_clicked), bottom_right_tree_view);
239   gtk_signal_connect (GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (bottom_right_tree_view))),
240                       "selection-changed", GTK_SIGNAL_FUNC (selection_changed), button);
241   gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
242
243   button = gtk_button_new_with_label (">>");
244   gtk_widget_set_sensitive (button, FALSE);
245   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (add_right_clicked), bottom_right_tree_view);
246   gtk_signal_connect (GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view))),
247                       "selection-changed", GTK_SIGNAL_FUNC (selection_changed), button);
248   gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
249
250   
251   /* Right Pane */
252   vbox2 = gtk_vbox_new (FALSE, 8);
253   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
254
255   swindow = gtk_scrolled_window_new (NULL, NULL);
256   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
257   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (top_right_tree_view), FALSE);
258   cell = gtk_cell_renderer_text_new ();
259   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (top_right_tree_view), -1,
260                                                NULL, cell, "text", 0, NULL);
261   cell = gtk_cell_renderer_toggle_new ();
262   g_signal_connect_data (G_OBJECT (cell), "toggled", set_visible, top_right_tree_view, NULL, FALSE, FALSE);
263   column = gtk_tree_view_column_new_with_attributes (NULL, cell, NULL);
264   gtk_tree_view_column_set_cell_data_func (column, get_visible, NULL, NULL);
265   gtk_tree_view_append_column (GTK_TREE_VIEW (top_right_tree_view), column);
266
267   gtk_container_add (GTK_CONTAINER (swindow), top_right_tree_view);
268   gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
269
270   swindow = gtk_scrolled_window_new (NULL, NULL);
271   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
272   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (bottom_right_tree_view), FALSE);
273   cell = gtk_cell_renderer_text_new ();
274   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (bottom_right_tree_view), -1,
275                                                NULL, cell, "text", 0, NULL);
276   cell = gtk_cell_renderer_toggle_new ();
277   g_signal_connect_data (G_OBJECT (cell), "toggled", set_visible, bottom_right_tree_view, NULL, FALSE, FALSE);
278   column = gtk_tree_view_column_new_with_attributes (NULL, cell, NULL);
279   gtk_tree_view_column_set_cell_data_func (column, get_visible, NULL, NULL);
280   gtk_tree_view_append_column (GTK_TREE_VIEW (bottom_right_tree_view), column);
281   gtk_container_add (GTK_CONTAINER (swindow), bottom_right_tree_view);
282   gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
283
284   
285   gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
286
287   hbox = gtk_hbox_new (FALSE, 8);
288   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
289   button = gtk_button_new_with_label ("Add new Column");
290   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (add_clicked), left_tree_model);
291   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
292
293   gtk_widget_show_all (window);
294   gtk_main ();
295
296   return 0;
297 }