Skip to content

Commit

Permalink
More intuitive canvas item creation. cleanup in parser.
Browse files Browse the repository at this point in the history
  • Loading branch information
amolenaar committed Jan 19, 2010
1 parent 50cbc88 commit b562bfa
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 25 deletions.
6 changes: 2 additions & 4 deletions gaphor/storage/parser.py
Expand Up @@ -64,7 +64,6 @@ def get(self, key):
return None

class element(base):
#__slots__ = ('id', 'type', 'canvas', 'values', 'references')

def __init__(self, id, type):
base.__init__(self)
Expand All @@ -73,14 +72,12 @@ def __init__(self, id, type):
self.canvas = None

class canvas(base):
#__slots__ = ('canvasitems', 'values', 'references')

def __init__(self):
base.__init__(self)
self.canvasitems = []

class canvasitem(base):
#__slots__ = ('id', 'type', 'canvasitems', 'values', 'references')

def __init__(self, id, type):
base.__init__(self)
Expand Down Expand Up @@ -191,9 +188,10 @@ def startElement(self, name, attrs):
elif state in (CANVAS, ITEM) and name == 'item':
id = attrs['id']
c = canvasitem(id, attrs['type'])
assert id not in self.elements.keys(), '%s already defined' % (id) #, self.elements[id])
assert id not in self.elements.keys(), '%s already defined' % id
self.elements[id] = c
self.peek().canvasitems.append(c)
print 'push', c.type, self.peek()
self.push(c, ITEM)

# Store the attribute name on the stack, so we can use it later
Expand Down
36 changes: 15 additions & 21 deletions gaphor/storage/storage.py
Expand Up @@ -207,6 +207,19 @@ def update_status_queue(_n=[0]):

# First create elements and canvas items in the factory
# The elements are stored as attribute 'element' on the parser objects:

def create_canvasitems(canvas, canvasitems, parent=None):
"""
Canvas is a read gaphas.Canvas, items is a list of parser.canvasitem's
"""
for item in canvasitems:
print 'create item', item.type, 'with parent', parent
cls = getattr(items, item.type)
item.element = diagram.create_as(cls, item.id)
canvas.add(item.element, parent=parent)
assert canvas.get_parent(item.element) is parent
create_canvasitems(canvas, item.canvasitems, parent=item.element)

for id, elem in elements.items():
st = update_status_queue()
if st: yield st
Expand All @@ -216,36 +229,17 @@ def update_status_queue(_n=[0]):
elem.element = factory.create_as(cls, id)
if elem.canvas:
elem.element.canvas.block_updates = True
elif isinstance(elem, parser.canvasitem):
cls = getattr(items, elem.type)
#log.debug('Creating canvas item for %s (%s)' % (elem, elem.id))
elem.element = diagram.create_as(cls, id)
else:
create_canvasitems(elem.element.canvas, elem.canvas.canvasitems)
elif not isinstance(elem, parser.canvasitem):
raise ValueError, 'Item with id "%s" and type %s can not be instantiated' % (id, type(elem))

#log.info('0% ... 33%')

#log.debug("Still have %d elements" % len(elements))

# load attributes and create references:
for id, elem in elements.items():
st = update_status_queue()
if st: yield st
# Ensure that all elements have their element instance ready...
assert hasattr(elem, 'element')

# establish parent/child relations on canvas items:
if isinstance(elem, parser.element) and elem.canvas:
for item in elem.canvas.canvasitems:
assert item in elements.values(), 'Item %s (%s) is a canvas item, but it is not in the parsed objects table' % (item, item.id)
elem.element.canvas.add(item.element)

# Also create nested canvas items:
if isinstance(elem, parser.canvasitem):
for item in elem.canvasitems:
assert item in elements.values(), 'Item %s (%s) is a canvas item, but it is not in the parsed objects table' % (item, item.id)
elem.element.canvas.add(item.element, parent=elem.element)

# load attributes and references:
for name, value in elem.values.items():
try:
Expand Down

0 comments on commit b562bfa

Please sign in to comment.