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
|
import dataclasses
import json
import os
import readline
import sys
from typing import Mapping, Tuple, Union
import epy_reader.settings as settings
from epy_reader.models import AppData, Key
class Config(AppData):
def __init__(self):
setting_dict = dataclasses.asdict(settings.Settings())
keymap_dict = dataclasses.asdict(settings.CfgDefaultKeymaps())
keymap_builtin_dict = dataclasses.asdict(settings.CfgBuiltinKeymaps())
if os.path.isfile(self.filepath):
with open(self.filepath) as f:
cfg_user = json.load(f)
setting_dict = Config.update_dict(setting_dict, cfg_user["Setting"])
keymap_dict = Config.update_dict(keymap_dict, cfg_user["Keymap"])
else:
self.save({"Setting": setting_dict, "Keymap": keymap_dict})
keymap_dict_tuple = {k: tuple(v) for k, v in keymap_dict.items()}
keymap_updated = {
k: tuple([Key(i) for i in v])
for k, v in Config.update_keys_tuple(keymap_dict_tuple, keymap_builtin_dict).items()
}
if sys.platform == "win32":
setting_dict["PageScrollAnimation"] = False
self.setting = settings.Settings(**setting_dict)
self.keymap = settings.Keymap(**keymap_updated)
# to build help menu text
self.keymap_user_dict = keymap_dict
if os.path.isdir(self.prefix):
self.input_history_file = os.path.join(self.prefix, 'readline_history.txt')
if os.path.isfile(self.input_history_file):
readline.read_history_file(self.input_history_file)
readline.set_history_length(1000)
@property
def filepath(self) -> str:
return os.path.join(self.prefix, "configuration.json") if self.prefix else os.devnull
def save(self, cfg_dict):
with open(self.filepath, "w") as file:
json.dump(cfg_dict, file, indent=2)
@staticmethod
def update_dict(
old_dict: Mapping[str, Union[str, int, bool]],
new_dict: Mapping[str, Union[str, int, bool]],
place_new=False,
) -> Mapping[str, Union[str, int, bool]]:
"""Returns a copy of `old_dict` after updating it with `new_dict`"""
result = {**old_dict}
for k, _ in new_dict.items():
if k in result:
result[k] = new_dict[k]
elif place_new:
result[k] = new_dict[k]
return result
@staticmethod
def update_keys_tuple(
old_keys: Mapping[str, Tuple[str, ...]],
new_keys: Mapping[str, Tuple[str, ...]],
place_new: bool = False,
) -> Mapping[str, Tuple[str, ...]]:
"""Returns a copy of `old_keys` after updating it with `new_keys`
by appending the tuple value and removes duplicate"""
result = {**old_keys}
for k, _ in new_keys.items():
if k in result:
result[k] = tuple(set(result[k] + new_keys[k]))
elif place_new:
result[k] = tuple(set(new_keys[k]))
return result
|