Пример #1
0
 def __init(self):
     self.__listeners = WeakMethodList()
     self.__remove_listeners = WeakMethodList()
     # number of event calls
     # if any event is triggered increase the number, after all callbacks are executed decrease it
     # if it reaches 0 it means that in the current object all event callbacks were executed
     self.__event_call_number = 0
     self.__hard_remove = True
Пример #2
0
class ChangeListener(object):
    """Trivial ChangeListener.
	The object that changes and the object that listens have to inherit from this class.
	An object calls _changed everytime something has changed, obviously.
	This function calls every Callback, that has been registered to listen for a change.
	NOTE: ChangeListeners aren't saved, they have to be reregistered on load
	NOTE: RemoveListeners must not access the object, as it is in progress of being destroyed.
	"""

    def __init__(self, *args, **kwargs):
        super(ChangeListener, self).__init__()
        self.__init()

    def __init(self):
        self.__listeners = WeakMethodList()
        self.__remove_listeners = WeakMethodList()
        # number of event calls
        # if any event is triggered increase the number, after all callbacks are executed decrease it
        # if it reaches 0 it means that in the current object all event callbacks were executed
        self.__event_call_number = 0
        self.__hard_remove = True

    def __remove_listener(self, listener_list, listener):
        # check if the listener should be hard removed
        # if so switch it in the list to None
        try:
            if self.__hard_remove:
                listener_list.remove(listener)
            else:
                listener_list[listener_list.index(listener)] = None
        except ValueError as e:  # nicer error:
            raise ValueError(
                str(e)
                + "\nTried to remove: "
                + str(listener)
                + "\nat "
                + str(self)
                + "\nList: "
                + str([str(i) for i in listener_list])
            )

    def __call_listeners(self, listener_list):
        # instead of removing from list, switch the listener in position to None
        # this way, iteration won't be affected while listeners may modify the list
        self.__hard_remove = False
        # increase the event call number
        self.__event_call_number += 1
        for listener in listener_list:
            if listener:
                try:
                    listener()
                except ReferenceError as e:
                    # listener object is dead, don't crash since it doesn't need updates now anyway
                    print "Warning: the dead are listening to", self, ": ", e
                    import traceback

                    traceback.print_stack()

        self.__event_call_number -= 1

        if self.__event_call_number == 0:
            self.__hard_remove = True
            listener_list[:] = [l for l in listener_list if l]

            ## Normal change listener

    def add_change_listener(self, listener, call_listener_now=False, no_duplicates=False):
        assert callable(listener)
        if not no_duplicates or listener not in self.__listeners:
            self.__listeners.append(listener)
        if call_listener_now:  # also call if duplicate is adde
            listener()

    def remove_change_listener(self, listener):
        self.__remove_listener(self.__listeners, listener)

    def has_change_listener(self, listener):
        return listener in self.__listeners

    def discard_change_listener(self, listener):
        """Remove listener if it's there"""
        if self.has_change_listener(listener):
            self.remove_change_listener(listener)

    def clear_change_listeners(self):
        """Removes all change listeners"""
        self.__listeners = WeakMethodList()

    def _changed(self):
        """Calls every listener when an object changed"""
        self.__call_listeners(self.__listeners)

        ## Removal change listener

    def add_remove_listener(self, listener, no_duplicates=False):
        """A listener that listens for removal of the object"""
        assert callable(listener)
        if no_duplicates and listener in self.__remove_listeners:
            return  # don't allow duplicate entries
        self.__remove_listeners.append(listener)

    def remove_remove_listener(self, listener):
        self.__remove_listener(self.__remove_listeners, listener)

    def has_remove_listener(self, listener):
        return listener in self.__remove_listeners

    def discard_remove_listener(self, listener):
        if self.has_remove_listener(listener):
            self.remove_remove_listener(listener)

    def load(self, db, world_id):
        self.__init()

    def remove(self):
        self.__call_listeners(self.__remove_listeners)
        self.end()

    def end(self):
        self.__listeners = None
        self.__remove_listeners = None
Пример #3
0
class ChangeListener(object):
	"""Trivial ChangeListener.
	The object that changes and the object that listens have to inherit from this class.
	An object calls _changed everytime something has changed, obviously.
	This function calls every Callback, that has been registered to listen for a change.
	NOTE: ChangeListeners aren't saved, they have to be reregistered on load
	NOTE: Removelisteners must not access the object, as it is in progress of being destroyed.
	"""
	def __init__(self, *args, **kwargs):
		super(ChangeListener, self).__init__()
		self.__init()

	def __init(self):
		self.__listeners = WeakMethodList()
		self.__remove_listeners = WeakMethodList()
		# number of event calls
		# if any event is triggered increase the number, after all callbacks are executed decrease it
		# if it reaches 0 it means that in the current object all event callbacks were executed
		self.__event_call_number = 0
		self.__hard_remove = True

	def __remove_listener(self, listener_list, listener):
		# check if the listener should be hard removed
		# if so switch it in the list to None
		if self.__hard_remove:
			listener_list.remove(listener)
		else:
			listener_list[listener_list.index(listener)] = None

	def __call_listeners(self, listener_list):
		# instead of removing from list, switch the listener in position to None
		# this way, iteration won't be affected while listeners may modify the list
		self.__hard_remove = False
		# increase the event call number
		self.__event_call_number += 1
		for listener in listener_list:
			if listener:
				listener()

		self.__event_call_number -= 1

		if self.__event_call_number == 0:
			self.__hard_remove = True
			listener_list = [ l for l in listener_list if l ]

	## Normal change listener
	def add_change_listener(self, listener, call_listener_now = False):
		assert callable(listener)
		self.__listeners.append(listener)
		if call_listener_now:
			listener()

	def remove_change_listener(self, listener):
		self.__remove_listener(self.__listeners, listener)

	def has_change_listener(self, listener):
		return (listener in self.__listeners)

	def discard_change_listener(self, listener):
		"""Remove listener if it's there"""
		if self.has_change_listener(listener):
			self.remove_change_listener(listener)

	def clear_change_listeners(self):
		"""Removes all change listeners"""
		self.__listeners = WeakMethodList()

	def _changed(self):
		"""Calls every listener when an object changed"""
		self.__call_listeners(self.__listeners)

	## Removal change listener
	def add_remove_listener(self, listener):
		"""A listener that listens for removal of the object"""
		assert callable(listener)
		self.__remove_listeners.append(listener)

	def remove_remove_listener(self, listener):
		self.__remove_listener(self.__remove_listeners, listener)

	def has_remove_listener(self, listener):
		return (listener in self.__remove_listeners)

	def load(self, db, world_id):
		self.__init()

	def remove(self):
		self.__call_listeners(self.__remove_listeners)
		self.end()

	def end(self):
		self.__listeners = None
		self.__remove_listeners = None
