summaryrefslogtreecommitdiff
path: root/styles.py
blob: b5574c5b4c8bb4f0a94e094c33149fac1af635f4 (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
112
113
114
115
116
117
from pathlib import Path
from time import sleep
import os
from Xlib import X

from clipboard import copy, get
from constants import TARGET
from config import config, CONFIG_PATH
from rofi import rofi
import normal

pressed = []

def create_if_not_exists(directory):
    if not directory.exists():
        directory.mkdir(parents=True)
    return directory

data_dirs = {
    'style': create_if_not_exists(CONFIG_PATH / 'styles'),
    'object': create_if_not_exists(CONFIG_PATH / 'objects'),
}

rofi_theme_params = ['-theme', config['rofi_theme']] if ('rofi_theme' in config and config['rofi_theme'] is not None) else []

print(data_dirs)

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))


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,
        rofi_theme_params,
        fuzzy=False
    )

    if index != -1:
        # File exists
        _, index, yn = rofi(
            f'Overwrite {name}?',
            ['y', 'n'],
            rofi_theme_params + ['-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)