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):