diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 72a99bc93..62a2b261c 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 @@ -817,56 +842,73 @@ 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); - 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; - while((fn = n->getChild("file", j)) != NULL) { - file_specified = true; - const char* file = fn->getStringValue(); - SGPath p(file); - if (!p.isAbsolute() || !p.exists()) - { - p = globals->resolve_maybe_aircraft_path(file); - } - loadModule(p, module); - j++; - } - - const char* src = n->getStringValue("script"); - if(!n->hasChild("script")) src = 0; // Hrm... - if(src) - 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