""" 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()