import json from typing import Dict, Any from PySide6.QtWidgets import ( QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMessageBox, QLabel, QHBoxLayout ) from PySide6.QtGui import QIcon from utils.encryption import ConfigManager from widgets.serial_widget import SerialNumberWidget from widgets.light_widget import LightVersionWidget from widgets.hopper_widget import HopperSensorWidget from widgets.webserver_widget import WebServerWidget from widgets.preview_widget import PreviewWidget class MainWindow(QMainWindow): """Главное окно приложения""" def __init__(self): super().__init__() self.config_manager = ConfigManager() self.init_ui() self.load_current_config() self.setWindowIcon(QIcon("logo.png")) # Подписываемся на изменения во всех виджетах self.setup_value_changed_connections() def init_ui(self): self.setWindowTitle("Конфигуратор аппарат 4 в ряд") self.setGeometry(100, 100, 650, 850) # Центральный виджет central_widget = QWidget() self.setCentralWidget(central_widget) # Основной layout main_layout = QVBoxLayout(central_widget) # Информационная панель с путем сохранения info_layout = QHBoxLayout() info_layout.addWidget(QLabel("📁 Файл конфигурации:")) path_label = QLabel(self.config_manager.get_config_path()) path_label.setStyleSheet(""" QLabel { color: #666; font-family: monospace; font-size: 11px; background-color: #f5f5f5; padding: 3px 8px; border-radius: 3px; } """) path_label.setWordWrap(True) info_layout.addWidget(path_label, 1) main_layout.addLayout(info_layout) # Создаем вкладки tabs = QTabWidget() tabs.setTabPosition(QTabWidget.TabPosition.North) # Вкладка 1: Серийный номер self.serial_widget = SerialNumberWidget() tabs.addTab(self.serial_widget, "Серийный номер") # Вкладка 2: Подсветка self.light_widget = LightVersionWidget("Подсветка", default=2) tabs.addTab(self.light_widget, "Подсветка") # Вкладка 3: Электроника electronics_layout = QVBoxLayout() # Версия электроники self.electronics_widget = LightVersionWidget( "Версия электроники", default=2, options={1: "Версия 1", 2: "Версия 2"} ) electronics_layout.addWidget(self.electronics_widget) # Датчик хоппера self.hopper_widget = HopperSensorWidget() electronics_layout.addWidget(self.hopper_widget) electronics_tab = QWidget() electronics_tab.setLayout(electronics_layout) tabs.addTab(electronics_tab, "Электроника") # Вкладка 4: Веб-сервер self.webserver_widget = WebServerWidget() tabs.addTab(self.webserver_widget, "Веб-сервер") # Вкладка 5: Сохранение self.preview_widget = PreviewWidget(self.config_manager) self.preview_widget.set_get_config_callback(self.get_current_config) self.preview_widget.save_button.clicked.connect(self.save_config) tabs.addTab(self.preview_widget, "Сохранение") main_layout.addWidget(tabs) def setup_value_changed_connections(self): """Настраивает соединения для обновления предпросмотра""" self.serial_widget.valueChanged.connect(self.on_config_changed) self.light_widget.valueChanged.connect(self.on_config_changed) self.electronics_widget.valueChanged.connect(self.on_config_changed) self.hopper_widget.valueChanged.connect(self.on_config_changed) self.webserver_widget.valueChanged.connect(self.on_config_changed) def on_config_changed(self): """Обработчик изменения конфигурации""" self.preview_widget.update_preview() def get_current_config(self) -> Dict[str, Any]: """Собирает текущие значения из виджетов""" config = { "serial": self.serial_widget.get_serial(), "light-version": self.light_widget.get_value(), "electronic-version": self.electronics_widget.get_value(), "sensor-positive-value": self.hopper_widget.get_value(), "start-server": self.webserver_widget.get_start_server(), "server-password": self.webserver_widget.get_password() } return config def load_current_config(self): """Загружает текущий конфиг в виджеты""" config = self.config_manager.current_config if config: if "serial" in config: self.serial_widget.set_serial(config["serial"]) if "light-version" in config: self.light_widget.set_value(config["light-version"]) if "electronic-version" in config: self.electronics_widget.set_value(config["electronic-version"]) if "sensor-positive-value" in config: self.hopper_widget.set_value(config["sensor-positive-value"]) if "start-server" in config: self.webserver_widget.set_start_server(config["start-server"]) if "server-password" in config: self.webserver_widget.set_password(config["server-password"]) def save_config(self): """Сохраняет конфигурацию""" config = self.get_current_config() if self.config_manager.save_config(config): QMessageBox.information( self, "Успех", f"Конфигурация успешно сохранена\n\nФайл: {self.config_manager.get_config_path()}" ) else: QMessageBox.critical( self, "Ошибка", "Не удалось сохранить конфигурацию" )