[cgkit-commits] cgkit2/cgkit eventmanager.py,1.1.1.1,1.2
Brought to you by:
mbaas
From: Matthias B. <mb...@us...> - 2005-02-28 16:46:31
|
Update of /cvsroot/cgkit/cgkit2/cgkit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30460/cgkit Modified Files: eventmanager.py Log Message: When connecting to an event you can now specify a priority which determines the calling order. Index: eventmanager.py =================================================================== RCS file: /cvsroot/cgkit/cgkit2/cgkit/eventmanager.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** eventmanager.py 12 Dec 2004 14:31:00 -0000 1.1.1.1 --- eventmanager.py 28 Feb 2005 16:46:16 -0000 1.2 *************** *** 24,28 **** ## Contains the EventManager class. ! import sys, types # EventManager --- 24,57 ---- ## Contains the EventManager class. ! import sys, types, bisect ! ! # Receiver ! class _Receiver: ! """Stores a receiver (=callable) and a priority. ! ! This class defines a comparison operator (that's why this class is ! used instead of a tuple (priority, receiver)). ! """ ! def __init__(self, receiver, priority=1): ! self.receiver = receiver ! self.priority = priority ! ! ! def __str__(self): ! # If the receiver is an instance method, then obtain the corresponding ! # class name ! cls = getattr(self.receiver, "im_class") ! if cls!=None: ! s = getattr(cls, "__name__")+"." ! else: ! s = "" ! s += getattr(self.receiver, "__name__", "<unnamed>") ! return "(%d, %s)"%(self.priority, s) ! ! __repr__ = __str__ ! ! def __cmp__(self, other): ! return self.priority-other.priority ! # EventManager *************** *** 38,46 **** """Constructor.""" ! # System wide connections. Key: Event name - Value: List of receivers self.system_connections = {} ! # Scene wide connections. Key: Event name - Value: List of receivers self.scene_connections = {} # event def event(self, name, *params, **keyargs): --- 67,97 ---- """Constructor.""" ! # System wide connections. ! # Key: Event name - Value: Sorted list of _Receivers self.system_connections = {} ! # Scene wide connections. ! # Key: Event name - Value: Sorted list of _Receivers self.scene_connections = {} + def __str__(self): + s = 70*"-"+"\n" + s += "System events\n" + s += 70*"-"+"\n" + for event in self.system_connections: + s+='Event: "%s"\n'%event + for rec in self.system_connections[event]: + s+=" %s\n"%rec + s+="\n" + + s += 70*"-"+"\n" + s += "Scene events\n" + s += 70*"-"+"\n" + for event in self.scene_connections: + s+='Event: "%s"\n'%event + for rec in self.scene_connections[event]: + s+=" %s\n"%rec + return s + + # event def event(self, name, *params, **keyargs): *************** *** 57,61 **** receivers = self.system_connections.get(name, []) for rec in receivers: ! if rec(*params, **keyargs): stop_flag = True --- 108,112 ---- receivers = self.system_connections.get(name, []) for rec in receivers: ! if rec.receiver(*params, **keyargs): stop_flag = True *************** *** 66,70 **** receivers = self.scene_connections.get(name, []) for rec in receivers: ! if rec(*params, **keyargs): stop_flag = True --- 117,121 ---- receivers = self.scene_connections.get(name, []) for rec in receivers: ! if rec.receiver(*params, **keyargs): stop_flag = True *************** *** 72,81 **** # connect ! def connect(self, name, receiver, system=False): """Connect a function or method to an event. \param name (\c str) Name of the event. \param receiver The receiving function or method, or an instance of a class that must implement an on<Event>() method. \param system (\c bool) Specifies if the connection is system wide or not (default: \c False). --- 123,136 ---- # connect ! def connect(self, name, receiver, priority=10, system=False): """Connect a function or method to an event. + The priority determines the calling order when the corresponding + event is emitted. Receivers with a smaller priority are invoked first. + \param name (\c str) Name of the event. \param receiver The receiving function or method, or an instance of a class that must implement an on<Event>() method. + \param priority (\c int) Priority of the receiver \param system (\c bool) Specifies if the connection is system wide or not (default: \c False). *************** *** 95,104 **** connections = self.scene_connections # Has the event already any connections? then add the new receiver if connections.has_key(name): ! connections[name].append(receiver) # otherwise create a new list else: ! connections[name] = [receiver] return (name,receiver) --- 150,161 ---- connections = self.scene_connections + rec = _Receiver(receiver, priority) # Has the event already any connections? then add the new receiver if connections.has_key(name): ! bisect.insort(connections[name], rec) ! # connections[name].append(receiver) # otherwise create a new list else: ! connections[name] = [rec] return (name,receiver) *************** *** 136,144 **** # Try to remove the connection ! try: ! connections[name].remove(receiver) ! except ValueError: raise KeyError, 'Receiver is not connected to event "%s"'%name # disconnectAll def disconnectAll(self, system=False): --- 193,209 ---- # Try to remove the connection ! # try: ! # connections[name].remove(receiver) ! # except ValueError: ! # raise KeyError, 'Receiver is not connected to event "%s"'%name ! ! for i,rec in enumerate(connections[name]): ! if rec.receiver==receiver: ! break ! else: raise KeyError, 'Receiver is not connected to event "%s"'%name + del connections[i] + # disconnectAll def disconnectAll(self, system=False): |