aboutsummaryrefslogtreecommitdiffstats
path: root/src/epy_reader/config.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/epy_reader/config.py')
-rw-r--r--src/epy_reader/config.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/epy_reader/config.py b/src/epy_reader/config.py
new file mode 100644
index 0000000..db70a98
--- /dev/null
+++ b/src/epy_reader/config.py
@@ -0,0 +1,80 @@
+import dataclasses
+import json
+import os
+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
+
+ @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