예제 #1
0
 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("", "", "")
예제 #2
0
 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]
예제 #3
0
  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)
예제 #4
0
 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()
예제 #5
0
 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)
예제 #6
0
 def _destroyed(self, *args):
   observe.unobserve(self.o, self._listener)