rendered paste body
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<FileInfo> 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;
}
}