add hard reboot

This commit is contained in:
Your Name 2026-01-09 03:59:59 +03:00
parent 5f72775d1a
commit cc0179ca6c
10 changed files with 144 additions and 1 deletions

View File

@ -1,10 +1,12 @@
from pathlib import Path from pathlib import Path
import subprocess
from PySide6.QtCore import Qt from PySide6.QtCore import Qt
from PySide6.QtGui import QFont from PySide6.QtGui import QFont
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel
import build_info import build_info
from ui.confirm_dialog import ConfirmDialog
def build_dev_screen(on_exit) -> QWidget: def build_dev_screen(on_exit) -> QWidget:
@ -22,10 +24,16 @@ def build_dev_screen(on_exit) -> QWidget:
exit_btn = QPushButton("Переход к рабочему столу") exit_btn = QPushButton("Переход к рабочему столу")
exit_btn.setObjectName("DevExitBtn") exit_btn.setObjectName("DevExitBtn")
exit_btn.setMinimumHeight(72) 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.addLayout(hdr)
layout.addWidget(exit_btn) layout.addWidget(exit_btn)
layout.addWidget(reboot_btn)
layout.addStretch(1) layout.addStretch(1)
return screen return screen
@ -70,3 +78,23 @@ def _build_persist_toggle() -> QWidget:
def _dev_flag_path() -> Path: def _dev_flag_path() -> Path:
return Path(build_info.__file__).resolve().parent / "dev_mode_enable" 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)

View File

@ -190,4 +190,28 @@ QMenu::item:selected { background: #F3F4F6; }
padding: 10px 16px; padding: 10px 16px;
} }
#LanguageConfirm:hover { background: #0B1220; } #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; }
""" """

View File

@ -176,4 +176,27 @@ QMenu::item:selected { background: #1B2330; }
padding: 10px 16px; padding: 10px 16px;
} }
#LanguageConfirm:hover { background: #344968; } #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; }
""" """

68
ui/confirm_dialog.py Normal file
View File

@ -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))