summaryrefslogtreecommitdiffstatshomepage
path: root/scripts/build/complay.py
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-07-29 15:17:14 +1000
committer Vas Crabb <vas@vastheman.com>2017-07-29 15:17:14 +1000
commit3a5c5d15c717e13c5bea47614096defd50db1146 (patch)
tree486c1e4e28d523a9baf5054520df8d9068ede5ec /scripts/build/complay.py
parent9cea5e1518bcd59181cd3428d67b3d4cfa06fa98 (diff)
Add support for layout item groups, replace simple_list with more
appropriate containers, remove misleading const qualifiers, reduce repeated XML walking. (nw) Groups aren't parameterised, so they aren't as useful as they could be (yes, it's on my TODO list). However, it's already useful for putting a common set of elements in multiple views, potentially at different locations/scales. See intlc44.lay and intlc440.lay for examples of the level of copypasta this can eliminate. Be aware that groups with explicit bounds don't clip thair content, it's only used for calucating the transform matrix.
Diffstat (limited to 'scripts/build/complay.py')
-rw-r--r--scripts/build/complay.py89
1 files changed, 62 insertions, 27 deletions
diff --git a/scripts/build/complay.py b/scripts/build/complay.py
index 4332a952c27..af5003581e6 100644
--- a/scripts/build/complay.py
+++ b/scripts/build/complay.py
@@ -101,8 +101,10 @@ class LayoutChecker(Minifyer):
self.locator = None
self.errors = 0
self.elements = { }
+ self.groups = { }
self.views = { }
- self.referenced = { }
+ self.referenced_elements = { }
+ self.referenced_groups = { }
self.have_bounds = [ ]
self.have_color = [ ]
@@ -163,6 +165,38 @@ class LayoutChecker(Minifyer):
except:
self.handleError('Element color attribute %s "%s" is not numeric' % (name, attrs[name]))
+ def checkGroupViewItem(self, name, attrs):
+ if name in self.OBJECTS:
+ if 'element' not in attrs:
+ self.handleError('Element %s missing attribute element', (name, ))
+ elif attrs['element'] not in self.referenced_elements:
+ self.referenced_elements[attrs['element']] = self.formatLocation()
+ self.in_object = True
+ self.have_bounds.append(False)
+ elif 'screen' == name:
+ if 'index' in attrs:
+ try:
+ index = long(attrs['index'])
+ if 0 > index:
+ self.handleError('Element screen attribute index "%s" is negative' % (attrs['index'], ))
+ except:
+ self.handleError('Element screen attribute index "%s" is not an integer' % (attrs['index'], ))
+ self.in_object = True
+ self.have_bounds.append(False)
+ elif 'group' == name:
+ if 'ref' not in attrs:
+ self.handleError('Element group missing attribute ref')
+ elif attrs['ref'] not in self.referenced_groups:
+ self.referenced_groups[attrs['ref']] = self.formatLocation()
+ self.in_object = True
+ self.have_bounds.append(False)
+ elif 'bounds' == name:
+ self.checkBounds(attrs)
+ self.ignored_depth = 1
+ else:
+ self.handleError('Encountered unexpected element %s' % (name, ))
+ self.ignored_depth = 1
+
def setDocumentLocator(self, locator):
self.locator = locator
super(LayoutChecker, self).setDocumentLocator(locator)
@@ -170,6 +204,7 @@ class LayoutChecker(Minifyer):
def startDocument(self):
self.in_layout = False
self.in_element = False
+ self.in_group = False
self.in_view = False
self.in_shape = False
self.in_object = False
@@ -179,8 +214,10 @@ class LayoutChecker(Minifyer):
def endDocument(self):
self.locator = None
self.elements.clear()
+ self.groups.clear()
self.views.clear()
- self.referenced.clear()
+ self.referenced_elements.clear()
+ self.referenced_groups.clear()
del self.have_bounds[:]
del self.have_color[:]
super(LayoutChecker, self).endDocument()
@@ -238,29 +275,8 @@ class LayoutChecker(Minifyer):
self.have_color.append(False)
else:
self.ignored_depth = 1
- elif self.in_view:
- if name in self.OBJECTS:
- if 'element' not in attrs:
- self.handleError('Element %s missing attribute element', (name, ))
- elif attrs['element'] not in self.referenced:
- self.referenced[attrs['element']] = self.formatLocation()
- self.in_object = True
- self.have_bounds.append(False)
- elif 'screen' == name:
- if 'index' in attrs:
- try:
- index = long(attrs['index'])
- if 0 > index:
- self.handleError('Element screen attribute index "%s" is negative' % (attrs['index'], ))
- except:
- self.handleError('Element screen attribute index "%s" is not an integer' % (attrs['index'], ))
- self.in_object = True
- self.have_bounds.append(False)
- elif 'bounds' == name:
- self.checkBounds(attrs)
- self.ignored_depth = 1
- else:
- self.ignored_depth = 1
+ elif self.in_group or self.in_view:
+ self.checkGroupViewItem(name, attrs)
elif 'element' == name:
if 'name' not in attrs:
self.handleError('Element element missing attribute name')
@@ -270,6 +286,16 @@ class LayoutChecker(Minifyer):
else:
self.elements[attrs['name']] = self.formatLocation()
self.in_element = True
+ elif 'group' == name:
+ if 'name' not in attrs:
+ self.handleError('Element group missing attribute name')
+ else:
+ if attrs['name'] in self.groups:
+ self.handleError('Element group has duplicate name (previous %s)' % (self.groups[attrs['name']], ))
+ else:
+ self.groups[attrs['name']] = self.formatLocation()
+ self.in_group = True
+ self.have_bounds.append(False)
elif 'view' == name:
if 'name' not in attrs:
self.handleError('Element view missing attribute name')
@@ -280,7 +306,10 @@ class LayoutChecker(Minifyer):
self.views[attrs['name']] = self.formatLocation()
self.in_view = True
self.have_bounds.append(False)
+ elif 'script' == name:
+ self.ignored_depth = 1
else:
+ self.handleError('Encountered unexpected element %s' % (name, ))
self.ignored_depth = 1
super(LayoutChecker, self).startElement(name, attrs)
@@ -296,13 +325,19 @@ class LayoutChecker(Minifyer):
self.have_color.pop()
elif self.in_element:
self.in_element = False
+ elif self.in_group:
+ self.in_group = False
+ self.have_bounds.pop()
elif self.in_view:
self.in_view = False
self.have_bounds.pop()
elif self.in_layout:
- for element in self.referenced:
+ for element in self.referenced_elements:
if element not in self.elements:
- self.handleError('Element "%s" not found (first referenced at %s)' % (element, self.referenced[element]))
+ self.handleError('Element "%s" not found (first referenced at %s)' % (element, self.referenced_elements[element]))
+ for group in self.referenced_groups:
+ if group not in self.groups:
+ self.handleError('Group "%s" not found (first referenced at %s)' % (group, self.referenced_groups[group]))
self.in_layout = False
super(LayoutChecker, self).endElement(name)