car_ui/screens/setting/about_screen.py
2026-01-09 03:40:15 +03:00

129 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PySide6.QtWidgets import (
QWidget,
QLabel,
QVBoxLayout,
QHBoxLayout,
QScrollArea,
)
from PySide6.QtCore import Qt, Signal
from PySide6.QtGui import QFont, QGuiApplication
from PySide6.QtWidgets import QScroller
import build_info
class AboutScreen(QWidget):
dev_unlocked = Signal()
def __init__(self):
super().__init__()
self._dev_taps = 0
self._dev_hint = QLabel("")
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(12)
scroll = QScrollArea()
scroll.setWidgetResizable(True)
scroll.setFrameShape(QScrollArea.NoFrame)
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroller = QScroller.scroller(scroll.viewport())
scroller.grabGesture(
scroll.viewport(),
QScroller.LeftMouseButtonGesture
)
content = QWidget()
content_layout = QVBoxLayout(content)
content_layout.setContentsMargins(0, 0, 0, 0)
content_layout.setSpacing(12)
info = QVBoxLayout()
info.setContentsMargins(0, 0, 0, 0)
info.setSpacing(8)
info.addWidget(_info_row("Приложение", build_info.APP_NAME))
info.addWidget(_info_row("Версия", build_info.VERSION))
build_row = _info_row("Сборка", build_info.BUILD_DATE, clickable=True)
build_row.clicked.connect(self._on_build_tap)
info.addWidget(build_row)
self._dev_hint.setObjectName("DevHint")
self._dev_hint.setFont(QFont("", 12, 600))
self._dev_hint.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
info.addWidget(self._dev_hint)
info.addWidget(_info_row("Коммит", build_info.GIT_HASH))
info.addWidget(_info_row("Устройство", build_info.get_device_model()))
info.addWidget(_info_row("ОС", build_info.get_os_pretty_name()))
info.addWidget(_info_row("Ядро", build_info.get_kernel_version()))
info.addWidget(_info_row("RAM (используется/всего)", build_info.get_ram_info()))
info.addWidget(_info_row("Диск (используется/всего)", build_info.get_disk_info()))
info.addWidget(_info_row("Экран", build_info.get_display_resolution()))
info.addWidget(_info_row("Экран (факт)", _get_runtime_resolution()))
info.addWidget(_info_row("Серийный номер", build_info.get_serial_number()))
info.addWidget(_info_row("IP", build_info.get_ip_address()))
info.addWidget(_info_row("Температура CPU", build_info.get_cpu_temp()))
content_layout.addLayout(info)
content_layout.addStretch(1)
scroll.setWidget(content)
layout.addWidget(scroll)
def _on_build_tap(self):
self._dev_taps += 1
remaining = 5 - self._dev_taps
if remaining > 0:
self._dev_hint.setText(f"Осталось {remaining} нажат.")
return
if self._dev_taps >= 5:
self._dev_taps = 0
self._dev_hint.setText("Режим разработчика включен")
self.dev_unlocked.emit()
class _ClickableRow(QWidget):
clicked = Signal()
def __init__(self):
super().__init__()
self.setCursor(Qt.PointingHandCursor)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.clicked.emit()
super().mousePressEvent(event)
def _info_row(label: str, value: str, clickable: bool = False) -> QWidget:
row = _ClickableRow() if clickable else QWidget()
layout = QHBoxLayout(row)
layout.setContentsMargins(12, 6, 12, 6)
layout.setSpacing(12)
lbl = QLabel(label)
lbl.setFont(QFont("", 15, 600))
val = QLabel(value)
val.setFont(QFont("", 15))
val.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
layout.addWidget(lbl)
layout.addStretch(1)
layout.addWidget(val)
return row
def _get_runtime_resolution() -> str:
app = QGuiApplication.instance()
if app is None:
return ""
screen = app.primaryScreen()
if screen is None:
return ""
size = screen.size()
if size.isEmpty():
return ""
return f"{size.width()}x{size.height()}"