summaryrefslogtreecommitdiff
path: root/styles.py
blob: ecaf66418c7152bc582f1745a33802a7fe0ee652 (plain)
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)