1 #include <gtk/gtk.h>
2 
3 
4 static GtkTreeModel *
create_model(void)5 create_model (void)
6 {
7   GtkTreeStore *store;
8   GtkTreeIter iter;
9   GtkTreeIter parent;
10 
11   store = gtk_tree_store_new (1, G_TYPE_STRING);
12 
13   gtk_tree_store_insert_with_values (store, &parent, NULL, 0,
14 				     0, "Applications", -1);
15 
16   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
17 				     0, "File Manager", -1);
18   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
19 				     0, "Gossip", -1);
20   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
21 				     0, "System Settings", -1);
22   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
23 				     0, "The GIMP", -1);
24   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
25 				     0, "Terminal", -1);
26   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
27 				     0, "Word Processor", -1);
28 
29 
30   gtk_tree_store_insert_with_values (store, &parent, NULL, 1,
31 				     0, "Documents", -1);
32 
33   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
34 				     0, "blaat.txt", -1);
35   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
36 				     0, "sliff.txt", -1);
37   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
38 				     0, "test.txt", -1);
39   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
40 				     0, "blaat.txt", -1);
41   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
42 				     0, "brrrr.txt", -1);
43   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
44 				     0, "hohoho.txt", -1);
45 
46 
47   gtk_tree_store_insert_with_values (store, &parent, NULL, 2,
48 				     0, "Images", -1);
49 
50   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
51 				     0, "image1.png", -1);
52   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
53 				     0, "image2.png", -1);
54   gtk_tree_store_insert_with_values (store, &iter, &parent, 0,
55 				     0, "image3.jpg", -1);
56 
57   return GTK_TREE_MODEL (store);
58 }
59 
60 static void
set_color_func(GtkTreeViewColumn * column,GtkCellRenderer * cell,GtkTreeModel * model,GtkTreeIter * iter,gpointer data)61 set_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 (model, iter))
68     g_object_set (cell, "cell-background", "Grey", NULL);
69   else
70     g_object_set (cell, "cell-background", NULL, NULL);
71 }
72 
73 static void
tree_view_row_activated(GtkTreeView * tree_view,GtkTreePath * path,GtkTreeViewColumn * column)74 tree_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 
87 static gboolean
tree_view_select_func(GtkTreeSelection * selection,GtkTreeModel * model,GtkTreePath * path,gboolean path_currently_selected,gpointer data)88 tree_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 
100 static void
quit_cb(GtkWidget * widget,gpointer data)101 quit_cb (GtkWidget *widget,
102          gpointer   data)
103 {
104   gboolean *done = data;
105 
106   *done = TRUE;
107 
108   g_main_context_wakeup (NULL);
109 }
110 
111 int
main(int argc,char ** argv)112 main (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), 320, 480);
127 
128   sw = gtk_scrolled_window_new ();
129   gtk_window_set_child (GTK_WINDOW (window), sw);
130 
131   tv = gtk_tree_view_new_with_model (model);
132   gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv);
133 
134   g_signal_connect (tv, "row-activated",
135 		    G_CALLBACK (tree_view_row_activated), tv);
136   g_object_set (tv,
137 		"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 (gtk_tree_view_get_selection (GTK_TREE_VIEW (tv)),
145 					  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 ("(none)",
151 						     renderer,
152 						     "text", 0,
153 						     NULL);
154   gtk_tree_view_column_set_cell_data_func (column,
155 					   renderer,
156 					   set_color_func,
157 					   NULL,
158 					   NULL);
159   gtk_tree_view_insert_column (GTK_TREE_VIEW (tv), column, 0);
160 
161   gtk_widget_show (window);
162 
163   while (!done)
164     g_main_context_iteration (NULL, TRUE);
165 
166   return 0;
167 }
168