2 * This file is a part of hildon
4 * Copyright (C) 2007 Nokia Corporation, all rights reserved.
6 * Contact: Michael Dominic Kostrzewa <michael.kostrzewa@nokia.com>
7 * Author: Xan Lopez <xan.lopez@nokia.com>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; version 2.1 of
12 * the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 #include <sys/types.h>
47 populate_store (GtkListStore *store,
54 struct stat stat_info;
55 GdkPixbuf *pixbuf = NULL;
58 dir = g_dir_open (path, 0, &error);
61 g_debug ("Error populating store: %s", error->message);
66 /* Dummy widget for gtk_widget_render_icon */
67 dummy = gtk_label_new ("");
69 while ((item = (gchar*)g_dir_read_name (dir)) != NULL)
71 gchar *file_path = g_strconcat (path, "/", item, NULL);
73 if (stat (file_path, &stat_info) == -1)
75 g_debug ("error retrieving stat info for %s", item);
80 gtk_list_store_append (store, &iter);
82 if (S_ISDIR (stat_info.st_mode))
84 pixbuf = gtk_widget_render_icon (dummy, GTK_STOCK_DIRECTORY,
85 GTK_ICON_SIZE_BUTTON, NULL);
89 pixbuf = gtk_widget_render_icon (dummy, GTK_STOCK_FILE,
90 GTK_ICON_SIZE_BUTTON, NULL);
93 gtk_list_store_set (store, &iter,
96 IS_DIR_COL, S_ISDIR (stat_info.st_mode) ? TRUE : FALSE,
99 g_object_unref (pixbuf);
104 gtk_widget_destroy (dummy);
110 free_id (gpointer data)
112 g_debug ("Freeing ID data");
117 row_activated_cb (GtkTreeView *treeview,
119 GtkTreeViewColumn *column,
120 HildonBreadCrumbTrail *bct)
122 gchar *text = NULL, *new_root;
127 model = gtk_tree_view_get_model (treeview);
128 gtk_tree_model_get_iter (model, &iter, path);
129 gtk_tree_model_get (model, &iter,
134 if (is_dir == FALSE) goto out;
136 g_debug ("Clicked treeview row%s", text);
138 new_root = g_strconcat (g_str_equal (current_root, "/")? "" : current_root, "/", text, NULL);
139 gtk_list_store_clear (GTK_LIST_STORE (model));
140 populate_store (GTK_LIST_STORE (model), new_root);
142 if (g_str_equal (current_root, "/home"))
146 image = gtk_image_new_from_stock (GTK_STOCK_HOME, GTK_ICON_SIZE_BUTTON);
147 hildon_bread_crumb_trail_push_icon (bct, text, image, new_root, (GDestroyNotify)free_id);
151 g_debug ("Adding %s, new root %s", text, new_root);
152 hildon_bread_crumb_trail_push_text (bct, text, new_root, (GDestroyNotify)free_id);
157 g_free (current_root);
160 current_root = g_strdup (new_root);
167 crumb_clicked_cb (HildonBreadCrumbTrail *bct, gpointer id)
170 gchar *text = (gchar*)id;
172 g_debug ("bread crumb item %s clicked", text);
173 model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
174 gtk_list_store_clear (GTK_LIST_STORE (model));
175 populate_store (GTK_LIST_STORE (model), text);
177 g_free (current_root);
178 current_root = g_strdup (text);
184 clear_cb (GtkWidget *button, GtkWidget *bct)
186 hildon_bread_crumb_trail_clear (HILDON_BREAD_CRUMB_TRAIL (bct));
190 sort_iter_compare_func (GtkTreeModel *model,
195 gint sortcol = GPOINTER_TO_INT (userdata);
200 case SORTID_DIRALPHA:
202 gboolean is_dir_a, is_dir_b;
203 gchar *string_a, *string_b;
205 gtk_tree_model_get (model, a, IS_DIR_COL, &is_dir_a,
206 STRING_COL, &string_a, -1);
207 gtk_tree_model_get (model, b, IS_DIR_COL, &is_dir_b,
208 STRING_COL, &string_b, -1);
210 if (is_dir_a != is_dir_b)
212 /* One is a directory, the other isn't */
213 ret = (is_dir_a == TRUE) ? -1 : 1;
217 /* Same type, alphabetical sort */
218 ret = g_utf8_collate (string_a, string_b);
233 int main (int argc, char **argv)
236 HildonProgram *program;
239 GtkWidget *window, *scrolled_window, *vbox, *bct, *button;
240 GtkCellRenderer *renderer;
241 GtkTreeViewColumn *column;
243 hildon_gtk_init (&argc, &argv);
247 program = hildon_program_get_instance ();
248 window = hildon_window_new ();
249 hildon_program_add_window (program, HILDON_WINDOW (window));
251 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
253 gtk_container_set_border_width (GTK_CONTAINER (window), 2);
254 gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
255 g_signal_connect (window, "delete-event", gtk_main_quit, NULL);
257 vbox = gtk_vbox_new (FALSE, 3);
258 gtk_container_add (GTK_CONTAINER (window), vbox);
259 gtk_widget_show (vbox);
261 current_root = g_strdup ("/");
263 bct = hildon_bread_crumb_trail_new ();
264 g_signal_connect (bct, "crumb-clicked", G_CALLBACK (crumb_clicked_cb), NULL);
265 gtk_box_pack_start (GTK_BOX (vbox), bct, FALSE, FALSE, 0);
266 gtk_widget_show (bct);
268 hildon_bread_crumb_trail_push_text (HILDON_BREAD_CRUMB_TRAIL (bct), "/",
269 g_strdup ("/"), (GDestroyNotify)free_id);
272 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
273 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
274 GTK_POLICY_AUTOMATIC,
275 GTK_POLICY_AUTOMATIC);
276 store = gtk_list_store_new (N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN);
277 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (store),
279 sort_iter_compare_func,
280 GINT_TO_POINTER (SORTID_DIRALPHA),
282 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
286 populate_store (store, "/");
287 treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
288 g_signal_connect (treeview, "row-activated", G_CALLBACK (row_activated_cb), bct);
290 renderer = gtk_cell_renderer_pixbuf_new ();
291 column = gtk_tree_view_column_new_with_attributes ("Icon",
295 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
297 renderer = gtk_cell_renderer_text_new ();
298 column = gtk_tree_view_column_new_with_attributes ("Name",
302 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
304 gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
305 gtk_widget_show (treeview);
306 gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
307 gtk_widget_show (scrolled_window);
309 button = gtk_button_new_with_label ("Clear!");
310 g_signal_connect (G_OBJECT (button), "clicked",
311 G_CALLBACK (clear_cb), bct);
312 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
313 gtk_widget_show (button);
315 gtk_widget_show (window);