diff --git a/styles/style.qss b/1styles/style.qss similarity index 100% rename from styles/style.qss rename to 1styles/style.qss diff --git a/screens/setting/dev_screen.py b/screens/setting/dev_screen.py index 7fbfaac..ddadc6f 100644 --- a/screens/setting/dev_screen.py +++ b/screens/setting/dev_screen.py @@ -1,10 +1,12 @@ from pathlib import Path +import subprocess from PySide6.QtCore import Qt from PySide6.QtGui import QFont from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel import build_info +from ui.confirm_dialog import ConfirmDialog def build_dev_screen(on_exit) -> QWidget: @@ -22,10 +24,16 @@ def build_dev_screen(on_exit) -> QWidget: exit_btn = QPushButton("Переход к рабочему столу") exit_btn.setObjectName("DevExitBtn") exit_btn.setMinimumHeight(72) - exit_btn.clicked.connect(on_exit) + exit_btn.clicked.connect(lambda: _confirm_exit(on_exit)) + + reboot_btn = QPushButton("Выполнить перезагрузку") + reboot_btn.setObjectName("DevExitBtn") + reboot_btn.setMinimumHeight(72) + reboot_btn.clicked.connect(_confirm_reboot) layout.addLayout(hdr) layout.addWidget(exit_btn) + layout.addWidget(reboot_btn) layout.addStretch(1) return screen @@ -70,3 +78,23 @@ def _build_persist_toggle() -> QWidget: def _dev_flag_path() -> Path: return Path(build_info.__file__).resolve().parent / "dev_mode_enable" + + +def _confirm_exit(on_exit): + dialog = ConfirmDialog( + "Подтверждение", + "Закрыть приложение и перейти к рабочему столу?", + "Выйти", + ) + if dialog.exec() == ConfirmDialog.Accepted: + on_exit() + + +def _confirm_reboot(): + dialog = ConfirmDialog( + "Подтверждение", + "Выполнить перезагрузку устройства?", + "Перезагрузить", + ) + if dialog.exec() == ConfirmDialog.Accepted: + subprocess.run(["sudo", "reboot"], check=False) diff --git a/Return_to_Car_UI.desktop b/system_configs/Return_to_Car_UI.desktop similarity index 100% rename from Return_to_Car_UI.desktop rename to system_configs/Return_to_Car_UI.desktop diff --git a/bt-unblock.service b/system_configs/bt-unblock.service similarity index 100% rename from bt-unblock.service rename to system_configs/bt-unblock.service diff --git a/car-ui.desktop b/system_configs/car-ui.desktop similarity index 100% rename from car-ui.desktop rename to system_configs/car-ui.desktop diff --git a/car-ui.service b/system_configs/car-ui.service similarity index 100% rename from car-ui.service rename to system_configs/car-ui.service diff --git a/qqqq b/system_configs/qqqq similarity index 100% rename from qqqq rename to system_configs/qqqq diff --git a/themes/day.py b/themes/day.py index 8a3efa7..abfd49f 100644 --- a/themes/day.py +++ b/themes/day.py @@ -190,4 +190,28 @@ QMenu::item:selected { background: #F3F4F6; } padding: 10px 16px; } #LanguageConfirm:hover { background: #0B1220; } + +#ConfirmDialog { background: #F4F6F8; } +#ConfirmCard { + background: #FFFFFF; + border-radius: 16px; + border: 1px solid #E5E7EB; +} +#ConfirmTitle { color: #111827; } +#ConfirmMessage { color: rgba(107,114,128,0.95); } +#ConfirmCancel { + background: #FFFFFF; + color: #111827; + border-radius: 12px; + border: 1px solid #E5E7EB; + padding: 8px 14px; +} +#ConfirmCancel:hover { background: #F9FAFB; } +#ConfirmOk { + background: #111827; + color: #FFFFFF; + border-radius: 12px; + padding: 8px 14px; +} +#ConfirmOk:hover { background: #0B1220; } """ diff --git a/themes/night.py b/themes/night.py index 49f9578..e48dead 100644 --- a/themes/night.py +++ b/themes/night.py @@ -176,4 +176,27 @@ QMenu::item:selected { background: #1B2330; } padding: 10px 16px; } #LanguageConfirm:hover { background: #344968; } + +#ConfirmDialog { background: #0B0E11; } +#ConfirmCard { + background: #141A22; + border-radius: 16px; +} +#ConfirmTitle { color: #E6EAF0; } +#ConfirmMessage { color: rgba(138,147,166,0.95); } +#ConfirmCancel { + background: #141A22; + color: #E6EAF0; + border-radius: 12px; + border: 1px solid #1B2330; + padding: 8px 14px; +} +#ConfirmCancel:hover { background: #1B2330; } +#ConfirmOk { + background: #2A3A52; + color: #E6EAF0; + border-radius: 12px; + padding: 8px 14px; +} +#ConfirmOk:hover { background: #344968; } """ diff --git a/ui/confirm_dialog.py b/ui/confirm_dialog.py new file mode 100644 index 0000000..b7c0175 --- /dev/null +++ b/ui/confirm_dialog.py @@ -0,0 +1,68 @@ +from PySide6.QtCore import Qt, QSize +from PySide6.QtGui import QFont +from PySide6.QtWidgets import ( + QDialog, + QWidget, + QLabel, + QVBoxLayout, + QHBoxLayout, + QPushButton, + QSpacerItem, + QSizePolicy, +) + + +class ConfirmDialog(QDialog): + def __init__(self, title: str, message: str, confirm_text: str): + super().__init__() + self.setObjectName("ConfirmDialog") + 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("ConfirmCard") + card_layout = QVBoxLayout(card) + card_layout.setContentsMargins(18, 18, 18, 18) + card_layout.setSpacing(12) + + title_lbl = QLabel(title) + title_lbl.setObjectName("ConfirmTitle") + title_lbl.setFont(QFont("", 20, 700)) + + msg_lbl = QLabel(message) + msg_lbl.setObjectName("ConfirmMessage") + msg_lbl.setFont(QFont("", 14, 500)) + msg_lbl.setWordWrap(True) + + actions = QHBoxLayout() + actions.setContentsMargins(0, 0, 0, 0) + actions.setSpacing(12) + + cancel_btn = QPushButton("Отмена") + cancel_btn.setObjectName("ConfirmCancel") + cancel_btn.setMinimumHeight(50) + cancel_btn.setFont(QFont("", 14, 700)) + cancel_btn.clicked.connect(self.reject) + + ok_btn = QPushButton(confirm_text) + ok_btn.setObjectName("ConfirmOk") + ok_btn.setMinimumHeight(50) + ok_btn.setFont(QFont("", 14, 700)) + ok_btn.clicked.connect(self.accept) + + actions.addWidget(cancel_btn, 1) + actions.addWidget(ok_btn, 1) + + card_layout.addWidget(title_lbl) + card_layout.addWidget(msg_lbl) + card_layout.addLayout(actions) + + root.addWidget(card) + root.addItem(QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding))