Skip to content

Commit 515a4ae

Browse files
committed
feat: add config reset functionality and enforce defaults in release build
1 parent c7dc2a3 commit 515a4ae

4 files changed

Lines changed: 83 additions & 1 deletion

File tree

build.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import shutil
44
import subprocess
55
import sys
6+
from core.settings_manager import SettingsManager
67

78
CONFIG_FILES = ['config.ini', 'config.cfg']
89
OUTPUT_DIR = 'dist'
@@ -123,6 +124,16 @@ def update_config_debug_mode(debug_mode):
123124
def run_build_cycle(debug_mode):
124125
print(f"\n>>> Starting {'DEBUG' if debug_mode else 'RELEASE'} Build Cycle <<<")
125126

127+
# Reset config to defaults if building for Release
128+
if not debug_mode:
129+
print("Resetting configuration to defaults for Release build...")
130+
try:
131+
settings = SettingsManager()
132+
settings.reset_to_defaults()
133+
print("Configuration reset successful.")
134+
except Exception as e:
135+
print(f"Warning: Failed to reset configuration: {e}")
136+
126137
# Update config file so the built executable reads the correct mode at runtime
127138
# AND so that the copy_config_to_dist puts the correct config in the dist folder
128139
update_config_debug_mode(debug_mode)

