file-selectfile-selectvbox450hbox/sim/gui/dialogs/file-select/title11listfill350/sim/gui/dialogs/file-select/selectiondialog-applylistnasalhboxinput230/sim/gui/dialogs/file-select/selection1dialog-applyinputnasal
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);