event
changeset 1:53377a53344c
added priority= argument to subscibe methods (heapq)
| author | Thomas Jollans <thomas@jollans.com> |
|---|---|
| date | Sat Aug 18 00:20:00 2007 +0200 (2007-08-18) |
| parents | 3f452cbe1819 |
| children | f75775036ba6 |
| files | modules/event.py |
line diff
1.1 --- a/modules/event.py Wed Aug 15 02:29:04 2007 +0200 1.2 +++ b/modules/event.py Sat Aug 18 00:20:00 2007 +0200 1.3 @@ -17,6 +17,7 @@ 1.4 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1.5 1.6 from Queue import Queue 1.7 +from heapq import * 1.8 1.9 class Event(object): 1.10 """ 1.11 @@ -50,7 +51,7 @@ 1.12 def draw(self): 1.13 pass 1.14 1.15 - def subscribe(self, event, service, attr): 1.16 + def subscribe(self, event, service, attr, priority=0): 1.17 """ 1.18 adds a permanent handler to an event. 1.19 1.20 @@ -60,9 +61,11 @@ 1.21 """ 1.22 handler = (service, attr) 1.23 if event not in self.handlers: 1.24 - self.handlers[event] = set() 1.25 + self.handlers[event] = [] 1.26 + if not isinstance(self.handlers[event], list): 1.27 + self.handlers[event] = list(self.handlers[event]) 1.28 1.29 - self.handlers[event].add(handler) 1.30 + heappush(self.handlers[event], (priority, handler)) 1.31 1.32 def unsubscribe(self, event, service, attr): 1.33 """ 1.34 @@ -70,10 +73,12 @@ 1.35 """ 1.36 handler = (service, attr) 1.37 if event in self.handlers: 1.38 - if handler in self.handlers[event]: 1.39 - self.handlers[event].remove(handler) 1.40 + for p, h in self.handlers[event][:]: 1.41 + if h == handler: 1.42 + self.handlers[event].remove((p, handler)) 1.43 + return 1.44 1.45 - def subscribe_temp(self, event, handler): 1.46 + def subscribe_temp(self, event, handler, priority=0): 1.47 """ 1.48 adds a handler local to this request to an event 1.49 1.50 @@ -81,17 +86,19 @@ 1.51 @param handler: callable to be called if the event occurs 1.52 """ 1.53 if event not in self.temp_handlers: 1.54 - self.temp_handlers[event] = set() 1.55 + self.temp_handlers[event] = [] 1.56 1.57 - self.temp_handlers[event].add(handler) 1.58 + self.temp_handlers[event].add((priority, handler)) 1.59 1.60 - def unsubscribe_temp(self, event, service, attr): 1.61 + def unsubscribe_temp(self, event, handler): 1.62 """ 1.63 removes a handler local to this request from an event 1.64 """ 1.65 if event in self.temp_handlers: 1.66 - if handler in self.temp_handlers[event]: 1.67 - self.temp_handlers[event].remove(handler) 1.68 + for p, h in self.temp_handlers[event][:]: 1.69 + if h == handler: 1.70 + self.temp_handlers[event].remove((p, handler)) 1.71 + return 1.72 1.73 def call(self, event, *args, **kwargs): 1.74 """ 1.75 @@ -103,16 +110,15 @@ 1.76 e = Event(event, args, kwargs) 1.77 self.__q.put(e) 1.78 1.79 - 1.80 def _call_now(self, e): 1.81 """don't do this unless you're self.close""" 1.82 - for s, a in self.handlers.get(e.name, ()): 1.83 + for p, (s, a) in reversed(self.handlers.get(e.name, ())): 1.84 try: 1.85 getattr(self.r[s], a)(e) 1.86 except (KeyError, AttributeError): 1.87 pass 1.88 1.89 - for h in self.temp_handlers.get(e.name, ()): 1.90 + for p, h in reversed(self.temp_handlers.get(e.name, ())): 1.91 h(e) 1.92 1.93 def close(self):
