using GLib; using Gtk; public class DirectoryWindow : Window { ListStore store; TreeView view; File current_directory; public DirectoryWindow () { } construct { store = new ListStore (1, typeof (string)); store.set_sort_column_id (0, SortType.ASCENDING); var scrolled = new ScrolledWindow (null, null); add (scrolled); view = new TreeView.with_model (store); scrolled.add (view); var renderer = new CellRendererText (); var col = new TreeViewColumn (); col.pack_start (renderer, true); col.add_attribute (renderer, "text", 0); view.append_column (col); view.row_activated += file_activated; current_directory = File.get_for_path ("/"); update_model (); } void file_activated (TreeView view, TreePath path, TreeViewColumn column) { string filename; TreeIter iter; store.get_iter (out iter, path); store.get (ref iter, 0, out filename, -1); if (filename.has_suffix ("/")) { current_directory = current_directory.resolve_relative (filename); update_model (); } } void update_model () { store.clear (); FileEnumerator en = current_directory.enumerate_children ("std:name", (FileGetInfoFlags) 0, null, null); en.next_files_async (100, Priority.DEFAULT, on_next_files, this, null); } static void on_next_files (FileEnumerator enumerator, List files, int num_files, pointer user_data, Error error) { var win = (DirectoryWindow) user_data; if (error != null || num_files == 0) { return; } foreach (FileInfo info in files) { if ((info.get_flags () & FileFlags.HIDDEN) == FileFlags.HIDDEN) { continue; } string filename = info.get_name (); if (info.get_file_type () == FileType.DIRECTORY) { filename += "/"; } TreeIter iter; win.store.append (out iter); win.store.set (ref iter, 0, filename, -1); } enumerator.next_files_async (10, Priority.DEFAULT, on_next_files, win, null); } static int main (string[] args) { Gtk.init (out args); var win = new DirectoryWindow (); win.show_all (); Gtk.main (); return 0; } }