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}' удалён")
|