def pop(self, index=-1): try: child = self[index] except IndexError: raise IndexError("pop index out of range") list.__delitem__(self, index) child.parent = None _protocol.writeObj({'msg': 'remove', 'id': child.id}) return child
def text(self, text=None): if text is not None: try: self._text = unicode(text) except UnicodeDecodeError: self._text = text.decode('latin-1') _protocol.writeObj({'msg': 'text', 'id': self.id, 'text': self._text}) return self._text
def click(self, cb): if not callable(cb): raise TypeError() if not self.eventListeners: self.eventListeners = {'click': [cb]} _protocol.writeObj({'msg': 'listen', 'id': self.id}) else: listeners = self.eventListeners.get('click') if not listeners: self.eventListeners['click'] = listeners = [cb] elif cb not in listeners: listeners.append(cb)
def __init__(self, **kwargs): assert self.__class__ is not _Element self.id = _Element._nextId self.parent = None self.eventListeners = None _Element._nextId += 1 _elements[self.id] = self if self.id: _protocol.writeObj({'msg': 'create', 'id': self.id, 'type': self.__class__.__name__}) if not kwargs.get('detached'): _defaultContainer.children.append(self)
def removeEventListener(self, eventType, cb=None): eventListeners = self.eventListeners.get(eventType) if not eventListeners: return # no listeners for eventType if not cb: del self.eventListeners[eventType] else: try: eventListeners.remove(cb) except: return if not eventListeners: del self.eventListeners[eventType] if not self.eventListeners: _protocol.writeObj({'msg': 'unlisten', 'id': self.id})
def readObject(): global promptStr ps = newSys.ps1 if not srcStr else newSys.ps2 if ps is not promptStr: protocol.writeObj({'msg': 'setPrompt', 'ps': ps}) promptStr = ps msg = raw_input() assert msg != '.' try: obj = json.loads(msg) assert type(obj) is dict return obj except: return {'msg': 'eval', 'cmd': msg}
def insert(self, index, obj): if type(index) is float: raise TypeError("integer argument expected, got float") # python 3 behavior try: index = int(index) except TypeError: raise TypeError("'%s' object cannot be interpreted as an integer" % type(index).__name__) # py3 obj = self._checkType(obj) self._checkAncestor(obj) if obj in self: raise ValueError("Duplicate %r Element not allowed" % obj) if index < 0: index = 0 elif index > len(self): index = len(self) list.insert(self, index, obj) # commit obj.parent = self._owner _protocol.writeObj({'msg': 'add', 'parent': self._owner.id, 'index': index, 'child': obj.id})
def __setitem__(self, key, value): if type(key) is int: value = self._checkType(value) self._checkAncestor(value) try: oldNodes = [self.__getitem__(key)] except IndexError: raise IndexError("list assignment index out of range") # more accurate msg for setter else: value = [self._checkType(v) for v in value] for v in value: self._checkAncestor(v) oldNodes = self.__getitem__(key) nodeSet = set(self) - set(oldNodes) for v in ([value] if type(key) is int else value): if v in nodeSet: raise ValueError("Duplicate %r Element not allowed" % v) nodeSet.add(v) list.__setitem__(self, key, value) for node in oldNodes: node.parent = None for node in self: node.parent = self._owner _protocol.writeObj({'msg': 'setChildren', 'parent': self._owner.id, 'children': [node.id for node in self]})
def __delitem__(self, key): nodes = self.__getitem__(key) if type(key) is int: nodes = (nodes,) for node in nodes: node.parent = None list.__delitem__(self, key) _protocol.writeObj({'msg': 'setChildren', 'parent': self._owner.id, 'children': [node.id for node in self]})
def __del__(self): _protocol.writeObj({'msg': 'del', 'id': self.id})
def sort(cmp=None, key=None, reverse=False): list.sort(cmp, key, reverse) _protocol.writeObj({'msg': 'setChildren', 'parent': self._owner.id, 'children': [node.id for node in self]})
def reverse(self): list.reverse(self) _protocol.writeObj({'msg': 'setChildren', 'parent': self._owner.id, 'children': [node.id for node in self]})