diff options
| author | Gilles Castel <gilles@castel.dev> | 2019-04-27 16:15:32 +0200 |
|---|---|---|
| committer | Gilles Castel <gilles@castel.dev> | 2019-04-27 16:15:32 +0200 |
| commit | b3aa98214b3355d08c9a8bdded065d8d0095cfaa (patch) | |
| tree | 269c15e73762994d08e61cd96e57164779f4880d /normal.py | |
| parent | cf3c0c7bc6aa0abeed08dec8c49e740064abcce3 (diff) | |
Clean up some code, add some comments
Diffstat (limited to 'normal.py')
| -rw-r--r-- | normal.py | 180 |
1 files changed, 91 insertions, 89 deletions
@@ -6,7 +6,13 @@ from vim import open_vim import text import styles +# Set of pressed keys pressed = set() + + +# This is a list of received events that haven't been handled yet. +# Only when the user releases a key, the script knows what it should do. +# Then it either discards the preceding events, or replays them events = [] def event_to_string(self, event): @@ -30,87 +36,79 @@ def replay(self): self.disp.flush() self.disp.sync() - events.clear() - pressed.clear() - def normal_mode(self, event, char): events.append(event) - if event.type == X.KeyPress: - if char: - pressed.add(event_to_string(self, event)) - - elif event.type == X.KeyRelease: - handled = False - - if len(pressed) >= 2: - fire(self, pressed) - handled = True - - if len(pressed) == 1: - ev = next(iter(pressed)) - - if ev == 't': - open_vim(self, compile_latex=False) - handled = True - - if ev == 'Shift+t': - open_vim(self, compile_latex=True) - handled = True - - if ev == 'a': - self.mode = styles.object_mode - handled = True - - if ev == 'Shift+a': - styles.save_object_mode(self) - handled = True + if event.type == X.KeyPress and char: + pressed.add(event_to_string(self, event)) + return - if ev == 's': - self.mode = styles.style_mode - handled = True + if event.type != X.KeyRelease: + return - if ev == 'Shift+s': - styles.save_style_mode(self) - handled = True + if len(pressed) > 1: + paste_style(self, pressed) - if ev == 'w': - self.press('p') - handled = True + if len(pressed) == 1: + # Get the only element in pressed + ev = next(iter(pressed)) + handled = handle_single_key(self, ev) + if not handled: + replay(self) - if ev == 'x': - self.press('percent', X.ShiftMask) - handled = True + events.clear() + pressed.clear() - if ev == 'f': - self.press('b') - handled = True +def handle_single_key(self, ev): + if ev == 't': + open_vim(self, compile_latex=False) + elif ev == 'Shift+t': + # Vim mode prerendered + open_vim(self, compile_latex=True) + elif ev == 'a': + # Add objects mode + self.mode = styles.object_mode + elif ev == 'Shift+a': + # Save objects mode + styles.save_object_mode(self) + elif ev == 's': + # Apply style mode + self.mode = styles.style_mode + elif ev == 'Shift+s': + # Save style mode + styles.save_style_mode(self) + elif ev == 'w': + # Pencil + self.press('p') + elif ev == 'x': + # Snap + self.press('percent', X.ShiftMask) + elif ev == 'f': + # Bezier + self.press('b') + elif ev == 'z': + # Undo + self.press('z', X.ControlMask) + elif ev == 'Shift+z': + # Delete + self.press('Delete') + elif ev == '`': + # Disabled mode + self.press('t') + self.mode = text.text_mode + else: + # Not handled + return False + return True - if ev == 'z': - self.press('z', X.ControlMask) - handled = True +def paste_style(self, combination): + """ - if ev == 'Shift+z': - self.press('Delete') - handled = True + This creates the style depending on the combination of keys. - if ev == '`': - self.press('t') - self.mode = text.text_mode - handled = True + """ - if handled: - events.clear() - pressed.clear() - else: - replay(self) - else: - pass - # print("hu?") - - -def fire(self, combination): # Stolen from TikZ pt = 1.327 # pixels w = 0.4 * pt @@ -174,35 +172,39 @@ def fire(self, combination): if style['fill'] == 'none' and style['stroke'] == 'none': return - svg = ''' -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg> -''' + # Start creation of the svg. + # Later on, we'll write this svg to the clipboard, and send Ctrl+Shift+V to + # Inkscape, to paste this style. - # Arrow style stolen from tikz + svg = ''' + <?xml version="1.0" encoding="UTF-8" standalone="no"?> + <svg> + ''' + # If a marker is applied, add its definition to the clipboard + # Arrow styles stolen from tikz if ('marker-end' in style and style['marker-end'] != 'none') or \ ('marker-start' in style and style['marker-start'] != 'none'): svg += f''' -<defs id="marker-defs"> -<marker -id="marker-arrow-{w}" -orient="auto-start-reverse" -refY="0" refX="0" -markerHeight="1.690" markerWidth="0.911"> - <g transform="scale({(2.40 * w + 3.87)/(4.5*w)})"> - <path - d="M -1.55415,2.0722 C -1.42464,1.29512 0,0.1295 0.38852,0 0,-0.1295 -1.42464,-1.29512 -1.55415,-2.0722" - style="fill:none;stroke:#000000;stroke-width:{0.6};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - </g> -</marker> -</defs> -''' + <defs id="marker-defs"> + <marker + id="marker-arrow-{w}" + orient="auto-start-reverse" + refY="0" refX="0" + markerHeight="1.690" markerWidth="0.911"> + <g transform="scale({(2.40 * w + 3.87)/(4.5*w)})"> + <path + d="M -1.55415,2.0722 C -1.42464,1.29512 0,0.1295 0.38852,0 0,-0.1295 -1.42464,-1.29512 -1.55415,-2.0722" + style="fill:none;stroke:#000000;stroke-width:{0.6};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + </g> + </marker> + </defs> + ''' style_string = ';'.join('{}: {}'.format(key, value) for key, value in sorted(style.items(), key=lambda x: x[0]) ) svg += f'<inkscape:clipboard style="{style_string}" /></svg>' - + copy(svg, target=TARGET) self.press('v', X.ControlMask | X.ShiftMask) |
