]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/PropertyBasedElement.hxx
Fixed a crash: the singleton needs to be instantiated the first time SGCommandMgr...
[simgear.git] / simgear / props / PropertyBasedElement.hxx
index 23558e7090fc0e93a935631e71f32e2d6eeae1da..b2ccd30b74fd0c3f1802bb8b1ac647dfe62a6f58 100644 (file)
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 // Library General Public License for more details.
 //
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
 
 #ifndef SG_PROPERTY_BASED_ELEMENT_HXX_
 #define SG_PROPERTY_BASED_ELEMENT_HXX_
 
 #include <simgear/props/props.hxx>
 
+#include <boost/call_traits.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/weak_ptr.hpp>
 
@@ -42,14 +43,47 @@ namespace simgear
       PropertyBasedElement(SGPropertyNode* node);
       virtual ~PropertyBasedElement();
 
+      /**
+       * Remove the property listener of the element.
+       *
+       * You will need to call the appropriate methods (#childAdded,
+       * #childRemoved, #valueChanged) yourself to ensure the element still
+       * receives the needed events.
+       */
+      void removeListener();
+
+      /**
+       * Destroys this element (removes node from property tree)
+       */
+      void destroy();
+
       virtual void update(double delta_time_sec) = 0;
 
       SGConstPropertyNode_ptr getProps() const;
       SGPropertyNode_ptr getProps();
 
-    protected:
+      template<class T>
+      void set( const std::string& name,
+                typename boost::call_traits<T>::param_type val )
+      {
+        setValue(_node->getNode(name, true), val);
+      }
+
+      template<class T>
+      T get( const std::string& name,
+             typename boost::call_traits<T>::param_type def = T() )
+      {
+        SGPropertyNode const* child = _node->getNode(name);
+        if( !child )
+          return def;
 
-      friend class PropertyBasedMgr;
+        return getValue<T>(child);
+      }
+
+      virtual void setSelf(const PropertyBasedElementPtr& self);
+      virtual void onDestroy() {};
+
+    protected:
 
       SGPropertyNode_ptr _node;
       PropertyBasedElementWeakPtr _self;