def edit(self, o): if o is self.o: return if not self.o is None: observe.unobserve(self.o, self._listener) self.o = o self.descr = introsp.description(o.__class__) if not o is None: self._update() observe.observe(self.o, self._listener) else: self._set_icon_filename_label_details("", "", "")
def create_children(self, old_children = ()): if not self.o_has_children: return [] if self.o_children is None: if isinstance(self.o_has_children, list) or isinstance(self.o_has_children, set) or isinstance(self.o_has_children, dict): observe.unobserve(self.o_has_children, self._listener) self.o_children = self.descr.children_of(self.o) observe.observe(self.o_children, self._listener) # Order them if isinstance(self.o_children, set ): self.o_children = list (self.o_children) elif isinstance(self.o_children, frozenset): self.o_children = tuple(self.o_children) elif isinstance(self.o_children, dict ): self.o_children = self.o_children.values() old = dict([(child.o, child) for child in old_children]) return [old.get(o) or self.__class__(self, o) for o in self.o_children]
def edit(self, o): if o is self.o: return self.descr = introsp.description(o.__class__) if not o is None: attrs = [(self.descr.priority_for_attr(o, attr), editobj2.TRANSLATOR(attr), attr, self.descr.field_for_attr(o, attr)) for attr in self.descr.attrs_of(o)] attrs = [priority_name_attr_Field for priority_name_attr_Field in attrs if priority_name_attr_Field[-1]] attrs.sort() else: attrs = [] if o and self.o and (self.attrs == attrs): if not self.o is None: observe.unobserve(self.o, self._listener) self.o = o self.property_attrs = self.descr.property_attrs_of(o) self.attrs = attrs if not o is None: for field in self.fields.itervalues(): field.edit(o) observe.observe(self.o, self._listener) else: if not self.o is None: observe.unobserve(self.o, self._listener) self._delete_all_fields() self.o = o self.property_attrs = self.descr.property_attrs_of(o) self.attrs = attrs if not o is None: self._set_nb_fields(len(attrs)) i = 0 self.fields = {} for priority, name, attr, Field in attrs: if (Field is editobj2.field.ObjectAttributeField) and isinstance(self.master, editobj2.field.ObjectAttributeField): Field = editobj2.field.EntryField field = self.fields[attr] = Field(self.gui, self, o, attr, self.undo_stack) self._new_field(name, field, self.descr.unit_for_attr(o, attr), i) i += 1 observe.observe(self.o, self._listener)
def _listener(self, o, type, new, old): self.update() if (type is list) or (type is set) or (type is dict): if self.o_children is not None: observe.unobserve(self.o_children, self._listener) self.o_children = self.descr.children_of(self.o) observe.observe(self.o_children, self._listener) self.update_children() elif type is object: if self.o_children is not None: if (self.o_children_getter in new.keys()) or (self.o_children_getter in old.keys()): # XXX Optimizable : verify if self.o_children_getter is a string AND new[self.o_children_getter] == old[self.o_children_getter] observe.unobserve(self.o_children, self._listener) self.o_children = self.descr.children_of(self.o) observe.observe(self.o_children, self._listener) self.update_children() elif type == "__class__": self.descr = introsp.description(self.o.__class__) self.update_children()
def destroy(self): super(HierarchyNode, self).destroy() observe.unobserve(self.o, self._listener) if self.o_children is not None: observe.unobserve(self.o_children, self._listener) elif isinstance(self.o_has_children, list) or isinstance(self.o_has_children, set) or isinstance(self.o_has_children, dict): observe.unobserve(self.o_has_children, self._listener)
def _destroyed(self, *args): observe.unobserve(self.o, self._listener)