1class Signals(object): 2 def __init__(self): 3 self._signals = {} 4 5 def _connect(self, obj, name, handler, connector): 6 ret = self._signals.setdefault(obj, {}) 7 8 hid = connector(name, handler) 9 ret.setdefault(name, []).append(hid) 10 11 return hid 12 13 def connect_signal(self, obj, name, handler): 14 return self._connect(obj, name, handler, obj.connect) 15 16 def connect_signal_after(self, obj, name, handler): 17 return self._connect(obj, name, handler, obj.connect_after) 18 19 def disconnect_signals(self, obj): 20 if obj not in self._signals: 21 return False 22 23 for name in self._signals[obj]: 24 for hid in self._signals[obj][name]: 25 obj.disconnect(hid) 26 27 del self._signals[obj] 28 return True 29 30 def block_signal(self, obj, name): 31 if obj not in self._signals: 32 return False 33 34 if name not in self._signals[obj]: 35 return False 36 37 for hid in self._signals[obj][name]: 38 obj.handler_block(hid) 39 40 return True 41 42 def unblock_signal(self, obj, name): 43 if obj not in self._signals: 44 return False 45 46 if name not in self._signals[obj]: 47 return False 48 49 for hid in self._signals[obj][name]: 50 obj.handler_unblock(hid) 51 52 return True 53 54 def disconnect_signal(self, obj, name): 55 if obj not in self._signals: 56 return False 57 58 if name not in self._signals[obj]: 59 return False 60 61 for hid in self._signals[obj][name]: 62 obj.disconnect(hid) 63 64 del self._signals[obj][name] 65 66 if len(self._signals[obj]) == 0: 67 del self._signals[obj] 68 69 return True