-
Notifications
You must be signed in to change notification settings - Fork 0
/
settings.py
122 lines (103 loc) · 4.84 KB
/
settings.py
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
118
119
120
121
122
from dataclasses import dataclass
from PySide6.QtCore import (
QByteArray,
QSettings
)
from PySide6.QtWidgets import (
QLineEdit,
QVBoxLayout,
QDialog,
QDialogButtonBox,
QLabel,
QComboBox,
QMessageBox,
QCheckBox
)
@dataclass
class SettingsKey:
key: str
default_value: any
class Settings:
MainWindowGeometry = SettingsKey("main_window_geometry", QByteArray())
RequestLimit = SettingsKey("request_limit", 10)
LastSaveDir = SettingsKey("last_save_dir", "")
DontAskAgainExit = SettingsKey("dont_ask_again_exit", 0)
YouTubeApiKey = SettingsKey("youtube_api_key", "")
Language = SettingsKey("language", "")
Theme = SettingsKey("theme", 0)
MainSplitterState = SettingsKey("main_splitter_state", [0, 0])
DetailsVisible = SettingsKey("details", True)
LastActiveDetailsTab = SettingsKey("last_active_details_tab", 0)
AnalyticsFollowTableSelect = SettingsKey("analytics_follow_table_select", True)
LastActiveChartIndex = SettingsKey("last_active_chart_index", 0)
def __init__(self, app_name: str):
self._impl = QSettings(QSettings.Format.IniFormat, QSettings.Scope.UserScope, app_name)
def get(self, key: SettingsKey):
if type(key.default_value) is bool:
return self._impl.value(key.key, key.default_value, type=bool)
return self._impl.value(key.key, key.default_value)
def set(self, key: SettingsKey, value: any):
self._impl.setValue(key.key, value)
class SettingsDialog(QDialog):
def __init__(self, settings: Settings, parent = None):
super().__init__(parent)
self._settings = settings
self._need_restart = False
self.setWindowTitle(self.tr("Settings"))
layout = QVBoxLayout()
yt_api_key_label = QLabel(self.tr("YouTube API Key:"))
layout.addWidget(yt_api_key_label)
self._yt_api_key_edit = QLineEdit(self._settings.get(Settings.YouTubeApiKey))
self._yt_api_key_edit.setToolTip(self.tr("Set the key to use the YouTube API for YouTube search"))
layout.addWidget(self._yt_api_key_edit)
language_label = QLabel(self.tr("Language:"))
layout.addWidget(language_label)
self._language_combo = QComboBox()
self._language_combo.setToolTip(self.tr("Set the interface language"))
self._language_combo.addItem("English")
self._language_combo.addItem("Русский")
if self._settings.get(Settings.Language) == "Ru":
self._language_combo.setCurrentIndex(1)
else:
self._language_combo.setCurrentIndex(0)
self._language_combo.currentIndexChanged.connect(self._on_language_changed)
layout.addWidget(self._language_combo)
theme_label = QLabel(self.tr("Theme:"))
layout.addWidget(theme_label)
self._theme_combo = QComboBox()
self._theme_combo.setToolTip(self.tr("Set the interface color theme"))
self._theme_combo.addItem(self.tr("System"))
self._theme_combo.addItem(self.tr("Dark"))
self._theme_combo.setCurrentIndex(int(self._settings.get(Settings.Theme)))
layout.addWidget(self._theme_combo)
analytics_label = QLabel(self.tr("Analytics:"))
layout.addWidget(analytics_label)
self._follow_for_analytics_checkbox = QCheckBox(self.tr("Follow table selections in analytics charts"))
self._follow_for_analytics_checkbox.setToolTip(self.tr("Highlight the selected item on the analytics charts"))
self._follow_for_analytics_checkbox.setChecked(self._settings.get(Settings.AnalyticsFollowTableSelect))
layout.addWidget(self._follow_for_analytics_checkbox)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(self._on_accepted)
button_box.rejected.connect(self._on_rejected)
layout.addWidget(button_box)
self.setLayout(layout)
def is_need_restart(self):
return self._need_restart
def _on_accepted(self):
self._settings.set(Settings.YouTubeApiKey, self._yt_api_key_edit.text())
if self._language_combo.currentText() == "Русский":
self._settings.set(Settings.Language, "Ru")
else:
self._settings.set(Settings.Language, "En")
self._settings.set(Settings.Theme, self._theme_combo.currentIndex())
if self._need_restart:
text = self.tr("Restart the application now to apply the selected language?")
if QMessageBox.question(self, self.windowTitle(), text) == QMessageBox.StandardButton.No:
self._need_restart = False
self._settings.set(Settings.AnalyticsFollowTableSelect, self._follow_for_analytics_checkbox.isChecked())
self.accept()
def _on_rejected(self):
self._need_restart = False
self.reject()
def _on_language_changed(self):
self._need_restart = True