From 8aa5947e7a2802542886c9ae498727a9d3b823e2 Mon Sep 17 00:00:00 2001 From: mfranz <mfranz> Date: Thu, 24 Aug 2006 16:32:09 +0000 Subject: [PATCH] - move bo105's Dialog class here; replaces gui.loadXMLDialog() - fix indentation --- Nasal/gui.nas | 105 +++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/Nasal/gui.nas b/Nasal/gui.nas index 8dd829781..3151dbaad 100644 --- a/Nasal/gui.nas +++ b/Nasal/gui.nas @@ -144,65 +144,92 @@ Widget = { }; + ## -# load XML dialog -# node ... target node (name must be "dialog") +# Dialog class. Maintains one XML dialog. +# prop ... target node (name must be "dialog") # path ... file path relative to $FG_ROOT # -# return value: -# target node on success, nil otherwise -# # Example: # -# var dlg = props.globals.getNode("/sim/gui/dialogs/foo-config/dialog", 1); -# loadXMLDialog(dlg, "Aircraft/foo/foo_config.xml"); -# fgcommand("dialog-show", dlg); +# var dlg = gui.Dialog.new("/sim/gui/dialogs/foo-config/dialog", +# "Aircraft/foo/foo_config.xml"); +# dlg.open(); +# dlg.close(); # -loadXMLDialog = func(node, path) { - if (node.getName() != "dialog") { - print("loadXMLDialog: node name must be 'dialog'"); - return nil; - } - fgcommand("loadxml", props.Node.new({"filename": path, "targetnode": node.getPath()})); - var name = node.getNode("name"); - if (name == nil) { - print("loadXMLDialog: XML dialog must have <name>"); - return nil; - } - node.getNode("dialog-name", 1).setValue(name.getValue()); - fgcommand("dialog-new", node); - node; -} +Dialog = { + new : func(prop, path) { + var m = { parents : [Dialog] }; + m.path = path; + m.prop = isa(props.Node, prop) ? prop : props.globals.getNode(prop, 1); + m.state = 0; + m.loaded = 0; + return m; + }, + # doesn't need to be called explicitly, but can be used to force a reload + load : func { + if (me.prop.getName() != "dialog") { + die("Dialog class: node name must be 'dialog'"); + } + fgcommand("loadxml", props.Node.new({"filename": me.path, + "targetnode": me.prop.getPath()})); + var name = me.prop.getNode("name"); + if (name == nil) { + die("Dialog class: XML dialog must have <name>"); + } + me.prop.getNode("dialog-name", 1).setValue(name.getValue()); + fgcommand("dialog-new", me.prop); + me.loaded = 1; + }, + open : func { + if (!me.loaded) { + me.load(me.prop, me.path); + } + fgcommand("dialog-show", me.prop); + me.state = 1; + }, + close : func { + fgcommand("dialog-close", me.prop); + me.state = 0; + }, + toggle : func { + me.state ? me.close() : me.open(); + }, + is_open : func { + me.state; + }, +}; + ## # Open property browser with given target path. # property_browser = func(dir = "/") { - var dlgname = "property-browser"; - foreach (var module; keys(globals)) { - if (find("__dlg:" ~ dlgname, module) >= 0) { - globals[module].clone(dir); - return; - } - } - setprop("/sim/gui/dialogs/" ~ dlgname ~ "/last", dir); - fgcommand("dialog-show", props.Node.new({"dialog-name": dlgname})); + var dlgname = "property-browser"; + foreach (var module; keys(globals)) { + if (find("__dlg:" ~ dlgname, module) >= 0) { + return globals[module].clone(dir); + } + } + setprop("/sim/gui/dialogs/" ~ dlgname ~ "/last", dir); + fgcommand("dialog-show", props.Node.new({"dialog-name": dlgname})); } + ## # Open one property browser per /browser[] property, where each contains # the target path. On the command line use --prop:browser=orientation # settimer(func { - foreach (var b; props.globals.getChildren("browser")) { - var path = b.getValue(); - if (path != nil and size(path)) { - property_browser(path); - } - } - props.globals.removeChildren("browser"); + foreach (var b; props.globals.getChildren("browser")) { + var path = b.getValue(); + if (path != nil and size(path)) { + property_browser(path); + } + } + props.globals.removeChildren("browser"); }, 0);