/* see if it's possilbe to build a file tree ... */ // init the window. var w = new Gtk.Window(Gtk.WindowType.ROOT); w.connect("delete-event", function() { println("Done?"); Gtk.exit(1); }); w.setTitle("hello world"); var store = new Gtk.TreeStore([G.Type.STRING, "Dobject"]); //var store = new Gtk.TreeStore("gchararray", "Dobject"); // add the root element.. var iter = new Gtk.TreeIter(); store.append(iter); store.set(iter, 0, "root"); store.set(iter, 1, { directory: "/" }); // add a loading indicator.. var child = new Gtk.TreeIter(); store.append(child, iter); store.set(child, 0, "Loading..."); store.set(child, 1, { loading: true }); function addDir(parentIter, name) { // need File.Path! var pdir = ""; if (parentIter) { // we need to find out the path. pdir = iterToRow( parentIter)[1].directory; } var iter = new Gtk.TreeIter(); store.append(iter,parentIter); // fixme - how does append handle null here!!! store.set(iter, 0, name); store.set(iter, 1, {directory: pdir + name + "/" }); // add the loading .... var child = new Gtk.TreeIter(); store.append(child, iter); store.set(child, 0, "Loading..."); store.set(child, 1, { loading: true }); } // set up the tree... var view = new Gtk.TreeView(); view.setHeadersVisible(false); var renderer = new Gtk.CellRendererText (); var col = new Gtk.TreeViewColumn(); //col.setTitle("Name"); col.packStart(renderer, true); col.addAttribute(renderer, "text", 0); view.insertColumn( col, -1); function iterToRow(iter) { var c1 = new G.Value(); var c2 = new G.Value(); store.getValue(iter, 0, c1); store.getValue(iter, 1, c2); println("about to Ret iterToRow"); println("about to Ret iterToRow" + c1.getString()); var x = c2.getBoxed(); println("got x" ); println("about to Ret iterToRow" + typeof(x)); return [c1.getString() ,c2.getBoxed()]; } println("adding store?"); view.setModel ( store ); view.connect("row-expanded", function(view, iter, path) { var row = iterToRow( iter); println(row.toSource()); var n = store.iterNChildren(iter); println("got " + n + " children"); if (!n) { // empty!!!.? return; } var citer = new Gtk.TreeIter(); var haveFiles = {} for (var i =0 ; i < n; i++) { println("get " + i); store.iterNthChild(citer, iter, i); var nam = iterToRow(citer)[0] println("got " + nam); haveFiles[nam] = true; } // now do a directory scan of the selected folder. println("add new"); println(haveFiles.toSource()); var files = File.listdir(row[1].directory); println(files.toSource()); for(var i = 0; i < files.length; i++ ) { // check if already in there.. // FIXME // append it.. if (haveFiles.hasOwnProperty(files[i])) { haveFiles[files[i]] = false; continue; } var fname = row[1].directory + files[i]; println("checking " + fname + " isDir?"); if (File.isDir(fname)) { addDir(iter, files[i]); } } store.iterChildren(citer, iter); // get first row.. var crow = iterToRow(citer)[1]; if (crow.hasOwnProperty("loading")) { println("trying to remove"); store.remove(citer); } // build a list of files currently in tree. println("build existing"); // remove the 'loading child nodes'; }); println("add view?"); w.add(view); w.showAll(); Gtk.main();