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 sort_iter_compare_func (GtkTreeModel *model,
189 gint sortcol = GPOINTER_TO_INT (userdata);
194 case SORTID_DIRALPHA:
196 gboolean is_dir_a, is_dir_b;
197 gchar *string_a, *string_b;
199 gtk_tree_model_get (model, a, IS_DIR_COL, &is_dir_a,
200 STRING_COL, &string_a, -1);
201 gtk_tree_model_get (model, b, IS_DIR_COL, &is_dir_b,
202 STRING_COL, &string_b, -1);
204 if (is_dir_a != is_dir_b)
206 /* One is a directory, the other isn't */
207 ret = (is_dir_a == TRUE) ? -1 : 1;
211 /* Same type, alphabetical sort */
212 ret = g_utf8_collate (string_a, string_b);
227 int main (int argc, char **argv)
230 HildonProgram *program;
233 GtkWidget *window, *scrolled_window, *vbox, *bct;
234 GtkCellRenderer *renderer;
235 GtkTreeViewColumn *column;
237 gtk_init (&argc, &argv);
241 program = hildon_program_get_instance ();
242 window = hildon_window_new ();
243 hildon_program_add_window (program, HILDON_WINDOW (window));
245 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
247 gtk_container_set_border_width (GTK_CONTAINER (window), 2);
248 gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
249 g_signal_connect (window, "delete-event", gtk_main_quit, NULL);
251 vbox = gtk_vbox_new (FALSE, 3);
252 gtk_container_add (GTK_CONTAINER (window), vbox);
253 gtk_widget_show (vbox);
255 current_root = g_strdup ("/");
257 bct = hildon_bread_crumb_trail_new ();
258 g_signal_connect (bct, "crumb-clicked", G_CALLBACK (crumb_clicked_cb), NULL);
259 gtk_box_pack_start (GTK_BOX (vbox), bct, FALSE, FALSE, 0);
260 gtk_widget_show (bct);
262 hildon_bread_crumb_trail_push_text (HILDON_BREAD_CRUMB_TRAIL (bct), "/",
263 g_strdup ("/"), (GDestroyNotify)free_id);
266 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
267 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
268 GTK_POLICY_AUTOMATIC,
269 GTK_POLICY_AUTOMATIC);
270 store = gtk_list_store_new (N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN);
271 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (store),
273 sort_iter_compare_func,
274 GINT_TO_POINTER (SORTID_DIRALPHA),
276 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
280 populate_store (store, "/");
281 treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
282 g_signal_connect (treeview, "row-activated", G_CALLBACK (row_activated_cb), bct);
284 renderer = gtk_cell_renderer_pixbuf_new ();
285 column = gtk_tree_view_column_new_with_attributes ("Icon",
289 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
291 renderer = gtk_cell_renderer_text_new ();
292 column = gtk_tree_view_column_new_with_attributes ("Name",
296 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
298 gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
299 gtk_widget_show (treeview);
300 gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
301 gtk_widget_show (scrolled_window);
303 gtk_widget_show (window);