Astro-Session-Watcher/ui/dialogs/equipment_dialog.py

202 lines
8.4 KiB
Python
Raw Normal View History

2026-05-07 17:15:56 +03:00
"""
EquipmentDialog - диалог управления оборудованием (камеры и объективы)
Аналог EquipmentDialogController из JavaFX версии
"""
from PySide6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QListWidget,
QPushButton, QInputDialog, QMessageBox, QListWidgetItem
)
from PySide6.QtCore import Qt
from PySide6.QtGui import QFont
from services.config_service import ConfigService
class EquipmentDialog(QDialog):
"""Диалог для управления списками камер и объективов"""
def __init__(self, parent, config_service: ConfigService):
super().__init__(parent)
self.config_service = config_service
self.setWindowTitle("Управление оборудованием")
self.setMinimumSize(600, 400)
self.resize(650, 450)
# Загружаем текущие списки
self.cameras = self.config_service.get_cameras()
self.lenses = self.config_service.get_lenses()
self._create_ui()
self._update_cameras_list()
self._update_lenses_list()
def _create_ui(self):
"""Создаёт интерфейс диалога"""
layout = QVBoxLayout(self)
layout.setSpacing(15)
layout.setContentsMargins(20, 20, 20, 20)
# Заголовок
title_label = QLabel("Управление оборудованием")
title_font = QFont()
title_font.setPointSize(16)
title_font.setBold(True)
title_label.setFont(title_font)
title_label.setAlignment(Qt.AlignCenter)
layout.addWidget(title_label)
# Контейнер для двух колонок
columns_layout = QHBoxLayout()
columns_layout.setSpacing(20)
# Левая колонка - Камеры
left_layout = QVBoxLayout()
cameras_label = QLabel("Камеры")
cameras_font = QFont()
cameras_font.setPointSize(12)
cameras_font.setBold(True)
cameras_label.setFont(cameras_font)
left_layout.addWidget(cameras_label)
self.cameras_list = QListWidget()
self.cameras_list.itemClicked.connect(lambda item: self._select_camera(item.text()))
left_layout.addWidget(self.cameras_list)
cameras_buttons_layout = QHBoxLayout()
add_camera_btn = QPushButton(" Добавить")
add_camera_btn.clicked.connect(self._add_camera)
cameras_buttons_layout.addWidget(add_camera_btn)
self.remove_camera_btn = QPushButton("❌ Удалить")
self.remove_camera_btn.setEnabled(False)
self.remove_camera_btn.clicked.connect(self._remove_camera)
cameras_buttons_layout.addWidget(self.remove_camera_btn)
left_layout.addLayout(cameras_buttons_layout)
# Правая колонка - Объективы
right_layout = QVBoxLayout()
lenses_label = QLabel("Объективы")
lenses_label.setFont(cameras_font)
right_layout.addWidget(lenses_label)
self.lenses_list = QListWidget()
self.lenses_list.itemClicked.connect(lambda item: self._select_lens(item.text()))
right_layout.addWidget(self.lenses_list)
lenses_buttons_layout = QHBoxLayout()
add_lens_btn = QPushButton(" Добавить")
add_lens_btn.clicked.connect(self._add_lens)
lenses_buttons_layout.addWidget(add_lens_btn)
self.remove_lens_btn = QPushButton("❌ Удалить")
self.remove_lens_btn.setEnabled(False)
self.remove_lens_btn.clicked.connect(self._remove_lens)
lenses_buttons_layout.addWidget(self.remove_lens_btn)
right_layout.addLayout(lenses_buttons_layout)
columns_layout.addLayout(left_layout)
columns_layout.addLayout(right_layout)
layout.addLayout(columns_layout)
# Кнопка закрытия
close_btn = QPushButton("Закрыть")
close_btn.clicked.connect(self.accept)
close_layout = QHBoxLayout()
close_layout.addStretch()
close_layout.addWidget(close_btn)
layout.addLayout(close_layout)
def _update_cameras_list(self):
"""Обновляет отображение списка камер"""
self.cameras_list.clear()
for camera in self.cameras:
self.cameras_list.addItem(camera)
self._selected_camera = None
self.remove_camera_btn.setEnabled(False)
def _update_lenses_list(self):
"""Обновляет отображение списка объективов"""
self.lenses_list.clear()
for lens in self.lenses:
self.lenses_list.addItem(lens)
self._selected_lens = None
self.remove_lens_btn.setEnabled(False)
def _select_camera(self, camera: str):
"""Выделяет камеру в списке"""
self._selected_camera = camera
self.remove_camera_btn.setEnabled(True)
# Снимаем выделение с объективов
self.lenses_list.clearSelection()
self._selected_lens = None
self.remove_lens_btn.setEnabled(False)
def _select_lens(self, lens: str):
"""Выделяет объектив в списке"""
self._selected_lens = lens
self.remove_lens_btn.setEnabled(True)
# Снимаем выделение с камер
self.cameras_list.clearSelection()
self._selected_camera = None
self.remove_camera_btn.setEnabled(False)
def _add_camera(self):
"""Добавляет новую камеру"""
new_camera, ok = QInputDialog.getText(self, "Добавить камеру", "Введите название камеры:")
if ok and new_camera and new_camera.strip():
new_name = new_camera.strip()
if new_name in self.cameras:
QMessageBox.warning(self, "Ошибка", "Такая камера уже существует!")
return
self.cameras.append(new_name)
self.config_service.add_camera(new_name)
self._update_cameras_list()
QMessageBox.information(self, "Успех", f"Камера '{new_name}' добавлена")
def _remove_camera(self):
"""Удаляет выбранную камеру"""
if hasattr(self, '_selected_camera') and self._selected_camera:
reply = QMessageBox.question(self, "Подтверждение",
f"Удалить камеру '{self._selected_camera}'?",
QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
self.cameras.remove(self._selected_camera)
self.config_service.remove_camera(self._selected_camera)
self._update_cameras_list()
QMessageBox.information(self, "Успех", f"Камера '{self._selected_camera}' удалена")
def _add_lens(self):
"""Добавляет новый объектив"""
new_lens, ok = QInputDialog.getText(self, "Добавить объектив", "Введите название объектива:")
if ok and new_lens and new_lens.strip():
new_name = new_lens.strip()
if new_name in self.lenses:
QMessageBox.warning(self, "Ошибка", "Такой объектив уже существует!")
return
self.lenses.append(new_name)
self.config_service.add_lens(new_name)
self._update_lenses_list()
QMessageBox.information(self, "Успех", f"Объектив '{new_name}' добавлен")
def _remove_lens(self):
"""Удаляет выбранный объектив"""
if hasattr(self, '_selected_lens') and self._selected_lens:
reply = QMessageBox.question(self, "Подтверждение",
f"Удалить объектив '{self._selected_lens}'?",
QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
self.lenses.remove(self._selected_lens)
self.config_service.remove_lens(self._selected_lens)
self._update_lenses_list()
QMessageBox.information(self, "Успех", f"Объектив '{self._selected_lens}' удалён")