1 | #include <gtk/gtk.h> |
2 | |
3 | |
4 | static GtkTreeModel * |
5 | create_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 | |
60 | static void |
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 (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 | |
73 | static void |
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 |
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 |
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 |
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), 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 | |