1 #ifndef SIMGEAR_ATOMICCHANGELISTENER_HXX
2 #define SIMGEAR_ATOMICCHANGELISTENER_HXX 1
8 #include <boost/bind.hpp>
10 #include <simgear/structure/Singleton.hxx>
13 #include "ExtendedPropertyAdapter.hxx"
17 // Performs an action when one of several nodes changes
18 class MultiChangeListener : public SGPropertyChangeListener
21 MultiChangeListener();
22 template<typename Pitr>
23 void listenToProperties(Pitr propsBegin, Pitr propsEnd)
25 for (Pitr itr = propsBegin, end = propsEnd; itr != end; ++itr)
26 (*itr)->addChangeListener(this);
29 void valueChanged(SGPropertyNode* node);
30 virtual void valueChangedImplementation();
34 class AtomicChangeListener : public MultiChangeListener,
35 public virtual SGReferenced
38 AtomicChangeListener(std::vector<SGPropertyNode*>& nodes);
40 * Lookup / create child nodes from their relative names.
42 template<typename Itr>
43 AtomicChangeListener(SGPropertyNode* parent, Itr childNamesBegin,
45 : _dirty(false), _valid(true)
48 for (Itr itr = childNamesBegin, end = childNamesEnd;
51 _watched.push_back(makeNode(parent, *itr));
52 listenToProperties(_watched.begin(), _watched.end());
54 bool isDirty() { return _dirty; }
55 bool isValid() { return _valid; }
56 void unregister_property(SGPropertyNode* node);
57 static void fireChangeListeners();
59 virtual void valueChangedImplementation();
60 virtual void valuesChanged();
63 struct ListenerListSingleton : public Singleton<ListenerListSingleton>
65 std::vector<SGSharedPtr<AtomicChangeListener> > listeners;
68 std::vector<SGPropertyNode*> _watched;
71 template<typename T, typename Func>
72 class ExtendedPropListener : public AtomicChangeListener
75 ExtendedPropListener(std::vector<SGPropertyNode*>& nodes, const Func& func,
77 : AtomicChangeListener(nodes), _func(func)
83 template<typename Itr>
84 ExtendedPropListener(SGPropertyNode* parent, Itr childNamesBegin,
85 Itr childNamesEnd, const Func& func,
87 : AtomicChangeListener(parent, childNamesBegin, childNamesEnd),
93 virtual void valuesChanged()
95 ExtendedPropertyAdapter<T, std::vector<SGPropertyNode*> > adaptor(_watched);