diff options
author | 2017-07-29 15:17:14 +1000 | |
---|---|---|
committer | 2017-07-29 15:17:14 +1000 | |
commit | 3a5c5d15c717e13c5bea47614096defd50db1146 (patch) | |
tree | 486c1e4e28d523a9baf5054520df8d9068ede5ec /scripts/build/complay.py | |
parent | 9cea5e1518bcd59181cd3428d67b3d4cfa06fa98 (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.py | 89 |
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) |