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