""" CelestialDialog - диалог управления небесными телами Аналог CelestialBodiesDialogController из JavaFX версии """ from PySide6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QListWidget, QPushButton, QLineEdit, QInputDialog, QMessageBox ) from PySide6.QtCore import Qt from PySide6.QtGui import QFont from services.config_service import ConfigService class CelestialDialog(QDialog): """Диалог для управления списком небесных тел""" def __init__(self, parent, config_service: ConfigService): super().__init__(parent) self.config_service = config_service self.setWindowTitle("Небесные тела") self.setMinimumSize(400, 500) self.resize(450, 550) # Загружаем текущий список self.celestial_bodies = self.config_service.get_celestial_bodies() self._create_ui() self._update_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) # Подпись subtitle_label = QLabel("Список объектов для наблюдения") subtitle_font = QFont() subtitle_font.setPointSize(11) subtitle_font.setBold(True) subtitle_label.setFont(subtitle_font) layout.addWidget(subtitle_label) # Список небесных тел self.bodies_list = QListWidget() self.bodies_list.itemClicked.connect(lambda item: self._select_body(item.text())) layout.addWidget(self.bodies_list) # Поле для добавления нового add_layout = QHBoxLayout() self.new_body_entry = QLineEdit() self.new_body_entry.setPlaceholderText("Название объекта (например: M31, NGC 224)") self.new_body_entry.returnPressed.connect(self._add_celestial_body) add_layout.addWidget(self.new_body_entry) add_btn = QPushButton("➕ Добавить") add_btn.clicked.connect(self._add_celestial_body) add_layout.addWidget(add_btn) layout.addLayout(add_layout) # Кнопки удаления и редактирования buttons_layout = QHBoxLayout() self.remove_btn = QPushButton("❌ Удалить выбранный") self.remove_btn.setEnabled(False) self.remove_btn.clicked.connect(self._remove_celestial_body) buttons_layout.addWidget(self.remove_btn) self.edit_btn = QPushButton("✏ Редактировать") self.edit_btn.setEnabled(False) self.edit_btn.clicked.connect(self._edit_celestial_body) buttons_layout.addWidget(self.edit_btn) layout.addLayout(buttons_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_list(self): """Обновляет отображение списка небесных тел""" self.bodies_list.clear() for body in self.celestial_bodies: self.bodies_list.addItem(body) self._selected_body = None self.remove_btn.setEnabled(False) self.edit_btn.setEnabled(False) def _select_body(self, body: str): """Выделяет объект в списке""" self._selected_body = body self.remove_btn.setEnabled(True) self.edit_btn.setEnabled(True) def _add_celestial_body(self): """Добавляет новое небесное тело""" new_body = self.new_body_entry.text() if not new_body or not new_body.strip(): QMessageBox.warning(self, "Ошибка", "Введите название объекта") return new_name = new_body.strip() if new_name in self.celestial_bodies: QMessageBox.warning(self, "Ошибка", f"Объект '{new_name}' уже существует!") return self.celestial_bodies.append(new_name) self.config_service.add_celestial_body(new_name) self._update_list() self.new_body_entry.clear() QMessageBox.information(self, "Успех", f"Объект '{new_name}' добавлен") def _remove_celestial_body(self): """Удаляет выбранное небесное тело""" if hasattr(self, '_selected_body') and self._selected_body: reply = QMessageBox.question(self, "Подтверждение", f"Удалить объект '{self._selected_body}'?", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: self.celestial_bodies.remove(self._selected_body) self.config_service.remove_celestial_body(self._selected_body) self._update_list() QMessageBox.information(self, "Успех", f"Объект '{self._selected_body}' удалён") def _edit_celestial_body(self): """Редактирует выбранное небесное тело""" if hasattr(self, '_selected_body') and self._selected_body: new_name, ok = QInputDialog.getText(self, "Редактировать", f"Изменить '{self._selected_body}' на:", text=self._selected_body) if ok and new_name and new_name.strip(): new_name = new_name.strip() if new_name != self._selected_body: if new_name in self.celestial_bodies: QMessageBox.warning(self, "Ошибка", f"Объект '{new_name}' уже существует!") return idx = self.celestial_bodies.index(self._selected_body) old_name = self.celestial_bodies[idx] self.celestial_bodies[idx] = new_name self.config_service.update_celestial_body(old_name, new_name) self._update_list() QMessageBox.information(self, "Успех", f"Объект переименован в '{new_name}'")