file-select file-select vbox 450 hbox /sim/gui/dialogs/file-select/title 1 1 list fill 350 /sim/gui/dialogs/file-select/selection dialog-apply list nasal hbox input 230 /sim/gui/dialogs/file-select/selection 1 dialog-apply input nasal var self = cmdarg(); var list = self.getNode("list"); var dlgname = self.getNode("name").getValue(); self.getNode("group/text/property").setValue("/sim/gui/dialogs/" ~ dlgname ~ "/title"); self.getNode("list/property").setValue("/sim/gui/dialogs/" ~ dlgname ~ "/selection"); self.getNode("group[1]/input/property").setValue("/sim/gui/dialogs/" ~ dlgname ~ "/selection"); var dlg = props.globals.getNode("/sim/gui/dialogs/" ~ dlgname, 1); var selection = dlg.getNode("selection", 1); var operation = dlg.getNode("operation", 1); var title = dlg.getNode("title", 1); var dir = dlg.getNode("directory", 1); var file = dlg.getNode("file", 1); var path = dlg.getNode("path", 1); var show_hidden = dlg.getNode("show-hidden", 1); show_hidden.setBoolValue(show_hidden.getValue()); var kbdctrl = props.globals.getNode("/devices/status/keyboard/ctrl", 1); var kbdshift = props.globals.getNode("/devices/status/keyboard/shift", 1); var current = { dir : "", file : "" }; var squeeze = func(s, n) { return n >= size(s) ? s : "... " ~ substr(s, size(s) - n); } var update = func(d) { var entries = directory(d); if (entries == nil) # dir doesn't exist or no permissions return 0; var files = []; var dirs = []; var hide = !show_hidden.getValue(); foreach (var e; entries) { if (e == ".") { append(dirs, e); continue; } if (e == "..") { if (d != "/") append(dirs, e); continue; } if (hide and e[0] == `.`) continue; var stat = io.stat(d ~ "/" ~ e); if (stat == nil) # dead link continue; if (io.isdir(stat[2])) append(dirs, e ~ "/"); else append(files, e); } list.removeChildren("value"); var entries = sort(dirs, cmp) ~ sort(files, cmp); forindex (var i; entries) list.getChild("value", i, 1).setValue(entries[i]); dir.setValue(d); title.setValue(squeeze(d, 45)); return 1; } var select = func { var e = selection.getValue(); current.file = ""; var new = nil; if (e == ".") { new = current.dir; if (kbdctrl.getValue()) show_hidden.setBoolValue(!show_hidden.getValue()); } elsif (e == "..") { if (kbdctrl.getValue()) new = getprop("/sim/fg-root"); elsif (kbdshift.getValue()) new = getprop("/sim/fg-home"); else new = current.dir ~ "/.."; } elsif (e[size(e) - 1] == `/`) { new = current.dir ~ "/" ~ e; } else { current.file = e; gui.dialog_update(dlgname, "input"); } if (new != nil) { var p = io.fixpath(new); if (update(p)) current.dir = p; selection.setValue(""); gui.dialog_update(dlgname, "list", "input"); } } var input = func { current.file = selection.getValue(); } var close = func { var err = []; call(func { gui.Dialog.instance[dlgname].close() }, nil, err); } var ok = func { input(); var p = io.fixpath(current.dir ~ "/" ~ current.file); var stat = io.stat(p); if (stat == nil) return; path.setValue(io.isdir(stat[2]) ? p ~ "/" : p); file.setValue(current.file); close(); } var op = operation.getValue(); if (op == nil or op == "") op = "OK"; self.getNode("group[1]/button/legend").setValue(op); current.dir = (var d = dir.getValue()) != nil and d != "" ? d : getprop("/sim/fg-root"); current.file = (var d = file.getValue()) != nil and d != "" ? d : ""; gui.dialog_update(dlgname, "input"); update(io.fixpath(current.dir)); title.setValue(current.dir);