All pastes #710568 Raw Edit

Something

public text v1 · immutable
#710568 ·published 2007-09-25 16:53 UTC
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;
	}
}