2026-05-07 17:15:56 +03:00
|
|
|
|
"""
|
|
|
|
|
|
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}'")
|