|
| 1 | +from copy import deepcopy |
1 | 2 | from dataclasses import dataclass |
2 | 3 | from typing import Callable, TypeVar, TextIO |
3 | 4 | from active_window_checker import WinTrackerSettings |
@@ -31,35 +32,41 @@ def __init__(self): |
31 | 32 | super().__init__(ConfigSyncer("settings", UserSettings())) |
32 | 33 | self._syncer.on_file_reloaded = self.on_settings_changed |
33 | 34 | self._change_handlers: list[tuple[OPTION_PATH, OPTION_CHANGE_HANDLER]] = list() |
34 | | - self._old_data = None |
| 35 | + self._old_data = deepcopy(self.settings) |
| 36 | + self._loaded_data = deepcopy(self.settings) |
35 | 37 |
|
36 | 38 | def setup(self): |
37 | 39 | self._syncer.start() |
38 | 40 | self._syncer.preserve_on_update() |
39 | 41 |
|
40 | 42 | @property |
41 | | - def settings(self): |
| 43 | + def settings(self) -> UserSettings: |
42 | 44 | return self._syncer.data |
43 | 45 |
|
44 | 46 | def on_settings_changed(self): |
45 | | - if self._old_data is None: |
46 | | - self._old_data = self._syncer.data |
47 | | - return |
48 | | - |
| 47 | + self._loaded_data = deepcopy(self.settings) |
49 | 48 | for path, handler in self._change_handlers: |
50 | | - new_value = path(self._syncer.data) |
| 49 | + new_value = path(self.settings) |
51 | 50 | if path(self._old_data) != new_value: |
52 | 51 | handler(new_value) |
| 52 | + self._old_data = deepcopy(self.settings) |
53 | 53 |
|
54 | | - self._old_data = self._syncer.data |
| 54 | + def save(self): |
| 55 | + if self._loaded_data != self.settings: |
| 56 | + super().save() |
| 57 | + self._loaded_data = deepcopy(self.settings) |
| 58 | + self._old_data = deepcopy(self.settings) |
55 | 59 |
|
56 | 60 | def add_option_change_handler(self, |
57 | 61 | path: OPTION_PATH, |
58 | | - handler: OPTION_CHANGE_HANDLER): |
| 62 | + handler: OPTION_CHANGE_HANDLER, |
| 63 | + initial=False): |
59 | 64 | self._change_handlers.append((path, handler)) |
| 65 | + if initial: |
| 66 | + handler(path(self._syncer.data)) |
60 | 67 |
|
61 | 68 |
|
62 | | -class ConfigSyncer(DataFileSyncer): |
| 69 | +class ConfigSyncer(DataFileSyncer[UserSettings]): |
63 | 70 | JSON_DUMPER_KWARGS = dict( |
64 | 71 | strip_privates=True, |
65 | 72 | strip_properties=True |
|
0 commit comments