Пример #4
0
 def clear_change_listeners(self):
     """Removes all change listeners"""
     self.__listeners = WeakMethodList()
 def clear_change_listeners(self):
     """Removes all change listeners"""
     self.__listeners = WeakMethodList()
 def __init(self):
     self.__listeners = WeakMethodList()
     self.__remove_listeners = WeakMethodList()
class ChangeListener(object):
    """Trivial ChangeListener.
	The object that changes and the object that listens have to inherit from this class.
	An object calls _changed everytime something has changed, obviously.
	This function calls every Callback, that has been registered to listen for a change.
	NOTE: ChangeListeners aren't saved, they have to be reregistered on load
	NOTE: Removelisteners must not access the object, as it is in progress of being destroyed.
	"""
    def __init__(self, *args, **kwargs):
        super(ChangeListener, self).__init__()
        self.__init()

    def __init(self):
        self.__listeners = WeakMethodList()
        self.__remove_listeners = WeakMethodList()

    ## Normal change listener
    def add_change_listener(self, listener, call_listener_now=False):
        assert callable(listener)
        self.__listeners.append(listener)
        if call_listener_now:
            listener()

    def remove_change_listener(self, listener):
        self.__listeners.remove(listener)

    def has_change_listener(self, listener):
        return (listener in self.__listeners)

    def discard_change_listener(self, listener):
        """Remove listener if it's there"""
        if self.has_change_listener(listener):
            self.remove_change_listener(listener)

    def clear_change_listeners(self):
        """Removes all change listeners"""
        self.__listeners = WeakMethodList()

    def _changed(self):
        """Calls every listener when an object changed"""
        for listener in self.__listeners:
            listener()

    ## Removal change listener
    def add_remove_listener(self, listener):
        """A listener that listens for removal of the object"""
        assert callable(listener)
        self.__remove_listeners.append(listener)

    def remove_remove_listener(self, listener):
        self.__remove_listeners.remove(listener)

    def has_remove_listener(self, listener):
        return (listener in self.__remove_listeners)

    def load(self, db, world_id):
        self.__init()

    def remove(self):
        for listener in self.__remove_listeners:
            listener()
        self.end()

    def end(self):
        self.__listeners = None
        self.__remove_listeners = None
Пример #8
0
	def __init(self):
		self.__listeners = WeakMethodList()
		self.__remove_listeners = WeakMethodList()
Пример #9
0
class Changelistener(object):
	"""Trivial ChangeListener.
	The object that changes and the object that listens have to inherit from this class.
	An object calls _changed everytime something has changed, obviously.
	This function calls every Callback, that has been registered to listen for a change.
	NOTE: Changelisteners aren't saved, they have to be reregistered on load
	NOTE: Removelisteners must not access the object.
	"""
	def __init__(self, *args, **kwargs):
		super(Changelistener, self).__init__()
		self.__init()

	def __init(self):
		self.__listeners = WeakMethodList()
		self.__remove_listeners = WeakMethodList()

	## Normal change listener
	def add_change_listener(self, listener, call_listener_now = False):
		self.__listeners.append(listener)
		if call_listener_now:
			listener()

	def remove_change_listener(self, listener):
		self.__listeners.remove(listener)

	def has_change_listener(self, listener):
		return (listener in self.__listeners)

	def discard_change_listener(self, listener):
		"""Remove listener if it's there"""
		if self.has_change_listener(listener):
			self.remove_change_listener(listener)

	def clear_change_listeners(self):
		"""Removes all change listeners"""
		self.__listeners = WeakMethodList()

	def _changed(self):
		"""Calls every listener when an object changed"""
		for listener in self.__listeners:
			listener()

	## Removal change listener
	def add_remove_listener(self, listener):
		"""A listener that listens for removal of the object"""
		self.__remove_listeners.append(listener)

	def remove_remove_listener(self, listener):
		self.__remove_listeners.remove(listener)

	def has_remove_listener(self, listener):
		return (listener in self.__remove_listeners)

	def load(self, db, world_id):
		self.__init()

	def remove(self):
		for listener in self.__remove_listeners:
			listener()
		self.end()

	def end(self):
		self.__listeners = None
		self.__remove_listeners = None