summaryrefslogtreecommitdiff
path: root/normal.py
diff options
context:
space:
mode:
authorGilles Castel <gilles@castel.dev>2019-04-27 16:15:32 +0200
committerGilles Castel <gilles@castel.dev>2019-04-27 16:15:32 +0200
commitb3aa98214b3355d08c9a8bdded065d8d0095cfaa (patch)
tree269c15e73762994d08e61cd96e57164779f4880d /normal.py
parentcf3c0c7bc6aa0abeed08dec8c49e740064abcce3 (diff)
Clean up some code, add some comments
Diffstat (limited to 'normal.py')
-rw-r--r--normal.py180
1 files changed, 91 insertions, 89 deletions
diff --git a/normal.py b/normal.py
index 824f9c2..e294b7e 100644
--- a/normal.py
+++ b/normal.py
@@ -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)