1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
from pathlib import Path
from time import sleep
import os
from Xlib import X
from clipboard import copy, get
from constants import TARGET
from rofi import rofi
import normal
pressed = []
script_path = Path(os.path.realpath(__file__)).parents[0]
data_dirs = {
'style': script_path / 'data' / 'styles',
'object': script_path / 'data' / 'objects',
}
def check(type_, self, name):
files = list(data_dirs[type_].iterdir())
names = [f.stem for f in files]
filtered = list(i for i, n in enumerate(names) if n.startswith(name))
if len(filtered) == 0:
pressed.clear()
return back_to_normal(self)
if len(filtered) == 1:
index = filtered[0]
copy(files[index].read_text(), target=TARGET)
if type_ == 'style':
self.press('v', X.ShiftMask | X.ControlMask)
else:
self.press('v', X.ControlMask)
sleep(0.5) # Give the user some time when an object is added.
return back_to_normal(self)
def back_to_normal(self):
self.mode = normal.normal_mode
pressed.clear()
def paste_mode(type_, self, event, char):
print('paste mode')
if event.state & X.ControlMask:
# there are modifiers
# eg. X.ControlMask
# ~or X.ShiftMask~
return
if not char:
return
if event.type != X.KeyRelease:
return
if char == 'Escape':
if len(pressed) == 0:
return back_to_normal(self)
else:
pressed.clear()
else:
pressed.append(char)
return check(type_, self, ''.join(pressed))
ROFI_THEME = '~/.config/rofi/ribbon.rasi'
def save_mode(type_, self):
self.press('c', X.ControlMask)
svg = get(TARGET)
if not 'svg' in svg:
return
directory = data_dirs[type_]
files = list(directory.iterdir())
names = [f.stem for f in files]
_, index, name = rofi(
'Save as',
names,
['-theme', ROFI_THEME],
fuzzy=False
)
if index != -1:
# File exists
_, index, yn = rofi(
f'Overwrite {name}?',
['y', 'n'],
['-theme', ROFI_THEME, '-auto-select'],
fuzzy=False
)
if yn == 'n':
return
(directory / f'{name}.svg').write_text(get(TARGET))
def style_mode(self, event, char):
paste_mode('style', self, event, char)
def object_mode(self, event, char):
paste_mode('object', self, event, char)
def save_style_mode(self):
save_mode('style', self)
def save_object_mode(self):
save_mode('object', self)
|