diff --git a/src/tools/misc.py b/src/tools/misc.py index ba41c91b..8ed1effa 100644 --- a/src/tools/misc.py +++ b/src/tools/misc.py @@ -32,24 +32,26 @@ class TriggerManager: def __init__(self): self.__triggers={} - def add(self, point_name, callback): + def add(self, point_name, callback, priority=0): """Add a trigger to a point @param point_name: name of the point when the trigger should be run @param callback: method to call at the trigger point + @param priority: callback will be called in priority order, biggest first """ if not self.__triggers.has_key(point_name): self.__triggers[point_name]=[] - self.__triggers[point_name].append(callback) + self.__triggers[point_name].append((priority, callback)) + self.__triggers[point_name].sort(key=lambda trigger_tuple: trigger_tuple[0], reverse=True) def remove(self, point_name, callback): """Remove a trigger from a point @param point_name: name of the point when the trigger should be run @param callback: method to remove, must exists in the trigger point""" - try: - self.__triggers[point_name].remove(callback) - except (KeyError,ValueError): - raise TriggerException("Trying to remove an unexisting trigger") - + for trigger_tuple in self.__triggers[point_name]: + if trigger_tuple[1] == callback: + self.__triggers[point_name].remove(trigger_tuple) + return + raise TriggerException("Trying to remove an unexisting trigger") def point(self, point_name, *args, **kwargs): """This put a trigger point @@ -59,7 +61,7 @@ class TriggerManager: if not self.__triggers.has_key(point_name): return True - for trigger in self.__triggers[point_name]: + for priority,trigger in self.__triggers[point_name]: if not trigger(*args, **kwargs): return False return True