summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lulua/render.py78
1 files changed, 44 insertions, 34 deletions
diff --git a/lulua/render.py b/lulua/render.py
index 3bde0b7..51a3a9e 100644
--- a/lulua/render.py
+++ b/lulua/render.py
@@ -38,7 +38,7 @@ RendererSettings = namedtuple ('RendererSetting', ['buttonMargin', 'middleGap',
class Renderer:
""" Keyboard to SVG renderer """
- __slots__ = ('keyboard', 'layout', 'settings', 'cursor', 'writer', 'keyHighlight')
+ __slots__ = ('keyboard', 'layout', 'settings', 'writer', 'keyHighlight')
defaultSettings = RendererSettings (
buttonMargin=20,
@@ -56,53 +56,63 @@ class Renderer:
self.settings = settings or self.defaultSettings
self.keyHighlight = keyHighlight or {}
- self.cursor = [0, 0]
-
def render (self):
- maxWidth = 0
- maxHeight = 0
+ """ Render the entire layout, return single SVG <g> container and its (width, height) """
+ settings = self.settings
+
+ btnToPos, (width, height) = self._calcDimensions (self.keyboard)
+
+ g = svgwrite.container.Group ()
+
+ for btn in self.keyboard.keys ():
+ g.add (self._createButton (btn, btnToPos[btn]))
+
+ return g, (width, height)
+
+ def _calcDimensions (self, keyboard):
+ """ Create button to position map and keyboard dimensions """
+ m = {}
settings = self.settings
- self.cursor = [0, 0]
+ # keyboard dimensions
+ maxWidth = 0
+ maxHeight = 0
+ # current position
+ cursor = [0, 0]
- # compute row widths so we can apply margin correction, balancing
- # out their widths
rowWidth = []
for l, r in self.keyboard:
- w = 0
for btn in l:
- w += self.buttonWidth (btn) + settings.buttonMargin
- w += settings.middleGap
- for btn in r:
- w += self.buttonWidth (btn) + settings.buttonMargin
- w -= settings.buttonMargin
- rowWidth.append (w)
- logging.info (f'row width {rowWidth}')
+ assert btn not in m
+ m[btn] = tuple (cursor)
+ cursor[0] += self.buttonWidth (btn) + settings.buttonMargin
- g = svgwrite.container.Group ()
+ cursor[0] += settings.middleGap
- for l, r in self.keyboard:
- for btn in l:
- b, width = self._addButton (btn)
- g.add (b)
- self.cursor[0] += width + settings.buttonMargin
- self.cursor[0] += settings.middleGap
for btn in r:
- b, width = self._addButton (btn)
- g.add (b)
- self.cursor[0] += width + settings.buttonMargin
- self.cursor[1] += settings.buttonWidth + settings.buttonMargin
- maxWidth = max (self.cursor[0], maxWidth)
- self.cursor[0] = 0
- maxHeight = self.cursor[1]
+ assert btn not in m
+ m[btn] = tuple (cursor)
+ cursor[0] += self.buttonWidth (btn) + settings.buttonMargin
+
+ # button height is always the same as default width
+ cursor[1] += settings.buttonWidth + settings.buttonMargin
+ maxWidth = max (cursor[0], maxWidth)
+ rowWidth.append (cursor[0])
+ cursor[0] = 0
+ maxHeight = cursor[1]
- return g, (maxWidth, maxHeight)
+ logging.info (f'row width {rowWidth}')
+
+ return m, (maxWidth, maxHeight)
def buttonWidth (self, btn):
+ """ Calculate button width """
return btn.width * self.settings.buttonWidth
- def _addButton (self, btn):
- xoff, yoff = self.cursor
+ def _createButton (self, btn, position):
+ """ Render a single button """
+
+ xoff, yoff = position
settings = self.settings
width = self.buttonWidth (btn)
@@ -212,7 +222,7 @@ class Renderer:
t.add (svgwrite.text.TSpan (text, class_=style, direction='rtl'))
g.add (t)
- return g, width
+ return g
def unique (l, key):
return dict ((key (v), v) for v in l).values ()