# ########################################################## ## # FlatCAM: 2D Post-processing for Manufacturing # # http://flatcam.org # # Author: Juan Pablo Caram (c) # # Date: 2/5/2014 # # MIT Licence # # ########################################################## ## class LoudDict(dict): """ A Dictionary with a callback for item changes. """ def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) self.callback = lambda x: None def __setitem__(self, key, value): """ Overridden __setitem__ method. Will emit 'changed(QString)' if the item was changed, with key as parameter. """ if key in self and self.__getitem__(key) == value: return dict.__setitem__(self, key, value) self.callback(key) def update(self, *args, **kwargs): if len(args) > 1: raise TypeError("update expected at most 1 arguments, got %d" % len(args)) other = dict(*args, **kwargs) for key in other: self[key] = other[key] def set_change_callback(self, callback): """ Assigns a function as callback on item change. The callback will receive the key of the object that was changed. :param callback: Function to call on item change. :type callback: func :return: None """ self.callback = callback class FCSignal: """ Taken from here: https://blog.abstractfactory.io/dynamic-signals-in-pyqt/ """ def __init__(self): self.__subscribers = [] def emit(self, *args, **kwargs): for subs in self.__subscribers: subs(*args, **kwargs) def connect(self, func): self.__subscribers.append(func) def disconnect(self, func): try: self.__subscribers.remove(func) except ValueError: print('Warning: function %s not removed ' 'from signal %s' % (func, self))