Skip to content

Commit 34563f7

Browse files
committed
added persistent extra settings (#147)
1 parent a550e94 commit 34563f7

14 files changed

+700
-167
lines changed

ankimorphs/__init__.py

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@
3535
from aqt.utils import tooltip
3636
from aqt.webview import AnkiWebView
3737

38+
from . import ankimorphs_config
39+
from . import ankimorphs_globals as am_globals
3840
from . import (
39-
ankimorphs_config,
40-
ankimorphs_globals,
4141
browser_utils,
42+
debugging_utils,
4243
message_box_utils,
4344
name_file_utils,
4445
reviewing_utils,
@@ -47,6 +48,7 @@
4748
)
4849
from .ankimorphs_config import AnkiMorphsConfig, AnkiMorphsConfigFilter
4950
from .ankimorphs_db import AnkiMorphsDB
51+
from .extra_settings import ankimorphs_extra_settings, extra_settings_keys
5052
from .generators.generators_window import GeneratorWindow
5153
from .known_morphs_exporter import KnownMorphsExporterDialog
5254
from .progression.progression_window import ProgressionWindow
@@ -141,7 +143,7 @@ def load_am_profile_configs() -> None:
141143
assert mw is not None
142144

143145
profile_settings_path = Path(
144-
mw.pm.profileFolder(), ankimorphs_globals.PROFILE_SETTINGS_FILE_NAME
146+
mw.pm.profileFolder(), am_globals.PROFILE_SETTINGS_FILE_NAME
145147
)
146148
try:
147149
with open(profile_settings_path, encoding="utf-8") as file:
@@ -165,20 +167,16 @@ def init_db() -> None:
165167
def create_am_directories_and_files() -> None:
166168
assert mw is not None
167169

168-
names_file_path: Path = Path(
169-
mw.pm.profileFolder(), ankimorphs_globals.NAMES_TXT_FILE_NAME
170-
)
170+
names_file_path: Path = Path(mw.pm.profileFolder(), am_globals.NAMES_TXT_FILE_NAME)
171171
known_morphs_dir_path: Path = Path(
172-
mw.pm.profileFolder(), ankimorphs_globals.KNOWN_MORPHS_DIR_NAME
172+
mw.pm.profileFolder(), am_globals.KNOWN_MORPHS_DIR_NAME
173173
)
174174
priority_files_dir_path: Path = Path(
175-
mw.pm.profileFolder(), ankimorphs_globals.PRIORITY_FILES_DIR_NAME
175+
mw.pm.profileFolder(), am_globals.PRIORITY_FILES_DIR_NAME
176176
)
177177

178-
if not names_file_path.is_file():
179-
with open(names_file_path, mode="w", encoding="utf-8"):
180-
# just opening the file creates it
181-
pass
178+
# Create the file if it doesn't exist
179+
names_file_path.touch(exist_ok=True)
182180

183181
if not known_morphs_dir_path.exists():
184182
Path(known_morphs_dir_path).mkdir()
@@ -191,18 +189,18 @@ def register_addon_dialogs() -> None:
191189
# We use the Anki dialog manager to handle our dialogs
192190

193191
aqt.dialogs.register_dialog(
194-
name=ankimorphs_globals.SETTINGS_DIALOG_NAME, creator=SettingsDialog
192+
name=am_globals.SETTINGS_DIALOG_NAME, creator=SettingsDialog
195193
)
196194
aqt.dialogs.register_dialog(
197-
name=ankimorphs_globals.GENERATOR_DIALOG_NAME,
195+
name=am_globals.GENERATOR_DIALOG_NAME,
198196
creator=GeneratorWindow,
199197
)
200198
aqt.dialogs.register_dialog(
201-
name=ankimorphs_globals.PROGRESSION_DIALOG_NAME,
199+
name=am_globals.PROGRESSION_DIALOG_NAME,
202200
creator=ProgressionWindow,
203201
)
204202
aqt.dialogs.register_dialog(
205-
name=ankimorphs_globals.KNOWN_MORPHS_EXPORTER_DIALOG_NAME,
203+
name=am_globals.KNOWN_MORPHS_EXPORTER_DIALOG_NAME,
206204
creator=KnownMorphsExporterDialog,
207205
)
208206

@@ -242,7 +240,7 @@ def init_tool_menu_and_actions() -> None:
242240
am_tool_menu.addAction(guide_action)
243241
am_tool_menu.addAction(changelog_action)
244242

245-
if ankimorphs_globals.DEV_MODE:
243+
if am_globals.DEV_MODE:
246244
test_action = create_test_action()
247245
am_tool_menu.addAction(test_action)
248246

@@ -394,7 +392,7 @@ def rebuild_seen_morphs(_changes: OpChangesAfterUndo) -> None:
394392
################################################################
395393
AnkiMorphsDB.rebuild_seen_morphs_today()
396394

397-
if ankimorphs_globals.DEV_MODE:
395+
if am_globals.DEV_MODE:
398396
with AnkiMorphsDB() as am_db:
399397
print("Seen_Morphs:")
400398
am_db.print_table("Seen_Morphs")
@@ -444,7 +442,7 @@ def create_settings_action(am_config: AnkiMorphsConfig) -> QAction:
444442
action = QAction("&Settings", mw)
445443
action.setShortcut(am_config.shortcut_settings)
446444
action.triggered.connect(
447-
partial(aqt.dialogs.open, name=ankimorphs_globals.SETTINGS_DIALOG_NAME)
445+
partial(aqt.dialogs.open, name=am_globals.SETTINGS_DIALOG_NAME)
448446
)
449447
return action
450448

@@ -542,7 +540,7 @@ def browse_study_morphs_for_text_action(web_view: AnkiWebView, menu: QMenu) -> N
542540
selected_text = web_view.selectedText()
543541
if selected_text == "":
544542
return
545-
action = QAction(f"Browse in {ankimorphs_globals.EXTRA_FIELD_STUDY_MORPHS}", menu)
543+
action = QAction(f"Browse in {am_globals.EXTRA_FIELD_STUDY_MORPHS}", menu)
546544
action.triggered.connect(
547545
lambda: browser_utils.browse_study_morphs_for_highlighted_morph(selected_text)
548546
)
@@ -555,7 +553,7 @@ def create_generators_dialog_action(am_config: AnkiMorphsConfig) -> QAction:
555553
action.triggered.connect(
556554
partial(
557555
aqt.dialogs.open,
558-
name=ankimorphs_globals.GENERATOR_DIALOG_NAME,
556+
name=am_globals.GENERATOR_DIALOG_NAME,
559557
)
560558
)
561559
return action
@@ -567,7 +565,7 @@ def create_progression_dialog_action(am_config: AnkiMorphsConfig) -> QAction:
567565
action.triggered.connect(
568566
partial(
569567
aqt.dialogs.open,
570-
name=ankimorphs_globals.PROGRESSION_DIALOG_NAME,
568+
name=am_globals.PROGRESSION_DIALOG_NAME,
571569
)
572570
)
573571
return action
@@ -579,7 +577,7 @@ def create_known_morphs_exporter_action(am_config: AnkiMorphsConfig) -> QAction:
579577
action.triggered.connect(
580578
partial(
581579
aqt.dialogs.open,
582-
name=ankimorphs_globals.KNOWN_MORPHS_EXPORTER_DIALOG_NAME,
580+
name=am_globals.KNOWN_MORPHS_EXPORTER_DIALOG_NAME,
583581
)
584582
)
585583
return action

ankimorphs/ankimorphs_globals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
# Semantic Versioning https://semver.org/
8-
__version__ = "3.0.1"
8+
__version__ = "3.1.0"
99

1010
DEV_MODE: bool = False
1111

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from pathlib import Path
2+
3+
from aqt import mw
4+
from aqt.qt import QByteArray, QSettings # pylint:disable=no-name-in-module
5+
6+
from ..ui.generator_output_dialog_ui import Ui_GeneratorOutputDialog
7+
from ..ui.generators_window_ui import Ui_GeneratorsWindow
8+
from ..ui.known_morphs_exporter_dialog_ui import Ui_KnownMorphsExporterDialog
9+
from ..ui.progression_window_ui import Ui_ProgressionWindow
10+
from . import extra_settings_keys as keys # pylint:disable=no-name-in-module
11+
from .extra_settings_keys import (
12+
FileFormatsKeys,
13+
GeneratorsOutputKeys,
14+
GeneratorsWindowKeys,
15+
KnownMorphsExporterKeys,
16+
PreprocessKeys,
17+
ProgressionWindowKeys,
18+
)
19+
20+
21+
class AnkiMorphsExtraSettings(QSettings):
22+
def __init__(self) -> None:
23+
assert mw is not None
24+
extra_settings_path = Path(
25+
mw.pm.profileFolder(), "ankimorphs_extra_settings.ini"
26+
)
27+
super().__init__(str(extra_settings_path), QSettings.Format.IniFormat)
28+
29+
def save_generators_window_settings(
30+
self, ui: Ui_GeneratorsWindow, geometry: QByteArray
31+
) -> None:
32+
# fmt: off
33+
self.beginGroup(keys.Dialogs.GENERATORS_WINDOW)
34+
self.setValue(GeneratorsWindowKeys.WINDOW_GEOMETRY, geometry)
35+
self.setValue(GeneratorsWindowKeys.MORPHEMIZER, ui.morphemizerComboBox.currentText())
36+
self.setValue(GeneratorsWindowKeys.INPUT_DIR, ui.inputDirLineEdit.text())
37+
38+
self.beginGroup(GeneratorsWindowKeys.FILE_FORMATS)
39+
self.setValue(FileFormatsKeys.TXT, ui.txtFilesCheckBox.isChecked())
40+
self.setValue(FileFormatsKeys.SRT, ui.srtFilesCheckBox.isChecked())
41+
self.setValue(FileFormatsKeys.VTT, ui.vttFilesCheckBox.isChecked())
42+
self.setValue(FileFormatsKeys.MD, ui.mdFilesCheckBox.isChecked())
43+
self.endGroup() # file format group
44+
45+
self.beginGroup(GeneratorsWindowKeys.PREPROCESS)
46+
self.setValue(PreprocessKeys.IGNORE_SQUARE_BRACKETS, ui.squareBracketsCheckBox.isChecked())
47+
self.setValue(PreprocessKeys.IGNORE_ROUND_BRACKETS, ui.roundBracketsCheckBox.isChecked())
48+
self.setValue(PreprocessKeys.IGNORE_SLIM_ROUND_BRACKETS, ui.slimRoundBracketsCheckBox.isChecked())
49+
self.setValue(PreprocessKeys.IGNORE_NAMES_MORPHEMIZER, ui.namesMorphemizerCheckBox.isChecked())
50+
self.setValue(PreprocessKeys.IGNORE_NAMES_IN_FILE, ui.namesFileCheckBox.isChecked())
51+
self.setValue(PreprocessKeys.IGNORE_NUMBERS, ui.numbersCheckBox.isChecked())
52+
self.endGroup() # preprocess group
53+
self.endGroup() # generators window group
54+
# fmt: on
55+
56+
def save_known_morphs_exporter_settings(
57+
self, ui: Ui_KnownMorphsExporterDialog, geometry: QByteArray
58+
) -> None:
59+
# fmt: off
60+
self.beginGroup(keys.Dialogs.KNOWN_MORPHS_EXPORTER)
61+
self.setValue(KnownMorphsExporterKeys.WINDOW_GEOMETRY, geometry)
62+
self.setValue(KnownMorphsExporterKeys.OUTPUT_DIR, ui.outputLineEdit.text())
63+
self.setValue(KnownMorphsExporterKeys.LEMMA, ui.storeOnlyMorphLemmaRadioButton.isChecked())
64+
self.setValue(KnownMorphsExporterKeys.INFLECTION, ui.storeMorphLemmaAndInflectionRadioButton.isChecked())
65+
self.setValue(KnownMorphsExporterKeys.INTERVAL, ui.knownIntervalSpinBox.value())
66+
self.setValue(KnownMorphsExporterKeys.OCCURRENCES, ui.addOccurrencesColumnCheckBox.isChecked())
67+
self.endGroup()
68+
# fmt: on
69+
70+
def save_progression_window_settings(
71+
self, ui: Ui_ProgressionWindow, geometry: QByteArray
72+
) -> None:
73+
# fmt: off
74+
self.beginGroup(keys.Dialogs.PROGRESSION_WINDOW)
75+
self.setValue(KnownMorphsExporterKeys.WINDOW_GEOMETRY, geometry)
76+
self.setValue(ProgressionWindowKeys.PRIORITY_FILE, ui.morphPriorityCBox.currentText())
77+
self.setValue(ProgressionWindowKeys.LEMMA_EVALUATION, ui.lemmaRadioButton.isChecked())
78+
self.setValue(ProgressionWindowKeys.INFLECTION_EVALUATION, ui.inflectionRadioButton.isChecked())
79+
self.setValue(ProgressionWindowKeys.PRIORITY_RANGE_START, ui.minPrioritySpinBox.value())
80+
self.setValue(ProgressionWindowKeys.PRIORITY_RANGE_END, ui.maxPrioritySpinBox.value())
81+
self.setValue(ProgressionWindowKeys.BIN_SIZE, ui.binSizeSpinBox.value())
82+
self.setValue(ProgressionWindowKeys.BIN_TYPE_NORMAL, ui.normalRadioButton.isChecked())
83+
self.setValue(ProgressionWindowKeys.BIN_TYPE_CUMULATIVE, ui.cumulativeRadioButton.isChecked())
84+
self.endGroup()
85+
# fmt: on
86+
87+
def save_generator_priority_file_settings(
88+
self, ui: Ui_GeneratorOutputDialog, geometry: QByteArray
89+
) -> None:
90+
# fmt: off
91+
self.beginGroup(keys.Dialogs.GENERATOR_OUTPUT_PRIORITY_FILE)
92+
self.setValue(GeneratorsOutputKeys.WINDOW_GEOMETRY, geometry)
93+
self.setValue(GeneratorsOutputKeys.OUTPUT_FILE_PATH, ui.outputLineEdit.text())
94+
self.setValue(GeneratorsOutputKeys.LEMMA_FORMAT, ui.storeOnlyMorphLemmaRadioButton.isChecked())
95+
self.setValue(GeneratorsOutputKeys.INFLECTION_FORMAT, ui.storeMorphLemmaAndInflectionRadioButton.isChecked())
96+
self.setValue(GeneratorsOutputKeys.MIN_OCCURRENCE_SELECTED, ui.minOccurrenceRadioButton.isChecked())
97+
self.setValue(GeneratorsOutputKeys.MIN_OCCURRENCE_CUTOFF, ui.minOccurrenceSpinBox.value())
98+
self.setValue(GeneratorsOutputKeys.COMPREHENSION_SELECTED, ui.comprehensionRadioButton.isChecked())
99+
self.setValue(GeneratorsOutputKeys.COMPREHENSION_CUTOFF, ui.comprehensionSpinBox.value())
100+
self.setValue(GeneratorsOutputKeys.OCCURRENCES_COLUMN_SELECTED, ui.addOccurrencesColumnCheckBox.isChecked())
101+
self.endGroup()
102+
# fmt: on
103+
104+
def save_generator_study_plan_settings(
105+
self, ui: Ui_GeneratorOutputDialog, geometry: QByteArray
106+
) -> None:
107+
# fmt: off
108+
self.beginGroup(keys.Dialogs.GENERATOR_OUTPUT_STUDY_PLAN)
109+
self.setValue(GeneratorsOutputKeys.WINDOW_GEOMETRY, geometry)
110+
self.setValue(GeneratorsOutputKeys.OUTPUT_FILE_PATH, ui.outputLineEdit.text())
111+
self.setValue(GeneratorsOutputKeys.LEMMA_FORMAT, ui.storeOnlyMorphLemmaRadioButton.isChecked())
112+
self.setValue(GeneratorsOutputKeys.INFLECTION_FORMAT, ui.storeMorphLemmaAndInflectionRadioButton.isChecked())
113+
self.setValue(GeneratorsOutputKeys.MIN_OCCURRENCE_SELECTED, ui.minOccurrenceRadioButton.isChecked())
114+
self.setValue(GeneratorsOutputKeys.MIN_OCCURRENCE_CUTOFF, ui.minOccurrenceSpinBox.value())
115+
self.setValue(GeneratorsOutputKeys.COMPREHENSION_SELECTED, ui.comprehensionRadioButton.isChecked())
116+
self.setValue(GeneratorsOutputKeys.COMPREHENSION_CUTOFF, ui.comprehensionSpinBox.value())
117+
self.setValue(GeneratorsOutputKeys.OCCURRENCES_COLUMN_SELECTED, ui.addOccurrencesColumnCheckBox.isChecked())
118+
self.endGroup()
119+
# fmt: on
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
class Dialogs:
2+
GENERATORS_WINDOW = "generators_window"
3+
KNOWN_MORPHS_EXPORTER = "known_morphs_exporter"
4+
PROGRESSION_WINDOW = "progression_window"
5+
GENERATOR_OUTPUT_PRIORITY_FILE = "generator_output_priority_file"
6+
GENERATOR_OUTPUT_STUDY_PLAN = "generator_output_study_plan"
7+
8+
9+
class GeneratorsWindowKeys:
10+
WINDOW_GEOMETRY = "window_geometry"
11+
MORPHEMIZER = "morphemizer"
12+
FILE_FORMATS = "file_formats"
13+
PREPROCESS = "preprocess"
14+
INPUT_DIR = "input_dir"
15+
16+
17+
class FileFormatsKeys:
18+
TXT = "txt"
19+
SRT = "srt"
20+
VTT = "vtt"
21+
MD = "md"
22+
23+
24+
class PreprocessKeys:
25+
IGNORE_SQUARE_BRACKETS = "ignore_square_brackets"
26+
IGNORE_ROUND_BRACKETS = "ignore_round_brackets"
27+
IGNORE_SLIM_ROUND_BRACKETS = "ignore_slim_round_brackets"
28+
IGNORE_NAMES_MORPHEMIZER = "ignore_names_morphemizer"
29+
IGNORE_NAMES_IN_FILE = "ignore_names_in_file"
30+
IGNORE_NUMBERS = "ignore_numbers"
31+
32+
33+
class KnownMorphsExporterKeys:
34+
WINDOW_GEOMETRY = "window_geometry"
35+
OUTPUT_DIR = "output_dir"
36+
LEMMA = "lemma"
37+
INFLECTION = "inflection"
38+
INTERVAL = "interval"
39+
OCCURRENCES = "occurrences"
40+
41+
42+
class ProgressionWindowKeys:
43+
WINDOW_GEOMETRY = "window_geometry"
44+
PRIORITY_FILE = "priority_file"
45+
LEMMA_EVALUATION = "lemma_evaluation"
46+
INFLECTION_EVALUATION = "inflection_evaluation"
47+
PRIORITY_RANGE_START = "priority_range_start"
48+
PRIORITY_RANGE_END = "priority_range_end"
49+
BIN_SIZE = "bin_size"
50+
BIN_TYPE_NORMAL = "bin_type_normal"
51+
BIN_TYPE_CUMULATIVE = "bin_type_cumulative"
52+
53+
54+
class GeneratorsOutputKeys:
55+
WINDOW_GEOMETRY = "window_geometry"
56+
LEMMA_FORMAT = "lemma_format"
57+
OUTPUT_FILE_PATH = "output_file_path"
58+
INFLECTION_FORMAT = "inflection_format"
59+
MIN_OCCURRENCE_SELECTED = "min_occurrence_selected"
60+
MIN_OCCURRENCE_CUTOFF = "min_occurrence_cutoff"
61+
COMPREHENSION_SELECTED = "comprehension_selected"
62+
COMPREHENSION_CUTOFF = "comprehension_cutoff"
63+
OCCURRENCES_COLUMN_SELECTED = "occurrences_column_selected"

0 commit comments

Comments
 (0)