]> git.mxchange.org Git - simgear.git/blob - simgear/props/PropertyBasedElement.hxx
cppbind.Ghost: clean up a bit
[simgear.git] / simgear / props / PropertyBasedElement.hxx
1 // Base class for elements of property controlled subsystems
2 //
3 // Copyright (C) 2012  Thomas Geymayer <tomgey@gmail.com>
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Library General Public
7 // License as published by the Free Software Foundation; either
8 // version 2 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 // Library General Public License for more details.
14 //
15 // You should have received a copy of the GNU Library General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
18
19 #ifndef SG_PROPERTY_BASED_ELEMENT_HXX_
20 #define SG_PROPERTY_BASED_ELEMENT_HXX_
21
22 #include <simgear/props/props.hxx>
23 #include <simgear/structure/SGWeakReferenced.hxx>
24
25 #include <boost/call_traits.hpp>
26
27 namespace simgear
28 {
29
30   /**
31    * Base class for a property controlled element
32    */
33   class PropertyBasedElement:
34     public SGPropertyChangeListener,
35     public SGWeakReferenced
36   {
37     public:
38       PropertyBasedElement(SGPropertyNode* node);
39       virtual ~PropertyBasedElement();
40
41       /**
42        * Remove the property listener of the element.
43        *
44        * You will need to call the appropriate methods (#childAdded,
45        * #childRemoved, #valueChanged) yourself to ensure the element still
46        * receives the needed events.
47        */
48       void removeListener();
49
50       /**
51        * Destroys this element (removes node from property tree)
52        */
53       void destroy();
54
55       virtual void update(double delta_time_sec) = 0;
56
57       SGConstPropertyNode_ptr getProps() const;
58       SGPropertyNode_ptr getProps();
59
60       template<class T>
61       void set( const std::string& name,
62                 typename boost::call_traits<T>::param_type val )
63       {
64         setValue(_node->getNode(name, true), val);
65       }
66
67       template<class T>
68       T get( const std::string& name,
69              typename boost::call_traits<T>::param_type def = T() )
70       {
71         SGPropertyNode const* child = _node->getNode(name);
72         if( !child )
73           return def;
74
75         return getValue<T>(child);
76       }
77
78       // Unshadow what we have just hidden...
79       using SGWeakReferenced::get;
80
81       virtual void onDestroy() {};
82
83     protected:
84
85       SGPropertyNode_ptr _node;
86
87   };
88
89   typedef SGSharedPtr<PropertyBasedElement> PropertyBasedElementPtr;
90   typedef SGWeakPtr<PropertyBasedElement> PropertyBasedElementWeakPtr;
91
92 } // namespace simgear
93
94 #endif /* SG_PROPERTY_BASED_ELEMENT_HXX_ */