core/gui.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from PySide6.QtWidgets import QWidget, QVBoxLayout, QScrollArea
1+
from PySide6.QtWidgets import QWidget, QVBoxLayout, QScrollArea, QPushButton
22
from PySide6.QtCore import Slot
33
from .settings_manager import SettingsManager
44
from .ui.components import (
@@ -51,6 +51,12 @@ def init_ui(self):
5151

5252
self.kv_group = KeyViewerSettingsGroup(self.settings)
5353
layout.addWidget(self.kv_group)
54+
55+
# Reset Button
56+
self.btn_reset = QPushButton("Reset Config to Defaults")
57+
self.btn_reset.setStyleSheet("background-color: #d32f2f; color: white; font-weight: bold; padding: 8px;")
58+
self.btn_reset.clicked.connect(self.settings.reset_to_defaults)
59+
layout.addWidget(self.btn_reset)
5460

5561
layout.addStretch()
5662

core/settings_manager.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,15 @@ def save(self):
8989
def update_lanes(self, key_list):
9090
self.app_config.set_lane_keys(key_list)
9191
self.save()
92+
93+
def reset_to_defaults(self):
94+
"""Resets configuration to default values."""
95+
default_config = AppConfig()
96+
97+
# Replace sub-objects with defaults
98+
self.app_config.visual = default_config.visual
99+
self.app_config.position = default_config.position
100+
self.app_config.key_viewer = default_config.key_viewer
101+
self.app_config.lane_map = default_config.lane_map
102+
103+
self.save()

core/ui/components.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def __init__(self, settings_manager: SettingsManager, parent=None):
1313
self.settings = settings_manager
1414
self.config = self.settings.app_config
1515
self.init_ui()
16+
self.settings.settings_changed.connect(self.update_from_config)
1617

1718
def init_ui(self):
1819
layout = QHBoxLayout()
@@ -38,12 +39,21 @@ def on_change(self):
3839
self.config.position.y = self.spin_y.value()
3940
self.settings.save()
4041

42+
def update_from_config(self):
43+
self.spin_x.blockSignals(True)
44+
self.spin_y.blockSignals(True)
45+
self.spin_x.setValue(self.config.position.x)
46+
self.spin_y.setValue(self.config.position.y)
47+
self.spin_x.blockSignals(False)
48+
self.spin_y.blockSignals(False)
49+
4150
class VisualSettingsGroup(QGroupBox):
4251
def __init__(self, settings_manager: SettingsManager, parent=None):
4352
super().__init__("Visual Settings", parent)
4453
self.settings = settings_manager
4554
self.config = self.settings.app_config
4655
self.init_ui()
56+
self.settings.settings_changed.connect(self.update_from_config)
4757

4858
def init_ui(self):
4959
layout = QVBoxLayout()
@@ -91,6 +101,12 @@ def update_color_btn_style(self):
91101
self.btn_color.setStyleSheet(style)
92102
self.btn_color.setText(f"RGBA({c.red()},{c.green()},{c.blue()},{c.alpha()})")
93103

104+
def update_from_config(self):
105+
self.spin_speed.blockSignals(True)
106+
self.spin_speed.setValue(self.config.visual.scroll_speed)
107+
self.spin_speed.blockSignals(False)
108+
self.update_color_btn_style()
109+
94110
class LaneSettingsGroup(QGroupBox):
95111
record_toggled = Signal(bool) # Emits is_recording state
96112

@@ -100,6 +116,7 @@ def __init__(self, settings_manager: SettingsManager, parent=None):
100116
self.config = self.settings.app_config
101117
self.is_recording = False
102118
self.init_ui()
119+
self.settings.settings_changed.connect(self.update_from_config)
103120

104121
def init_ui(self):
105122
layout = QVBoxLayout()
@@ -116,6 +133,9 @@ def init_ui(self):
116133
self.lbl_instruction.setStyleSheet("color: gray; font-size: 10px;")
117134
layout.addWidget(self.lbl_instruction)
118135

136+
def update_from_config(self):
137+
self.update_status("Current Keys: " + str(len(self.config.lane_map)))
138+
119139
self.setLayout(layout)
120140

121141
def toggle_recording(self):
@@ -139,6 +159,7 @@ def __init__(self, settings_manager: SettingsManager, parent=None):
139159
self.settings = settings_manager
140160
self.config = self.settings.app_config
141161
self.init_ui()
162+
self.settings.settings_changed.connect(self.update_from_config)
142163

143164
def init_ui(self):
144165
layout = QVBoxLayout()
@@ -212,3 +233,35 @@ def on_change(self):
212233
self.config.key_viewer.show_counts = self.chk_kv_counts.isChecked()
213234
self.config.key_viewer.opacity = self.spin_kv_opacity.value() / 100.0
214235
self.settings.save()
236+
237+
def update_from_config(self):
238+
self.chk_kv_enabled.blockSignals(True)
239+
self.chk_kv_enabled.setChecked(self.config.key_viewer.enabled)
240+
self.chk_kv_enabled.blockSignals(False)
241+
242+
self.spin_kv_height.blockSignals(True)
243+
self.spin_kv_height.setValue(self.config.key_viewer.height)
244+
self.spin_kv_height.blockSignals(False)
245+
246+
self.combo_kv_pos.blockSignals(True)
247+
current = self.config.key_viewer.panel_position
248+
if current not in ["below", "above"]:
249+
current = "below"
250+
self.combo_kv_pos.setCurrentText(current)
251+
self.combo_kv_pos.blockSignals(False)
252+
253+
self.spin_kv_off_x.blockSignals(True)
254+
self.spin_kv_off_x.setValue(self.config.key_viewer.panel_offset_x)
255+
self.spin_kv_off_x.blockSignals(False)
256+
257+
self.spin_kv_off_y.blockSignals(True)
258+
self.spin_kv_off_y.setValue(self.config.key_viewer.panel_offset_y)
259+
self.spin_kv_off_y.blockSignals(False)
260+
261+
self.spin_kv_opacity.blockSignals(True)
262+
self.spin_kv_opacity.setValue(int(self.config.key_viewer.opacity * 100))
263+
self.spin_kv_opacity.blockSignals(False)
264+
265+
self.chk_kv_counts.blockSignals(True)
266+
self.chk_kv_counts.setChecked(self.config.key_viewer.show_counts)
267+
self.chk_kv_counts.blockSignals(False)

0 commit comments

Comments
 (0)