]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/PropertyBasedMgr.cxx
Fixed a crash: the singleton needs to be instantiated the first time SGCommandMgr...
[simgear.git] / simgear / props / PropertyBasedMgr.cxx
index 397aa2b6223a94ad81d78c38f4dd7eb382ed70e4..621d11db67efd2401ad43c049d22e59505917261 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "PropertyBasedMgr.hxx"
 
+#include <boost/foreach.hpp>
+
 #include <stdexcept>
 #include <string>
 
@@ -45,6 +47,63 @@ namespace simgear
         _elements[i]->update(delta_time_sec);
   }
 
+  //----------------------------------------------------------------------------
+  PropertyBasedElementPtr
+  PropertyBasedMgr::createElement(const std::string& name)
+  {
+    SGPropertyNode* node = _props->addChild(_name_elements, 0, false);
+    if( !name.empty() )
+      node->setStringValue("name", name);
+
+    return getElement( node->getIndex() );
+  }
+
+  //----------------------------------------------------------------------------
+  PropertyBasedElementPtr PropertyBasedMgr::getElement(size_t index) const
+  {
+    if( index >= _elements.size() )
+      return PropertyBasedElementPtr();
+
+    return _elements[index];
+  }
+
+  //----------------------------------------------------------------------------
+  PropertyBasedElementPtr
+  PropertyBasedMgr::getElement(const std::string& name) const
+  {
+    if( name.empty() )
+      return PropertyBasedElementPtr();
+
+    BOOST_FOREACH(PropertyBasedElementPtr el, _elements)
+      if( el->getProps()->getStringValue("name") == name )
+        return el;
+
+    return PropertyBasedElementPtr();
+  }
+
+  //----------------------------------------------------------------------------
+  const SGPropertyNode* PropertyBasedMgr::getPropertyRoot() const
+  {
+    return _props;
+  }
+
+  //----------------------------------------------------------------------------
+  PropertyBasedMgr::PropertyBasedMgr( SGPropertyNode_ptr props,
+                                      const std::string& name_elements,
+                                      ElementFactory element_factory ):
+    _props( props ),
+    _name_elements( name_elements ),
+    _element_factory( element_factory )
+  {
+
+  }
+
+  //----------------------------------------------------------------------------
+  PropertyBasedMgr::~PropertyBasedMgr()
+  {
+
+  }
+
   //----------------------------------------------------------------------------
   void PropertyBasedMgr::childAdded( SGPropertyNode * parent,
                                      SGPropertyNode * child )
@@ -67,6 +126,7 @@ namespace simgear
       _elements.resize(index + 1);
     }
     else if( _elements[index] )
+    {
       SG_LOG
       (
         SG_GENERAL,
@@ -74,6 +134,10 @@ namespace simgear
         _name_elements << "[" << index << "] already exists!"
       );
 
+      // Give anything holding a reference to this element to release it
+      _elements[index]->onDestroy();
+    }
+
     PropertyBasedElementPtr el = _element_factory(child);
     el->setSelf( el );
     _elements[index] = el;
@@ -99,31 +163,11 @@ namespace simgear
         "can't removed unknown " << _name_elements << "[" << index << "]!"
       );
     else
+    {
       // remove the element...
+      _elements[index]->onDestroy();
       _elements[index].reset();
-  }
-
-  //----------------------------------------------------------------------------
-  const SGPropertyNode* PropertyBasedMgr::getPropertyRoot() const
-  {
-    return _props;
-  }
-
-  //----------------------------------------------------------------------------
-  PropertyBasedMgr::PropertyBasedMgr( SGPropertyNode_ptr props,
-                                      const std::string& name_elements,
-                                      ElementFactory element_factory ):
-    _props( props ),
-    _name_elements( name_elements ),
-    _element_factory( element_factory )
-  {
-
-  }
-
-  //----------------------------------------------------------------------------
-  PropertyBasedMgr::~PropertyBasedMgr()
-  {
-
+    }
   }
 
 } // namespace simgear