aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbTk/Signal.hh36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/FbTk/Signal.hh b/src/FbTk/Signal.hh
index 6480690..6bf94bc 100644
--- a/src/FbTk/Signal.hh
+++ b/src/FbTk/Signal.hh
@@ -69,7 +69,7 @@ public:
69 } 69 }
70 70
71 /// Remove a specific slot \c id from this signal 71 /// Remove a specific slot \c id from this signal
72 void disconnect(SlotID slotIt) { 72 void disconnect(SlotID slotIt) const {
73 if(m_emitting) { 73 if(m_emitting) {
74 // if we are emitting, we must not erase the actual element, as that would 74 // if we are emitting, we must not erase the actual element, as that would
75 // invalidate iterators in the emit() function 75 // invalidate iterators in the emit() function
@@ -87,11 +87,11 @@ public:
87 m_slots.clear(); 87 m_slots.clear();
88 } 88 }
89 89
90 void connectTracker(SignalHolder::Tracker& tracker) { 90 void connectTracker(SignalHolder::Tracker& tracker) const {
91 m_trackers.insert(&tracker); 91 m_trackers.insert(&tracker);
92 } 92 }
93 93
94 void disconnectTracker(SignalHolder::Tracker& tracker) { 94 void disconnectTracker(SignalHolder::Tracker& tracker) const {
95 m_trackers.erase(&tracker); 95 m_trackers.erase(&tracker);
96 } 96 }
97 97
@@ -103,7 +103,7 @@ protected:
103 Iterator end() { return m_slots.end(); } 103 Iterator end() { return m_slots.end(); }
104 104
105 /// Connect a slot to this signal. Must only be called by child classes. 105 /// Connect a slot to this signal. Must only be called by child classes.
106 SlotID connect(const SlotPtr& slot) { 106 SlotID connect(const SlotPtr& slot) const {
107 return m_slots.insert(m_slots.end(), slot); 107 return m_slots.insert(m_slots.end(), slot);
108 } 108 }
109 109
@@ -116,8 +116,8 @@ protected:
116 } 116 }
117private: 117private:
118 typedef std::set<Tracker*> Trackers; 118 typedef std::set<Tracker*> Trackers;
119 SlotList m_slots; ///< all slots connected to a signal 119 mutable SlotList m_slots; ///< all slots connected to a signal
120 Trackers m_trackers; ///< all instances that tracks this signal. 120 mutable Trackers m_trackers; ///< all instances that tracks this signal.
121 unsigned m_emitting; 121 unsigned m_emitting;
122}; 122};
123 123
@@ -138,13 +138,13 @@ public:
138 } 138 }
139 139
140 template<typename Functor> 140 template<typename Functor>
141 SlotID connect(const Functor& functor) { 141 SlotID connect(const Functor& functor) const {
142 return SignalHolder::connect(SlotPtr( 142 return SignalHolder::connect(SlotPtr(
143 new SlotImpl<Functor, void, Arg1, Arg2, Arg3>(functor) 143 new SlotImpl<Functor, void, Arg1, Arg2, Arg3>(functor)
144 )); 144 ));
145 } 145 }
146 146
147 SlotID connectSlot(const RefCount<FbTk::Slot<void, Arg1, Arg2, Arg3> > &slot) { 147 SlotID connectSlot(const RefCount<FbTk::Slot<void, Arg1, Arg2, Arg3> > &slot) const {
148 return SignalHolder::connect(slot); 148 return SignalHolder::connect(slot);
149 } 149 }
150}; 150};
@@ -163,13 +163,13 @@ public:
163 } 163 }
164 164
165 template<typename Functor> 165 template<typename Functor>
166 SlotID connect(const Functor& functor) { 166 SlotID connect(const Functor& functor) const {
167 return SignalHolder::connect(SlotPtr( 167 return SignalHolder::connect(SlotPtr(
168 new SlotImpl<Functor, void, Arg1, Arg2>(functor) 168 new SlotImpl<Functor, void, Arg1, Arg2>(functor)
169 )); 169 ));
170 } 170 }
171 171
172 SlotID connectSlot(const RefCount<FbTk::Slot<void, Arg1, Arg2> > &slot) { 172 SlotID connectSlot(const RefCount<FbTk::Slot<void, Arg1, Arg2> > &slot) const {
173 return SignalHolder::connect(slot); 173 return SignalHolder::connect(slot);
174 } 174 }
175}; 175};
@@ -188,13 +188,13 @@ public:
188 } 188 }
189 189
190 template<typename Functor> 190 template<typename Functor>
191 SlotID connect(const Functor& functor) { 191 SlotID connect(const Functor& functor) const {
192 return SignalHolder::connect(SlotPtr( 192 return SignalHolder::connect(SlotPtr(
193 new SlotImpl<Functor, void, Arg1>(functor) 193 new SlotImpl<Functor, void, Arg1>(functor)
194 )); 194 ));
195 } 195 }
196 196
197 SlotID connectSlot(const RefCount<FbTk::Slot<void, Arg1> > &slot) { 197 SlotID connectSlot(const RefCount<FbTk::Slot<void, Arg1> > &slot) const {
198 return SignalHolder::connect(slot); 198 return SignalHolder::connect(slot);
199 } 199 }
200}; 200};
@@ -213,13 +213,13 @@ public:
213 } 213 }
214 214
215 template<typename Functor> 215 template<typename Functor>
216 SlotID connect(const Functor& functor) { 216 SlotID connect(const Functor& functor) const {
217 return SignalHolder::connect(SlotPtr( 217 return SignalHolder::connect(SlotPtr(
218 new SlotImpl<Functor, void>(functor) 218 new SlotImpl<Functor, void>(functor)
219 )); 219 ));
220 } 220 }
221 221
222 SlotID connectSlot(const RefCount<FbTk::Slot<void> > &slot) { 222 SlotID connectSlot(const RefCount<FbTk::Slot<void> > &slot) const {
223 return SignalHolder::connect(slot); 223 return SignalHolder::connect(slot);
224 } 224 }
225}; 225};
@@ -231,7 +231,7 @@ public:
231class SignalTracker: public SigImpl::SignalHolder::Tracker { 231class SignalTracker: public SigImpl::SignalHolder::Tracker {
232public: 232public:
233 /// Internal type, do not use. 233 /// Internal type, do not use.
234 typedef std::map<SigImpl::SignalHolder*, 234 typedef std::map<const SigImpl::SignalHolder*,
235 SigImpl::SignalHolder::SlotID> Connections; 235 SigImpl::SignalHolder::SlotID> Connections;
236 typedef Connections::iterator TrackID; ///< \c ID type for join/leave. 236 typedef Connections::iterator TrackID; ///< \c ID type for join/leave.
237 237
@@ -242,7 +242,7 @@ public:
242 /// Starts tracking a signal. 242 /// Starts tracking a signal.
243 /// @return A tracking ID 243 /// @return A tracking ID
244 template<typename Arg1, typename Arg2, typename Arg3, typename Functor> 244 template<typename Arg1, typename Arg2, typename Arg3, typename Functor>
245 TrackID join(Signal<Arg1, Arg2, Arg3> &sig, const Functor &functor) { 245 TrackID join(const Signal<Arg1, Arg2, Arg3> &sig, const Functor &functor) {
246 return joinSlot(sig, RefCount<Slot<void, Arg1, Arg2, Arg3> >( 246 return joinSlot(sig, RefCount<Slot<void, Arg1, Arg2, Arg3> >(
247 new SlotImpl<Functor, void, Arg1, Arg2, Arg3>(functor) 247 new SlotImpl<Functor, void, Arg1, Arg2, Arg3>(functor)
248 )); 248 ));
@@ -250,7 +250,9 @@ public:
250 250
251 template<typename Arg1, typename Arg2, typename Arg3> 251 template<typename Arg1, typename Arg2, typename Arg3>
252 TrackID 252 TrackID
253 joinSlot(Signal<Arg1, Arg2, Arg3> &sig, const RefCount<Slot<void, Arg1, Arg2, Arg3> > &slot) { 253 joinSlot(const Signal<Arg1, Arg2, Arg3> &sig,
254 const RefCount<Slot<void, Arg1, Arg2, Arg3> > &slot) {
255
254 ValueType value = ValueType(&sig, sig.connectSlot(slot)); 256 ValueType value = ValueType(&sig, sig.connectSlot(slot));
255 std::pair<TrackID, bool> ret = m_connections.insert(value); 257 std::pair<TrackID, bool> ret = m_connections.insert(value);
256 if ( !ret.second ) { 258 if ( !ret.second ) {