plate-config-app/app/widgets/sections/button_backlight_section.py
Danil Iarosh 9fd10a3acd v1.3.0: simple mode backlight and UI polish
- обновлён простой режим: тест цвета и проверка подсветки кнопок объединены в раздел «Тест подсветки»

- добавлена проверка подсветки кнопок через 8-й силовой выход с автоматическим коротким тестом

- упрощены описания пользовательских проверок и убраны лишние технические подробности из простого режима

- изменена раскладка теста цвета, увеличена длительность шага до 1 секунды и убраны описания из PRO-блока

- добавлена защита выпадающих списков от случайного изменения колесом мыши

- улучшены немодальные PRO-диалоги, настройки соединения и обработка событий COM-порта

- обновлены визуальные детали приложения, пользовательские ресурсы, инструкции AGENTS и Release Notes 1.3.0
2026-05-26 12:59:21 +03:00

126 lines
4.9 KiB
Python

"""Inline-секция проверки подсветки кнопок через 8-й силовой выход."""
from __future__ import annotations
from PySide6.QtCore import QTimer
from PySide6.QtWidgets import (
QGroupBox,
QHBoxLayout,
QLabel,
QMessageBox,
QPushButton,
QVBoxLayout,
QWidget,
)
from ...services.com_service import ComConnection
from ...ui.icons import get_icon_color, get_icon_muted, icon
_BUTTON_BACKLIGHT_INDEX = 7 # Пользовательский "8-й выход" в протоколе имеет индекс 7.
_BACKLIGHT_ON_CMD = f"21{_BUTTON_BACKLIGHT_INDEX}1"
_BACKLIGHT_OFF_CMD = f"21{_BUTTON_BACKLIGHT_INDEX}0"
class ButtonBacklightSection(QWidget):
"""Проверка подсветки кнопок в базовом режиме."""
def __init__(self, connection: ComConnection, parent: QWidget | None = None) -> None:
super().__init__(parent)
self._conn = connection
self._pulse_timer = QTimer(self)
self._pulse_timer.setSingleShot(True)
self._pulse_timer.timeout.connect(self._finish_pulse_test)
self._setup_ui()
def _setup_ui(self) -> None:
root = QVBoxLayout(self)
root.setContentsMargins(0, 0, 0, 0)
root.setSpacing(10)
group = QGroupBox("Подсветка кнопок (8-й силовой выход)")
layout = QVBoxLayout(group)
desc = QLabel(
"Проверяет подсветку кнопок. Нажмите «Включить» и убедитесь, что кнопки загорелись, "
"затем нажмите «Выключить» и проверьте, что подсветка погасла. "
"Кнопка «Проверить» включает подсветку на короткое время автоматически."
)
desc.setWordWrap(True)
desc.setObjectName("HelpText")
layout.addWidget(desc)
row = QHBoxLayout()
self._on_btn = QPushButton("Включить")
self._on_btn.setProperty("role", "primary")
self._on_btn.setIcon(icon("fa5s.lightbulb", color="#ecfdf5"))
self._on_btn.clicked.connect(lambda: self._send(_BACKLIGHT_ON_CMD))
row.addWidget(self._on_btn)
self._off_btn = QPushButton("Выключить")
self._off_btn.setIcon(icon("fa5s.power-off", color=get_icon_color()))
self._off_btn.clicked.connect(lambda: self._send(_BACKLIGHT_OFF_CMD))
row.addWidget(self._off_btn)
self._pulse_btn = QPushButton("Проверить")
self._pulse_btn.setIcon(icon("fa5s.play", color=get_icon_muted()))
self._pulse_btn.clicked.connect(self._run_pulse_test)
row.addWidget(self._pulse_btn)
row.addStretch()
layout.addLayout(row)
self._log = QLabel("")
self._log.setObjectName("LogLabel")
self._log.setWordWrap(True)
layout.addWidget(self._log)
root.addWidget(group)
def refresh_icons(self) -> None:
clr = get_icon_color()
muted = get_icon_muted()
self._on_btn.setIcon(icon("fa5s.lightbulb", color="#ecfdf5"))
self._off_btn.setIcon(icon("fa5s.power-off", color=clr))
self._pulse_btn.setIcon(icon("fa5s.play", color=muted))
def shutdown(self) -> None:
if self._pulse_timer.isActive():
self._pulse_timer.stop()
self._pulse_btn.setEnabled(True)
if self._conn.is_connected:
self._send(_BACKLIGHT_OFF_CMD)
def _run_pulse_test(self) -> None:
if not self._conn.is_connected:
QMessageBox.warning(self, "Ошибка", "Порт не подключён.")
return
self._pulse_btn.setEnabled(False)
if self._send(_BACKLIGHT_ON_CMD):
self._log.setText("Подсветка включена на 1,5 секунды. Проверьте, что кнопки загорелись.")
self._pulse_timer.start(1500)
else:
self._pulse_btn.setEnabled(True)
def _finish_pulse_test(self) -> None:
self._send(_BACKLIGHT_OFF_CMD)
self._pulse_btn.setEnabled(True)
self._log.setText("Проверка завершена: подсветка должна погаснуть.")
def _send(self, cmd: str) -> bool:
if not self._conn.is_connected:
QMessageBox.warning(self, "Ошибка", "Порт не подключён.")
return False
try:
self._conn.send_command(cmd)
self._log.setText(f"→ {cmd}")
resp = self._conn.read_response(timeout=0.3)
self._conn.release()
if resp:
self._log.setText(f"→ {cmd}\n← {resp}")
return True
except Exception as exc:
self._conn.release()
self._log.setText(f"Ошибка: {exc}")
return False