]> git.mxchange.org Git - simgear.git/blob - simgear/props/AtomicChangeListener.cxx
Effects in models working for transparent materials and chrome animation
[simgear.git] / simgear / props / AtomicChangeListener.cxx
1 #include "AtomicChangeListener.hxx"
2
3 #include <algorithm>
4 #include <iterator>
5 #include <vector>
6
7 #include <boost/bind.hpp>
8
9 #include <simgear/structure/Singleton.hxx>
10
11 namespace simgear
12 {
13 using namespace std;
14
15 MultiChangeListener::MultiChangeListener()
16 {
17 }
18
19 void MultiChangeListener::valueChanged()
20 {
21     valueChangedImplementation();
22 }
23
24 void MultiChangeListener::valueChangedImplementation()
25 {
26 }
27
28 AtomicChangeListener::AtomicChangeListener(std::vector<SGPropertyNode*>& nodes)
29     :  _dirty(false), _valid(true)
30 {
31     listenToProperties(nodes.begin(), nodes.end());
32 }
33
34 void AtomicChangeListener::unregister_property(SGPropertyNode* node)
35 {
36     _valid = false;
37     // not necessary, but good hygine
38     vector<SGPropertyNode*>::iterator itr
39         = find(_watched.begin(), _watched.end(), node);
40     if (itr != _watched.end())
41         *itr = 0;
42     MultiChangeListener::unregister_property(node);
43 }
44
45 void AtomicChangeListener::fireChangeListeners()
46 {
47     vector<SGSharedPtr<AtomicChangeListener> >& listeners
48         = ListenerListSingleton::instance()->listeners;
49     for (vector<SGSharedPtr<AtomicChangeListener> >::iterator itr = listeners.begin(),
50              end = listeners.end();
51          itr != end;
52          ++itr) {
53         (*itr)->valuesChanged();
54         (*itr)->_dirty = false;
55     }
56     listeners.clear();
57 }
58
59 void AtomicChangeListener::valueChangedImplementation()
60 {
61     if (!_dirty) {
62         _dirty = true;
63         if (_valid)
64             ListenerListSingleton::instance()->listeners.push_back(this);
65     }
66 }
67
68 void AtomicChangeListener::valuesChanged()
69 {
70 }
71 }