X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalSys.cxx;h=2690bda6dda8139f635093602909317f8dbb3e5f;hb=2bdaebb7d948de52b3e32b1d12224491c0361621;hp=158d852e5bc7ef2d824189fd99ddf6df54489e40;hpb=70a525d47c6a8d486e9ba71eeaad883f2dbf5a54;p=flightgear.git diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 158d852e5..2690bda6d 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -38,6 +38,31 @@ static FGNasalSys* nasalSys = 0; +// Listener class for loading Nasal modules on demand +class FGNasalModuleListener : public SGPropertyChangeListener +{ +public: + FGNasalModuleListener(SGPropertyNode* node); + + virtual void valueChanged(SGPropertyNode* node); + +private: + SGPropertyNode_ptr _node; +}; + +FGNasalModuleListener::FGNasalModuleListener(SGPropertyNode* node) : _node(node) +{ +} + +void FGNasalModuleListener::valueChanged(SGPropertyNode*) +{ + if (_node->getBoolValue("enabled",false)&& + !_node->getBoolValue("loaded",true)) + { + nasalSys->loadPropertyScripts(_node); + } +} + // Read and return file contents in a single buffer. Note use of // stat() to get the file size. This is a win32 function, believe it @@ -190,7 +215,7 @@ static naRef f_getprop(naContext c, naRef me, int argc, naRef* args) double dv = p->getDoubleValue(); if (osg::isNaN(dv)) { SG_LOG(SG_GENERAL, SG_ALERT, "Nasal getprop: property " << p->getPath() << " is NaN"); - naRuntimeError(c, "getprop() would have read NaN"); + return naNil(); } return naNum(dv); @@ -737,12 +762,15 @@ void FGNasalSys::init() // Now load the various source files in the Nasal directory simgear::Dir nasalDir(SGPath(globals->get_fg_root(), "Nasal")); - simgear::PathList scripts = nasalDir.children(simgear::Dir::TYPE_FILE, ".nas"); - - for (unsigned int i=0; i0) + { + SGPropertyNode* nasal = globals->get_props()->getNode("nasal"); + SGPropertyNode* module_node = nasal->getChild(moduleName,0,true); + for (unsigned int i=0; igetChild("file",i,true); + pFileNode->setStringValue(scripts[i].c_str()); + } + if (!module_node->hasChild("enabled",0)) + { + SGPropertyNode* node = module_node->getChild("enabled",0,true); + node->setBoolValue(true); + node->setAttribute(SGPropertyNode::USERARCHIVE,true); + } + } +} + // Loads the scripts found under /nasal in the global tree void FGNasalSys::loadPropertyScripts() { SGPropertyNode* nasal = globals->get_props()->getNode("nasal"); if(!nasal) return; - for(int i=0; inChildren(); i++) { + for(int i=0; inChildren(); i++) + { SGPropertyNode* n = nasal->getChild(i); + loadPropertyScripts(n); + } +} - const char* module = n->getName(); - if(n->hasChild("module")) - module = n->getStringValue("module"); +// Loads the scripts found under /nasal in the global tree +void FGNasalSys::loadPropertyScripts(SGPropertyNode* n) +{ + bool is_loaded = false; + const char* module = n->getName(); + if(n->hasChild("module")) + module = n->getStringValue("module"); + if (n->getBoolValue("enabled",true)) + { // allow multiple files to be specified within a single // Nasal module tag int j = 0; SGPropertyNode *fn; bool file_specified = false; + bool ok=true; while((fn = n->getChild("file", j)) != NULL) { file_specified = true; const char* file = fn->getStringValue(); - SGPath p = globals->resolve_maybe_aircraft_path(file); - loadModule(p, module); + SGPath p(file); + if (!p.isAbsolute() || !p.exists()) + { + p = globals->resolve_maybe_aircraft_path(file); + } + ok &= loadModule(p, module); j++; } @@ -809,10 +892,30 @@ void FGNasalSys::loadPropertyScripts() createModule(module, n->getPath().c_str(), src, strlen(src)); if(!file_specified && !src) + { + // module no longer exists - clear the archived "enable" flag + n->setAttribute(SGPropertyNode::USERARCHIVE,false); + SGPropertyNode* node = n->getChild("enabled",0,false); + if (node) + node->setAttribute(SGPropertyNode::USERARCHIVE,false); + SG_LOG(SG_NASAL, SG_ALERT, "Nasal error: " << - "no or