예제 #1
0
 def test_object_1(self):
   c = C()
   observe.observe(c, self.listener)
   observe.scan()
   assert not self.listened
   c.x = 1
   observe.scan()
   assert self.listened == (c, object, {"x" : 1}, {})
예제 #2
0
 def test_object_2(self):
   c = C()
   observe.observe(c, self.listener)
   observe.scan()
   assert not self.listened
   c.x = 1
   c.y = "e"
   observe.scan()
   assert self.listened == (c, object, {"x" : 1, "y" : "e"}, {})
예제 #3
0
 def test_list_1(self):
   c = [0]
   observe.observe(c, self.listener)
   observe.scan()
   assert not self.listened
   c.append(1)
   observe.scan()
   assert self.listened == (c, list, [0, 1], [0])
   c.remove(0)
   observe.scan()
   assert self.listened == (c, list, [1], [0, 1])
예제 #4
0
 def test_set_1(self):
   c = set([0])
   observe.observe(c, self.listener)
   observe.scan()
   assert not self.listened
   c.add(1)
   observe.scan()
   assert self.listened == (c, set, set([0, 1]), set([0]))
   c.remove(0)
   observe.scan()
   assert self.listened == (c, set, set([1]), set([0, 1]))
예제 #5
0
  def __init__(self, parent_node, o):
    self.descr             = introsp.description(o.__class__)
    self.o                 = o
    self.o_children_getter = self.descr.children_getter_of(self.o)
    self.o_children        = None
    self.o_has_children    = self.descr.has_children(self.o)
    super(HierarchyNode, self).__init__(parent_node)
    
    observe.observe(self.o, self._listener)

    if isinstance(self.o_has_children, list) or isinstance(self.o_has_children, set) or isinstance(self.o_has_children, dict):
      observe.observe(self.o_has_children, self._listener)
예제 #6
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("", "", "")
예제 #7
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]
예제 #8
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)
예제 #9
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()