1#include <gtk/gtk.h>
2
3
4static GtkTreeModel *
5create_model (void)
6{
7 GtkTreeStore *store;
8 GtkTreeIter iter;
9 GtkTreeIter parent;
10
11 store = gtk_tree_store_new (n_columns: 1, G_TYPE_STRING);
12
13 gtk_tree_store_insert_with_values (tree_store: store, iter: &parent, NULL, position: 0,
14 0, "Applications", -1);
15
16 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
17 0, "File Manager", -1);
18 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
19 0, "Gossip", -1);
20 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
21 0, "System Settings", -1);
22 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
23 0, "The GIMP", -1);
24 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
25 0, "Terminal", -1);
26 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
27 0, "Word Processor", -1);
28
29
30 gtk_tree_store_insert_with_values (tree_store: store, iter: &parent, NULL, position: 1,
31 0, "Documents", -1);
32
33 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
34 0, "blaat.txt", -1);
35 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
36 0, "sliff.txt", -1);
37 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
38 0, "test.txt", -1);
39 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
40 0, "blaat.txt", -1);
41 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
42 0, "brrrr.txt", -1);
43 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
44 0, "hohoho.txt", -1);
45
46
47 gtk_tree_store_insert_with_values (tree_store: store, iter: &parent, NULL, position: 2,
48 0, "Images", -1);
49
50 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
51 0, "image1.png", -1);
52 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
53 0, "image2.png", -1);
54 gtk_tree_store_insert_with_values (tree_store: store, iter: &iter, parent: &parent, position: 0,
55 0, "image3.jpg", -1);
56
57 return GTK_TREE_MODEL (store);
58}
59
60static void
61set_color_func (GtkTreeViewColumn *column,
62 GtkCellRenderer *cell,
63 GtkTreeModel *model,
64 GtkTreeIter *iter,
65 gpointer data)
66{
67 if (gtk_tree_model_iter_has_child (tree_model: model, iter))
68 g_object_set (object: cell, first_property_name: "cell-background", "Grey", NULL);
69 else
70 g_object_set (object: cell, first_property_name: "cell-background", NULL, NULL);
71}
72
73static void
74tree_view_row_activated (GtkTreeView *tree_view,
75 GtkTreePath *path,
76 GtkTreeViewColumn *column)
77{
78 if (gtk_tree_path_get_depth (path) > 1)
79 return;
80
81 if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (tree_view), path))
82 gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree_view), path);
83 else
84 gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path, FALSE);
85}
86
87static gboolean
88tree_view_select_func (GtkTreeSelection *selection,
89 GtkTreeModel *model,
90 GtkTreePath *path,
91 gboolean path_currently_selected,
92 gpointer data)
93{
94 if (gtk_tree_path_get_depth (path) > 1)
95 return TRUE;
96
97 return FALSE;
98}
99
100static void
101quit_cb (GtkWidget *widget,
102 gpointer data)
103{
104 gboolean *done = data;
105
106 *done = TRUE;
107
108 g_main_context_wakeup (NULL);
109}
110
111int
112main (int argc, char **argv)
113{
114 GtkWidget *window, *sw, *tv;
115 GtkTreeModel *model;
116 GtkCellRenderer *renderer;
117 GtkTreeViewColumn *column;
118 gboolean done = FALSE;
119
120 gtk_init ();
121
122 model = create_model ();
123
124 window = gtk_window_new ();
125 g_signal_connect (window, "destroy", G_CALLBACK (quit_cb), &done);
126 gtk_window_set_default_size (GTK_WINDOW (window), width: 320, height: 480);
127
128 sw = gtk_scrolled_window_new ();
129 gtk_window_set_child (GTK_WINDOW (window), child: sw);
130
131 tv = gtk_tree_view_new_with_model (model);
132 gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child: tv);
133
134 g_signal_connect (tv, "row-activated",
135 G_CALLBACK (tree_view_row_activated), tv);
136 g_object_set (object: tv,
137 first_property_name: "show-expanders", FALSE,
138 "level-indentation", 10,
139 NULL);
140
141 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE);
142 gtk_tree_view_expand_all (GTK_TREE_VIEW (tv));
143
144 gtk_tree_selection_set_select_function (selection: gtk_tree_view_get_selection (GTK_TREE_VIEW (tv)),
145 func: tree_view_select_func,
146 NULL,
147 NULL);
148
149 renderer = gtk_cell_renderer_text_new ();
150 column = gtk_tree_view_column_new_with_attributes (title: "(none)",
151 cell: renderer,
152 "text", 0,
153 NULL);
154 gtk_tree_view_column_set_cell_data_func (tree_column: column,
155 cell_renderer: renderer,
156 func: set_color_func,
157 NULL,
158 NULL);
159 gtk_tree_view_insert_column (GTK_TREE_VIEW (tv), column, position: 0);
160
161 gtk_widget_show (widget: window);
162
163 while (!done)
164 g_main_context_iteration (NULL, TRUE);
165
166 return 0;
167}
168

source code of gtk/tests/testgrouping.c