diff --git a/TSH.exe b/TSH.exe index 960940bcc..048bdb2ca 100644 Binary files a/TSH.exe and b/TSH.exe differ diff --git a/layout/settings_map.json b/layout/settings_map.json new file mode 100644 index 000000000..8b2a7d700 --- /dev/null +++ b/layout/settings_map.json @@ -0,0 +1,43 @@ +{ + "assets": { + "type": "asset" + }, + "japanese_transcription": { + "enabled": { + "type": "bool", + "default": true + }, + "to": { + "type": "combobox", + "options": [ + "romaji", + "haragana", + "katakana" + ], + "default": "romaji" + }, + "mode": { + "type": "combobox", + "options": [ + "normal", + "spaced", + "okurigana", + "furigana" + ], + "default": "normal" + }, + "romajiSystem": { + "type": "combobox", + "options": [ + "nippon", + "passport", + "hepburn" + ], + "default": "nippon" + } + }, + "automatic_theme": { + "type": "bool", + "default": false + } +} \ No newline at end of file diff --git a/src/Settings/SettingsWidget.py b/src/Settings/SettingsWidget.py index 4ecd37785..f2ddd8cc5 100644 --- a/src/Settings/SettingsWidget.py +++ b/src/Settings/SettingsWidget.py @@ -1,6 +1,20 @@ +from qtpy.QtGui import * from qtpy.QtWidgets import * +from qtpy.QtCore import * from ..TSHHotkeys import TSHHotkeys from ..SettingsManager import SettingsManager +from dataclasses import dataclass +from ..TSHGameAssetManager import TSHGameAssetManager + + +@dataclass +class SETTINGS: + name: str = None + path: str = None + type: str = None + default: any = None + callback: callable = lambda: None + options: list = None class SettingsWidget(QWidget): @@ -16,49 +30,103 @@ def __init__(self, settingsBase="", settings=[]): # Set the layout for the widget self.setLayout(layout) + # Keep reference of all settings related to assets + self.assetsSettings = [] + for setting in settings: - self.AddSetting(*setting) + self.AddSetting(setting) + + TSHGameAssetManager.instance.signals.onLoad.connect(self.GamesReloaded) - def AddSetting(self, name: str, setting: str, type: str, defaultValue, callback=lambda: None): + def GamesReloaded(self): + for (gameCombo, assetCombo) in self.assetsSettings: + gameCombo.clear() + + for (key, val) in TSHGameAssetManager.instance.games.items(): + item = QStandardItem() + item.setText(f'{val.get("name")} ({key})') + item.setData(val) + gameCombo.model().appendRow(item) + + def AddSetting(self, settings: SETTINGS = SETTINGS()): lastRow = self.layout().rowCount() - self.layout().addWidget(QLabel(name), lastRow, 0) + self.layout().addWidget(QLabel(settings.name), lastRow, 0) resetButton = QPushButton( QApplication.translate("settings", "Default")) - if type == "checkbox": + settingWidget = None + + if settings.type == "bool": settingWidget = QCheckBox() settingWidget.setChecked(SettingsManager.Get( - self.settingsBase+"."+setting, defaultValue)) - settingWidget.stateChanged.connect( - lambda val=None: SettingsManager.Set(self.settingsBase+"."+setting, settingWidget.isChecked())) - resetButton.clicked.connect( - lambda bt=None, settingWidget=settingWidget: - settingWidget.setChecked(defaultValue) - ) - elif type == "hotkey": + self.settingsBase+"."+settings.path, settings.default)) + settingWidget.stateChanged.connect(lambda val=None: SettingsManager.Set( + self.settingsBase+"."+settings.path, settingWidget.isChecked())) + resetButton.clicked.connect(lambda bt=None, settingWidget=settingWidget: + settingWidget.setChecked( + settings.default) + ) + elif settings.type == "hotkey": settingWidget = QKeySequenceEdit() - settingWidget.keySequenceChanged.connect( - lambda keySequence, settingWidget=settingWidget: - settingWidget.setKeySequence(keySequence.toString().split(",")[ - 0]) if keySequence.count() > 0 else None - ) + settingWidget.keySequenceChanged.connect(lambda keySequence, settingWidget=settingWidget: + settingWidget.setKeySequence(keySequence.toString().split(",")[ + 0]) if keySequence.count() > 0 else None + ) settingWidget.setKeySequence(SettingsManager.Get( - self.settingsBase+"."+setting, defaultValue)) + self.settingsBase+"."+settings.path, settings.default)) settingWidget.keySequenceChanged.connect( - lambda sequence=None, setting=setting: [ + lambda sequence=None, setting=settings.path: [ SettingsManager.Set( self.settingsBase+"."+setting, sequence.toString()), - callback() + settings.callback() ] ) resetButton.clicked.connect( - lambda bt=None, setting=setting, settingWidget=settingWidget: [ - settingWidget.setKeySequence(defaultValue), - callback() + lambda bt=None, setting=settings.path, settingWidget=settingWidget: [ + settingWidget.setKeySequence(settings.default), + settings.callback() ] ) + elif settings.type == "combobox": + settingWidget = QComboBox() + + if settings.options: + for option in settings.options: + settingWidget.addItem(option) + + defaultIndex = settings.options.index(settings.default) + settingWidget.setCurrentIndex(defaultIndex) + + settingWidget.currentIndexChanged.connect( + lambda sequence, setting=settings.path: [ + SettingsManager.Set( + self.settingsBase+"."+setting, settingWidget.currentText()), + settings.callback() + ] + ) + + resetButton.clicked.connect( + lambda bt, setting=settings.path, settingWidget=settingWidget: [ + settingWidget.setCurrentIndex(defaultIndex), + settings.callback() + ] + ) + elif settings.type == "asset": + settingWidget = QWidget() + settingWidget.setLayout(QHBoxLayout()) + settingWidget.setContentsMargins(0, 0, 0, 0) + settingWidget.layout().setContentsMargins(0, 0, 0, 0) + gameCombo = QComboBox() + assetCombo = QComboBox() + settingWidget.layout().addWidget(gameCombo) + settingWidget.layout().addWidget(assetCombo) + self.assetsSettings.append((gameCombo, assetCombo)) + else: + settingWidget = QLabel( + f'Could not identify "{settings.type}" type for {settings.name}') - self.layout().addWidget(settingWidget, lastRow, 1) - self.layout().addWidget(resetButton, lastRow, 2) + if settingWidget: + self.layout().addWidget(settingWidget, lastRow, 1) + self.layout().addWidget(resetButton, lastRow, 2) diff --git a/src/Settings/TSHSettingsWindow.py b/src/Settings/TSHSettingsWindow.py index 02af37b8d..34762221b 100644 --- a/src/Settings/TSHSettingsWindow.py +++ b/src/Settings/TSHSettingsWindow.py @@ -2,7 +2,25 @@ from qtpy.QtCore import * from qtpy.QtWidgets import * from .SettingsWidget import SettingsWidget +from .SettingsWidget import SETTINGS as SettingsWidgetSettings from ..TSHHotkeys import TSHHotkeys +import json + + +def iterate_json_leaves(obj, key=None): + if isinstance(obj, dict): + isLeaf = True + for k, value in obj.items(): + if isinstance(value, dict): + isLeaf = False + break + if isLeaf: + yield {key: obj} + else: + for k, value in obj.items(): + yield from iterate_json_leaves(value, f'{key}.{k}' if key else k) + else: + yield obj class TSHSettingsWindow(QDialog): @@ -38,26 +56,24 @@ def UiMounted(self): # Add general settings generalSettings = [] - generalSettings.append(( - QApplication.translate( - "settings.general", "Enable profanity filter"), - "profanity_filter", - "checkbox", - True - )) + generalSettings.append(SettingsWidgetSettings(**{ + "name": QApplication.translate("settings.general", "Enable profanity filter"), + "path": "profanity_filter", + "type": "bool", + "default": True + })) self.add_setting_widget(QApplication.translate( "settings", "General"), SettingsWidget("general", generalSettings)) # Add hotkey settings hotkeySettings = [] - - hotkeySettings.append(( - QApplication.translate("settings.hotkeys", "Enable hotkeys"), - "hotkeys_enabled", - "checkbox", - True - )) + hotkeySettings.append(SettingsWidgetSettings(**{ + "name": QApplication.translate("settings.hotkeys", "Enable hotkeys"), + "path": "hotkeys_enabled", + "type": "bool", + "default": True + })) key_names = { "load_set": QApplication.translate("settings.hotkeys", "Load set"), @@ -70,17 +86,35 @@ def UiMounted(self): } for i, (setting, value) in enumerate(TSHHotkeys.instance.keys.items()): - hotkeySettings.append(( - key_names[setting], - setting, - "hotkey", - value, - TSHHotkeys.instance.ReloadHotkeys - )) + hotkeySettings.append(SettingsWidgetSettings(**{ + "name": key_names[setting], + "path": setting, + "type": "hotkey", + "default": value, + "callback": TSHHotkeys.instance.ReloadHotkeys + })) self.add_setting_widget(QApplication.translate( "settings", "Hotkeys"), SettingsWidget("hotkeys", hotkeySettings)) + # Layout + layoutSettings = [] + + layoutJson = json.load(open("./layout/settings_map.json")) + + for entry in iterate_json_leaves(layoutJson): + (key, value) = list(entry.items())[0] + layoutSettings.append(SettingsWidgetSettings(**{ + "name": key, + "path": key, + "type": value.get("type"), + "default": value.get("default"), + "options": value.get("options") + })) + + self.add_setting_widget(QApplication.translate( + "settings", "Layout"), SettingsWidget("layout", layoutSettings)) + self.resize(1000, 500) QApplication.processEvents() splitter.setSizes([200, self.width()-200]) diff --git a/src/i18n/TSH_de.ts b/src/i18n/TSH_de.ts index 261951bc1..2904199b2 100644 --- a/src/i18n/TSH_de.ts +++ b/src/i18n/TSH_de.ts @@ -694,7 +694,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1371,25 +1371,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1397,42 +1397,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set Set laden - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys diff --git a/src/i18n/TSH_en.ts b/src/i18n/TSH_en.ts index 15da88810..f269ea896 100644 --- a/src/i18n/TSH_en.ts +++ b/src/i18n/TSH_en.ts @@ -689,7 +689,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1330,25 +1330,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1388,42 +1388,42 @@ p, li { white-space: pre-wrap; } Hotkeys enabled - + Load set - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys diff --git a/src/i18n/TSH_es.ts b/src/i18n/TSH_es.ts index d75712d29..6dfa41c19 100644 --- a/src/i18n/TSH_es.ts +++ b/src/i18n/TSH_es.ts @@ -699,7 +699,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1384,25 +1384,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1410,42 +1410,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set Cargar set - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys diff --git a/src/i18n/TSH_fr.ts b/src/i18n/TSH_fr.ts index 2765bd9f6..1a7982fa6 100644 --- a/src/i18n/TSH_fr.ts +++ b/src/i18n/TSH_fr.ts @@ -694,7 +694,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings Paramètres @@ -1427,17 +1427,21 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys Raccourcis clavier - + + Layout + + + Default Paramètres par défaut @@ -1445,7 +1449,7 @@ p, li { white-space: pre-wrap; } settings.general - + Enable profanity filter @@ -1453,42 +1457,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set Charger un set - + Team 1 score up Incrémenter le score - Équipe 1 - + Team 1 score down Décrémenter le score - Équipe 1 - + Team 2 score up Incrémenter le score - Équipe 2 - + Team 2 score down Décrémenter le score - Équipe 2 - + Reset scores Réinitialiser les scores - + Swap teams Échanger les équipes - + Enable hotkeys Activer les raccourcis clavier diff --git a/src/i18n/TSH_it.ts b/src/i18n/TSH_it.ts index 6a457e871..b17167688 100644 --- a/src/i18n/TSH_it.ts +++ b/src/i18n/TSH_it.ts @@ -689,7 +689,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1330,25 +1330,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1356,42 +1356,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys diff --git a/src/i18n/TSH_ja.ts b/src/i18n/TSH_ja.ts index 9edd3106b..00bedb7f7 100644 --- a/src/i18n/TSH_ja.ts +++ b/src/i18n/TSH_ja.ts @@ -702,7 +702,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1387,25 +1387,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1413,42 +1413,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set 対戦データをロードする - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys diff --git a/src/i18n/TSH_pt-BR.ts b/src/i18n/TSH_pt-BR.ts index 071333743..5de5f8dc1 100644 --- a/src/i18n/TSH_pt-BR.ts +++ b/src/i18n/TSH_pt-BR.ts @@ -701,7 +701,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings Configurações @@ -1454,17 +1454,21 @@ p, li { white-space: pre-wrap; } Habilitar teclas de atalho - + General - + Hotkeys Teclas de atalho - + + Layout + + + Default Padrão @@ -1472,7 +1476,7 @@ p, li { white-space: pre-wrap; } settings.general - + Enable profanity filter @@ -1512,42 +1516,42 @@ p, li { white-space: pre-wrap; } Habilitar teclas de atalho - + Load set Carregar set - + Team 1 score up Aumentar pontuação da equipe 1 - + Team 1 score down Diminuir pontuação da equipe 1 - + Team 2 score up Aumentar pontuação da equipe 2 - + Team 2 score down Diminuir pontuação da equipe 2 - + Reset scores Zerar placar - + Swap teams Inverter times - + Enable hotkeys Habilitar teclas de atalho diff --git a/src/i18n/TSH_zh-CN.ts b/src/i18n/TSH_zh-CN.ts index 9a6892454..deb3f0168 100644 --- a/src/i18n/TSH_zh-CN.ts +++ b/src/i18n/TSH_zh-CN.ts @@ -689,7 +689,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1330,25 +1330,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1356,42 +1356,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys diff --git a/src/i18n/TSH_zh-TW.ts b/src/i18n/TSH_zh-TW.ts index 747923b19..77b78b656 100644 --- a/src/i18n/TSH_zh-TW.ts +++ b/src/i18n/TSH_zh-TW.ts @@ -689,7 +689,7 @@ p, li { white-space: pre-wrap; } Settings - + Settings @@ -1330,25 +1330,25 @@ p, li { white-space: pre-wrap; } settings - + General - + Hotkeys - - Default + + Layout settings.general - + Enable profanity filter @@ -1356,42 +1356,42 @@ p, li { white-space: pre-wrap; } settings.hotkeys - + Load set - + Team 1 score up - + Team 1 score down - + Team 2 score up - + Team 2 score down - + Reset scores - + Swap teams - + Enable hotkeys