aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk')
-rw-r--r--src/FbTk/Signal.hh32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/FbTk/Signal.hh b/src/FbTk/Signal.hh
index 18b03b3..df30cda 100644
--- a/src/FbTk/Signal.hh
+++ b/src/FbTk/Signal.hh
@@ -191,8 +191,8 @@ public:
191class SignalTracker { 191class SignalTracker {
192public: 192public:
193 /// Internal type, do not use. 193 /// Internal type, do not use.
194 typedef std::list< std::pair<SigImpl::SignalHolder*, 194 typedef std::map<SigImpl::SignalHolder*,
195 SigImpl::SignalHolder::SlotID> > Connections; 195 SigImpl::SignalHolder::SlotID> Connections;
196 typedef Connections::iterator TrackID; ///< \c ID type for join/leave. 196 typedef Connections::iterator TrackID; ///< \c ID type for join/leave.
197 197
198 ~SignalTracker() { 198 ~SignalTracker() {
@@ -203,9 +203,13 @@ public:
203 /// @return A tracking ID ( not unique ) 203 /// @return A tracking ID ( not unique )
204 template <typename Signal, typename Functor> 204 template <typename Signal, typename Functor>
205 TrackID join(Signal& sig, const Functor& functor) { 205 TrackID join(Signal& sig, const Functor& functor) {
206 return 206 ValueType value = std::make_pair(&sig, sig.connect(functor));
207 m_connections.insert(m_connections.end(), 207 std::pair<TrackID, bool> ret = m_connections.insert(value);
208 Connections::value_type(&sig, sig.connect(functor))); 208 if ( !ret.second ) {
209 // failed to insert this functor
210 sig.disconnect(value.second);
211 }
212 return ret.first;
209 } 213 }
210 214
211 /// Leave tracking for a signal 215 /// Leave tracking for a signal
@@ -217,23 +221,29 @@ public:
217 /// Leave tracking for a signal 221 /// Leave tracking for a signal
218 /// @param sig the signal to leave 222 /// @param sig the signal to leave
219 template <typename Signal> 223 template <typename Signal>
220 void leave(const Signal &sig) { 224 void leave(Signal &sig) {
221 m_connections.erase(&sig); 225 Iterator it = m_connections.find(&sig);
226 if (it != m_connections.end()) {
227 it->first->disconnect( it->second );
228 m_connections.erase(it);
229 }
222 } 230 }
223 231
224 232
225 void leaveAll() { 233 void leaveAll() {
226 // disconnect all connections 234 // disconnect all connections
227 for ( Connections::iterator conIt = m_connections.begin(); 235 for ( Iterator conIt = m_connections.begin();
228 conIt != m_connections.end(); ) { 236 conIt != m_connections.end(); ++conIt) {
229 // keep temporary, while disconnecting we can 237 // keep temporary, while disconnecting we can
230 // in some strange cases get a call to this again 238 // in some strange cases get a call to this again
231 Connections::value_type tmp = *conIt; 239 ValueType tmp = *conIt;
232 conIt = m_connections.erase(conIt); 240 m_connections.erase(conIt);
233 tmp.first->disconnect(tmp.second); 241 tmp.first->disconnect(tmp.second);
234 } 242 }
235 } 243 }
236private: 244private:
245 typedef Connections::value_type ValueType;
246 typedef Connections::iterator Iterator;
237 /// holds all connections to different signals and slots. 247 /// holds all connections to different signals and slots.
238 Connections m_connections; 248 Connections m_connections;
239}; 249};