From 4d67ddcc9b858cb441fc4043b2ae0349afcb1f97 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 9 Jan 2026 02:46:32 +0300 Subject: [PATCH] add sound info --- screens/setting/sound_screen.py | 144 ++++++++++++++++++++++---------- 1 file changed, 99 insertions(+), 45 deletions(-) diff --git a/screens/setting/sound_screen.py b/screens/setting/sound_screen.py index 2b320df..f8fb7f3 100644 --- a/screens/setting/sound_screen.py +++ b/screens/setting/sound_screen.py @@ -1,4 +1,4 @@ -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, QSettings from PySide6.QtGui import QFont from PySide6.QtWidgets import ( QWidget, @@ -17,6 +17,7 @@ class SoundScreen(QWidget): def __init__(self, on_eq): super().__init__() self._on_eq = on_eq + self._settings = QSettings("car_ui", "ui") root = QVBoxLayout(self) root.setContentsMargins(0, 0, 0, 0) @@ -50,67 +51,103 @@ class SoundScreen(QWidget): scroll.setWidget(content) root.addWidget(scroll, 1) + def _read_int(self, key: str, default: int) -> int: + return _read_int_setting(self._settings, key, default) + + def _read_bool(self, key: str, default: bool) -> bool: + return _read_bool_setting(self._settings, key, default) + def _build_volume_card(self) -> QWidget: card, body = _card("Громкость") - body.addWidget( - _slider_row( - "Базовая громкость", - 0, - 100, - 60, - lambda v: f"{v}%", - ) + default_value = 60 + value = self._read_int("sound/base_volume", default_value) + row, slider, value_label = _slider_row( + "Базовая громкость", + 0, + 100, + value, + lambda v: f"{v}%", ) + slider.valueChanged.connect( + lambda v: self._settings.setValue("sound/base_volume", v) + ) + body.addWidget(row) return card def _build_premute_card(self) -> QWidget: card, body = _card("Премут") - body.addWidget(_toggle_row("Премут", checked=False)) - body.addWidget( - _slider_row( - "Громкость премут", - 0, - 100, - 10, - lambda v: f"{v}%", + premute_enabled = self._read_bool("sound/premute_enabled", False) + premute_value = self._read_int("sound/premute_volume", 10) + + row_toggle, toggle_btn = _toggle_row("Премут", checked=premute_enabled) + toggle_btn.toggled.connect( + lambda checked: self._settings.setValue( + "sound/premute_enabled", + checked, ) ) + + row_slider, slider, value_label = _slider_row( + "Громкость премут", + 0, + 100, + premute_value, + lambda v: f"{v}%", + ) + slider.valueChanged.connect( + lambda v: self._settings.setValue("sound/premute_volume", v) + ) + + body.addWidget(row_toggle) + body.addWidget(row_slider) return card def _build_ducking_card(self) -> QWidget: card, body = _card("Ducking") - body.addWidget(_toggle_row("Ducking", checked=True)) - body.addWidget( - _slider_row( - "Громкость при Ducking", - 0, - 100, - 35, - lambda v: f"{v}%", + ducking_enabled = self._read_bool("sound/ducking_enabled", True) + ducking_value = self._read_int("sound/ducking_volume", 35) + + row_toggle, toggle_btn = _toggle_row("Ducking", checked=ducking_enabled) + toggle_btn.toggled.connect( + lambda checked: self._settings.setValue( + "sound/ducking_enabled", + checked, ) ) + + row_slider, slider, value_label = _slider_row( + "Громкость при Ducking", + 0, + 100, + ducking_value, + lambda v: f"{v}%", + ) + slider.valueChanged.connect( + lambda v: self._settings.setValue("sound/ducking_volume", v) + ) + + body.addWidget(row_toggle) + body.addWidget(row_slider) return card def _build_balance_card(self) -> QWidget: card, body = _card("Баланс и фейдер") - body.addWidget( - _slider_row( - "Баланс L/R", - -50, - 50, - 0, - _format_balance, - ) + row, slider, value_label = _slider_row( + "Баланс L/R", + -50, + 50, + 0, + _format_balance, ) - body.addWidget( - _slider_row( - "Фейдер F/R", - -50, - 50, - 0, - _format_fader, - ) + body.addWidget(row) + row, slider, value_label = _slider_row( + "Фейдер F/R", + -50, + 50, + 0, + _format_fader, ) + body.addWidget(row) return card def _build_tone_card(self) -> QWidget: @@ -164,7 +201,7 @@ def _card(title: str) -> tuple[QWidget, QVBoxLayout]: return card, layout -def _toggle_row(label: str, checked: bool) -> QWidget: +def _toggle_row(label: str, checked: bool) -> tuple[QWidget, QPushButton]: row = QWidget() row.setObjectName("SoundToggleRow") layout = QHBoxLayout(row) @@ -191,7 +228,7 @@ def _toggle_row(label: str, checked: bool) -> QWidget: layout.addWidget(lbl) layout.addStretch(1) layout.addWidget(btn) - return row + return row, btn def _slider_row( @@ -200,7 +237,7 @@ def _slider_row( maximum: int, value: int, formatter, -) -> QWidget: +) -> tuple[QWidget, QSlider, QLabel]: row = QWidget() row.setObjectName("SoundSliderRow") layout = QVBoxLayout(row) @@ -231,7 +268,7 @@ def _slider_row( layout.addWidget(header) layout.addWidget(slider) - return row + return row, slider, val def _format_balance(value: int) -> str: @@ -246,3 +283,20 @@ def _format_fader(value: int) -> str: return "Центр" side = "F" if value < 0 else "R" return f"{side} {abs(value)}" + + +def _read_int_setting(settings: QSettings, key: str, default: int) -> int: + raw = settings.value(key, default) + try: + return int(raw) + except (TypeError, ValueError): + return default + + +def _read_bool_setting(settings: QSettings, key: str, default: bool) -> bool: + raw = settings.value(key, default) + if isinstance(raw, bool): + return raw + if isinstance(raw, str): + return raw.strip().lower() in ("1", "true", "yes", "on") + return bool(raw)