From d68451230fdef840c2edf034e58bb18b54332526 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 9 Jan 2026 03:27:48 +0300 Subject: [PATCH] add language info --- app.py | 14 ++++++++ themes/day.py | 23 +++++++++++++ themes/night.py | 22 +++++++++++++ ui/language_dialog.py | 77 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 ui/language_dialog.py diff --git a/app.py b/app.py index d430098..7732ea9 100644 --- a/app.py +++ b/app.py @@ -6,12 +6,15 @@ from PySide6.QtWidgets import QApplication import build_info from audio.system_volume import set_volume +from themes import THEME_DAY, THEME_NIGHT +from ui.language_dialog import LanguageDialog from ui.main_window_new import MainWindowNew def run_app(): app = QApplication(sys.argv) _apply_reset_if_requested() + _ensure_language_selected(app) _apply_startup_sound_defaults() _apply_startup_display_defaults() window = MainWindowNew(app) @@ -61,3 +64,14 @@ def _apply_reset_if_requested(): if settings_path.exists(): settings_path.unlink() reset_marker.unlink() + + +def _ensure_language_selected(app: QApplication): + settings = QSettings("car_ui", "ui") + if settings.contains("ui/language"): + return + theme_key = settings.value("display/theme", "night") + app.setStyleSheet(THEME_NIGHT if theme_key != "day" else THEME_DAY) + dialog = LanguageDialog() + if dialog.exec() == LanguageDialog.Accepted: + settings.setValue("ui/language", dialog.selected_language()) diff --git a/themes/day.py b/themes/day.py index fae3dc7..8a3efa7 100644 --- a/themes/day.py +++ b/themes/day.py @@ -167,4 +167,27 @@ QMenu::item:selected { background: #F3F4F6; } font-size: 14px; font-weight: 600; } + +#LanguageDialog { background: #F4F6F8; } +#LanguageCard { + background: #FFFFFF; + border-radius: 16px; + border: 1px solid #E5E7EB; +} +#LanguageTitle { color: #111827; } +#LanguageOption { + background: #FFFFFF; + color: #111827; + border-radius: 12px; + border: 1px solid #E5E7EB; + padding: 8px 14px; +} +#LanguageOption:checked { background: #E5E7EB; } +#LanguageConfirm { + background: #111827; + color: #FFFFFF; + border-radius: 12px; + padding: 10px 16px; +} +#LanguageConfirm:hover { background: #0B1220; } """ diff --git a/themes/night.py b/themes/night.py index 8a0e793..49f9578 100644 --- a/themes/night.py +++ b/themes/night.py @@ -154,4 +154,26 @@ QMenu::item:selected { background: #1B2330; } font-size: 14px; font-weight: 600; } + +#LanguageDialog { background: #0B0E11; } +#LanguageCard { + background: #141A22; + border-radius: 16px; +} +#LanguageTitle { color: #E6EAF0; } +#LanguageOption { + background: #141A22; + color: #E6EAF0; + border-radius: 12px; + border: 1px solid #1B2330; + padding: 8px 14px; +} +#LanguageOption:checked { background: #2A3A52; } +#LanguageConfirm { + background: #2A3A52; + color: #E6EAF0; + border-radius: 12px; + padding: 10px 16px; +} +#LanguageConfirm:hover { background: #344968; } """ diff --git a/ui/language_dialog.py b/ui/language_dialog.py new file mode 100644 index 0000000..9ed001d --- /dev/null +++ b/ui/language_dialog.py @@ -0,0 +1,77 @@ +from PySide6.QtCore import Qt, QSize +from PySide6.QtGui import QFont +from PySide6.QtWidgets import ( + QDialog, + QWidget, + QLabel, + QVBoxLayout, + QHBoxLayout, + QPushButton, + QButtonGroup, + QSpacerItem, + QSizePolicy, +) + + +class LanguageDialog(QDialog): + def __init__(self): + super().__init__() + self.setObjectName("LanguageDialog") + self.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog) + self.setWindowModality(Qt.ApplicationModal) + self.setMinimumSize(QSize(1024, 600)) + + root = QVBoxLayout(self) + root.setContentsMargins(24, 24, 24, 24) + root.setSpacing(16) + + root.addItem(QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding)) + + card = QWidget() + card.setObjectName("LanguageCard") + card_layout = QVBoxLayout(card) + card_layout.setContentsMargins(18, 18, 18, 18) + card_layout.setSpacing(14) + + title = QLabel("Сначала выберите язык") + title.setObjectName("LanguageTitle") + title.setFont(QFont("", 20, 700)) + title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) + + options_row = QHBoxLayout() + options_row.setContentsMargins(0, 0, 0, 0) + options_row.setSpacing(12) + + self._group = QButtonGroup(self) + self._group.setExclusive(True) + + self._btn_ru = QPushButton("Русский") + self._btn_ru.setObjectName("LanguageOption") + self._btn_ru.setCheckable(True) + self._btn_ru.setChecked(True) + self._btn_ru.setMinimumHeight(48) + self._btn_ru.setFont(QFont("", 14, 600)) + self._group.addButton(self._btn_ru) + + options_row.addWidget(self._btn_ru, 1) + options_row.addStretch(1) + + confirm = QPushButton("Продолжить") + confirm.setObjectName("LanguageConfirm") + confirm.setMinimumHeight(52) + confirm.setFont(QFont("", 15, 700)) + confirm.clicked.connect(self.accept) + + card_layout.addWidget(title) + card_layout.addLayout(options_row) + card_layout.addWidget(confirm) + + root.addWidget(card) + root.addItem(QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding)) + + def reject(self): + # Ignore reject to force a language choice. + return + + def selected_language(self) -> str: + return "ru"