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

361 lines
15 KiB
Python
Raw Normal View History

2026-05-07 17:15:56 +03:00
"""
EquipmentDialog - диалог управления оборудованием
Камеры, объективы и телескопы
2026-05-07 17:15:56 +03:00
"""
from PySide6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QListWidget,
QPushButton, QInputDialog, QMessageBox, QWidget, QTabWidget,
QFormLayout, QDoubleSpinBox, QSpinBox, QLineEdit
2026-05-07 17:15:56 +03:00
)
from PySide6.QtCore import Qt
from PySide6.QtGui import QFont
from services.config_service import ConfigService
class EquipmentDialog(QDialog):
"""Диалог для управления оборудованием"""
2026-05-07 17:15:56 +03:00
def __init__(self, parent, config_service: ConfigService):
super().__init__(parent)
self.config_service = config_service
self.setWindowTitle("Управление оборудованием")
self.setMinimumSize(700, 500)
self.resize(800, 550)
2026-05-07 17:15:56 +03:00
# Загружаем данные
2026-05-07 17:15:56 +03:00
self.cameras = self.config_service.get_cameras()
self.lenses = self.config_service.get_lenses()
self.telescopes = self.config_service.get_telescopes()
2026-05-07 17:15:56 +03:00
self._create_ui()
self._update_cameras_list()
self._update_lenses_list()
self._update_telescopes_list()
2026-05-07 17:15:56 +03:00
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)
# Используем QTabWidget для трёх вкладок
tab_widget = QTabWidget()
2026-05-07 17:15:56 +03:00
# Вкладка: Камеры
cameras_tab = self._create_cameras_tab()
tab_widget.addTab(cameras_tab, "📷 Камеры")
2026-05-07 17:15:56 +03:00
# Вкладка: Объективы
lenses_tab = self._create_lenses_tab()
tab_widget.addTab(lenses_tab, "🔭 Объективы")
2026-05-07 17:15:56 +03:00
# Вкладка: Телескопы
telescopes_tab = self._create_telescopes_tab()
tab_widget.addTab(telescopes_tab, "🪐 Телескопы")
layout.addWidget(tab_widget)
# Кнопка закрытия
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 _create_cameras_tab(self) -> QWidget:
"""Создаёт вкладку с камерами"""
tab = QWidget()
layout = QVBoxLayout(tab)
# Список камер
2026-05-07 17:15:56 +03:00
self.cameras_list = QListWidget()
self.cameras_list.itemClicked.connect(lambda item: self._select_camera(item.text()))
layout.addWidget(self.cameras_list)
2026-05-07 17:15:56 +03:00
# Кнопки
buttons_layout = QHBoxLayout()
2026-05-07 17:15:56 +03:00
add_btn = QPushButton(" Добавить камеру")
add_btn.clicked.connect(self._add_camera)
buttons_layout.addWidget(add_btn)
2026-05-07 17:15:56 +03:00
self.remove_camera_btn = QPushButton("❌ Удалить")
self.remove_camera_btn.setEnabled(False)
self.remove_camera_btn.clicked.connect(self._remove_camera)
buttons_layout.addWidget(self.remove_camera_btn)
2026-05-07 17:15:56 +03:00
layout.addLayout(buttons_layout)
2026-05-07 17:15:56 +03:00
return tab
2026-05-07 17:15:56 +03:00
def _create_lenses_tab(self) -> QWidget:
"""Создаёт вкладку с объективами"""
tab = QWidget()
layout = QVBoxLayout(tab)
2026-05-07 17:15:56 +03:00
# Список объективов
2026-05-07 17:15:56 +03:00
self.lenses_list = QListWidget()
self.lenses_list.itemClicked.connect(lambda item: self._select_lens(item.text()))
layout.addWidget(self.lenses_list)
2026-05-07 17:15:56 +03:00
# Кнопки
buttons_layout = QHBoxLayout()
2026-05-07 17:15:56 +03:00
add_btn = QPushButton(" Добавить объектив")
add_btn.clicked.connect(self._add_lens)
buttons_layout.addWidget(add_btn)
2026-05-07 17:15:56 +03:00
self.remove_lens_btn = QPushButton("❌ Удалить")
self.remove_lens_btn.setEnabled(False)
self.remove_lens_btn.clicked.connect(self._remove_lens)
buttons_layout.addWidget(self.remove_lens_btn)
2026-05-07 17:15:56 +03:00
edit_btn = QPushButton("✏ Редактировать")
edit_btn.clicked.connect(self._edit_lens)
buttons_layout.addWidget(edit_btn)
2026-05-07 17:15:56 +03:00
layout.addLayout(buttons_layout)
2026-05-07 17:15:56 +03:00
return tab
def _create_telescopes_tab(self) -> QWidget:
"""Создаёт вкладку с телескопами"""
tab = QWidget()
layout = QVBoxLayout(tab)
# Список телескопов
self.telescopes_list = QListWidget()
self.telescopes_list.itemClicked.connect(lambda item: self._select_telescope(item.text()))
layout.addWidget(self.telescopes_list)
# Кнопки
buttons_layout = QHBoxLayout()
add_btn = QPushButton(" Добавить телескоп")
add_btn.clicked.connect(self._add_telescope)
buttons_layout.addWidget(add_btn)
self.remove_telescope_btn = QPushButton("❌ Удалить")
self.remove_telescope_btn.setEnabled(False)
self.remove_telescope_btn.clicked.connect(self._remove_telescope)
buttons_layout.addWidget(self.remove_telescope_btn)
edit_btn = QPushButton("✏ Редактировать")
edit_btn.clicked.connect(self._edit_telescope)
buttons_layout.addWidget(edit_btn)
layout.addLayout(buttons_layout)
return tab
# ===== Методы для камер =====
2026-05-07 17:15:56 +03:00
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 _select_camera(self, camera: str):
self._selected_camera = camera
self.remove_camera_btn.setEnabled(True)
self.lenses_list.clearSelection()
self.telescopes_list.clearSelection()
2026-05-07 17:15:56 +03:00
self._selected_lens = None
self._selected_telescope = None
2026-05-07 17:15:56 +03:00
self.remove_lens_btn.setEnabled(False)
self.remove_telescope_btn.setEnabled(False)
2026-05-07 17:15:56 +03:00
def _add_camera(self):
name, ok = QInputDialog.getText(self, "Добавить камеру", "Введите название камеры:")
if ok and name and name.strip():
new_name = name.strip()
2026-05-07 17:15:56 +03:00
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)
2026-05-07 17:15:56 +03:00
if reply == QMessageBox.Yes:
self.cameras.remove(self._selected_camera)
self.config_service.remove_camera(self._selected_camera)
self._update_cameras_list()
# ===== Методы для объективов =====
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_lens(self, lens: str):
self._selected_lens = lens
self.remove_lens_btn.setEnabled(True)
self.cameras_list.clearSelection()
self.telescopes_list.clearSelection()
self._selected_camera = None
self._selected_telescope = None
self.remove_camera_btn.setEnabled(False)
self.remove_telescope_btn.setEnabled(False)
2026-05-07 17:15:56 +03:00
def _add_lens(self):
name, ok = QInputDialog.getText(self, "Добавить объектив", "Введите название объектива:")
if ok and name and name.strip():
new_name = name.strip()
2026-05-07 17:15:56 +03:00
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)
2026-05-07 17:15:56 +03:00
if reply == QMessageBox.Yes:
self.lenses.remove(self._selected_lens)
self.config_service.remove_lens(self._selected_lens)
self._update_lenses_list()
def _edit_lens(self):
if hasattr(self, '_selected_lens') and self._selected_lens:
new_name, ok = QInputDialog.getText(self, "Редактировать объектив",
f"Изменить '{self._selected_lens}' на:",
text=self._selected_lens)
if ok and new_name and new_name.strip():
new_name = new_name.strip()
if new_name != self._selected_lens:
if new_name in self.lenses:
QMessageBox.warning(self, "Ошибка", "Такой объектив уже существует!")
return
idx = self.lenses.index(self._selected_lens)
self.lenses[idx] = new_name
# Обновляем в конфиге (пока просто удаляем старый и добавляем новый)
self.config_service.remove_lens(self._selected_lens)
self.config_service.add_lens(new_name)
self._update_lenses_list()
# ===== Методы для телескопов =====
def _update_telescopes_list(self):
self.telescopes_list.clear()
for telescope in self.telescopes:
self.telescopes_list.addItem(telescope)
self._selected_telescope = None
self.remove_telescope_btn.setEnabled(False)
def _select_telescope(self, telescope: str):
self._selected_telescope = telescope
self.remove_telescope_btn.setEnabled(True)
self.cameras_list.clearSelection()
self.lenses_list.clearSelection()
self._selected_camera = None
self._selected_lens = None
self.remove_camera_btn.setEnabled(False)
self.remove_lens_btn.setEnabled(False)
def _add_telescope(self):
"""Добавляет телескоп с указанием диафрагмы (фиксированной)"""
dialog = QDialog(self)
dialog.setWindowTitle("Добавить телескоп")
dialog.setMinimumWidth(400)
layout = QVBoxLayout(dialog)
form_layout = QFormLayout()
name_edit = QLineEdit()
name_edit.setPlaceholderText("例如: Celestron 8\"")
form_layout.addRow("Название:", name_edit)
aperture_spin = QDoubleSpinBox()
aperture_spin.setRange(0.5, 20.0)
aperture_spin.setSingleStep(0.1)
aperture_spin.setValue(5.0)
aperture_spin.setSuffix(" (f/)")
form_layout.addRow("Диафрагма (f/):", aperture_spin)
focal_spin = QSpinBox()
focal_spin.setRange(100, 5000)
focal_spin.setSingleStep(50)
focal_spin.setSuffix(" мм")
form_layout.addRow("Фокусное расстояние:", focal_spin)
diameter_spin = QSpinBox()
diameter_spin.setRange(50, 500)
diameter_spin.setSingleStep(10)
diameter_spin.setSuffix(" мм")
form_layout.addRow("Диаметр объектива:", diameter_spin)
layout.addLayout(form_layout)
buttons_layout = QHBoxLayout()
ok_btn = QPushButton("OK")
cancel_btn = QPushButton("Отмена")
buttons_layout.addWidget(ok_btn)
buttons_layout.addWidget(cancel_btn)
layout.addLayout(buttons_layout)
ok_btn.clicked.connect(dialog.accept)
cancel_btn.clicked.connect(dialog.reject)
if dialog.exec():
name = name_edit.text().strip()
if name:
telescope_info = f"{name} (f/{aperture_spin.value()}, F={focal_spin.value()}mm, D={diameter_spin.value()}mm)"
if telescope_info not in self.telescopes:
self.telescopes.append(telescope_info)
self.config_service.add_telescope(telescope_info)
self._update_telescopes_list()
QMessageBox.information(self, "Успех", f"Телескоп '{name}' добавлен")
def _remove_telescope(self):
if hasattr(self, '_selected_telescope') and self._selected_telescope:
reply = QMessageBox.question(self, "Подтверждение",
f"Удалить телескоп '{self._selected_telescope}'?",
QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
self.telescopes.remove(self._selected_telescope)
self.config_service.remove_telescope(self._selected_telescope)
self._update_telescopes_list()
def _edit_telescope(self):
if hasattr(self, '_selected_telescope') and self._selected_telescope:
new_name, ok = QInputDialog.getText(self, "Редактировать телескоп",
f"Изменить '{self._selected_telescope}' на:",
text=self._selected_telescope)
if ok and new_name and new_name.strip():
new_name = new_name.strip()
if new_name != self._selected_telescope:
if new_name in self.telescopes:
QMessageBox.warning(self, "Ошибка", "Такой телескоп уже существует!")
return
idx = self.telescopes.index(self._selected_telescope)
self.telescopes[idx] = new_name
self.config_service.remove_telescope(self._selected_telescope)
self.config_service.add_telescope(new_name)
self._update_telescopes_list()