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

361 lines
No EOL
15 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
EquipmentDialog - диалог управления оборудованием
Камеры, объективы и телескопы
"""
from PySide6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QListWidget,
QPushButton, QInputDialog, QMessageBox, QWidget, QTabWidget,
QFormLayout, QDoubleSpinBox, QSpinBox, QLineEdit
)
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(700, 500)
self.resize(800, 550)
# Загружаем данные
self.cameras = self.config_service.get_cameras()
self.lenses = self.config_service.get_lenses()
self.telescopes = self.config_service.get_telescopes()
self._create_ui()
self._update_cameras_list()
self._update_lenses_list()
self._update_telescopes_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)
# Используем QTabWidget для трёх вкладок
tab_widget = QTabWidget()
# Вкладка: Камеры
cameras_tab = self._create_cameras_tab()
tab_widget.addTab(cameras_tab, "📷 Камеры")
# Вкладка: Объективы
lenses_tab = self._create_lenses_tab()
tab_widget.addTab(lenses_tab, "🔭 Объективы")
# Вкладка: Телескопы
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)
# Список камер
self.cameras_list = QListWidget()
self.cameras_list.itemClicked.connect(lambda item: self._select_camera(item.text()))
layout.addWidget(self.cameras_list)
# Кнопки
buttons_layout = QHBoxLayout()
add_btn = QPushButton(" Добавить камеру")
add_btn.clicked.connect(self._add_camera)
buttons_layout.addWidget(add_btn)
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)
layout.addLayout(buttons_layout)
return tab
def _create_lenses_tab(self) -> QWidget:
"""Создаёт вкладку с объективами"""
tab = QWidget()
layout = QVBoxLayout(tab)
# Список объективов
self.lenses_list = QListWidget()
self.lenses_list.itemClicked.connect(lambda item: self._select_lens(item.text()))
layout.addWidget(self.lenses_list)
# Кнопки
buttons_layout = QHBoxLayout()
add_btn = QPushButton(" Добавить объектив")
add_btn.clicked.connect(self._add_lens)
buttons_layout.addWidget(add_btn)
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)
edit_btn = QPushButton("✏ Редактировать")
edit_btn.clicked.connect(self._edit_lens)
buttons_layout.addWidget(edit_btn)
layout.addLayout(buttons_layout)
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
# ===== Методы для камер =====
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()
self._selected_lens = None
self._selected_telescope = None
self.remove_lens_btn.setEnabled(False)
self.remove_telescope_btn.setEnabled(False)
def _add_camera(self):
name, ok = QInputDialog.getText(self, "Добавить камеру", "Введите название камеры:")
if ok and name and name.strip():
new_name = name.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()
# ===== Методы для объективов =====
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)
def _add_lens(self):
name, ok = QInputDialog.getText(self, "Добавить объектив", "Введите название объектива:")
if ok and name and name.strip():
new_name = name.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()
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()