""" Панель управления - выбор даты, спектра, загрузка изображений """ from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QComboBox, QDateEdit, QTimeEdit, QPushButton, QLabel, QProgressBar, QFrame ) from PySide6.QtCore import Qt, QDateTime, Signal from datetime import datetime class ControlPanel(QWidget): """Панель управления для выбора параметров загрузки""" load_image_requested = Signal(int, datetime) # source_id, date def __init__(self, controller): super().__init__() self.controller = controller self.init_ui() def init_ui(self): """Инициализация UI""" layout = QVBoxLayout(self) layout.setSpacing(10) layout.setContentsMargins(5, 5, 5, 5) # Группа выбора спектра spectrum_group = QGroupBox("🌞 Спектральный канал") spectrum_layout = QVBoxLayout(spectrum_group) self.spectrum_combo = QComboBox() self.spectrum_combo.setMinimumHeight(30) self.populate_spectrums() spectrum_layout.addWidget(self.spectrum_combo) layout.addWidget(spectrum_group) # Группа выбора даты и времени date_group = QGroupBox("📅 Дата и время (UTC)") date_layout = QVBoxLayout(date_group) # Дата date_label = QLabel("Дата:") date_layout.addWidget(date_label) self.date_edit = QDateEdit() self.date_edit.setDateTime(QDateTime.currentDateTime()) self.date_edit.setCalendarPopup(True) self.date_edit.setMinimumHeight(30) date_layout.addWidget(self.date_edit) # Время time_label = QLabel("Время:") date_layout.addWidget(time_label) self.time_edit = QTimeEdit() self.time_edit.setTime(QDateTime.currentDateTime().time()) self.time_edit.setMinimumHeight(30) date_layout.addWidget(self.time_edit) # Кнопки быстрого выбора quick_layout = QHBoxLayout() now_button = QPushButton("Сейчас") now_button.setMinimumHeight(30) now_button.clicked.connect(self.set_now) quick_layout.addWidget(now_button) today_button = QPushButton("Сегодня") today_button.setMinimumHeight(30) today_button.clicked.connect(self.set_today) quick_layout.addWidget(today_button) date_layout.addLayout(quick_layout) layout.addWidget(date_group) # Кнопка загрузки self.load_button = QPushButton("📥 Загрузить изображение") self.load_button.setMinimumHeight(40) self.load_button.clicked.connect(self.request_load_image) self.load_button.setStyleSheet(""" QPushButton { background-color: #2ecc71; color: white; font-weight: bold; font-size: 14px; padding: 10px; border-radius: 5px; } QPushButton:hover { background-color: #27ae60; } QPushButton:disabled { background-color: #555; } """) layout.addWidget(self.load_button) # Прогресс бар (для загрузки) self.progress_bar = QProgressBar() self.progress_bar.setVisible(False) self.progress_bar.setMinimumHeight(20) layout.addWidget(self.progress_bar) # Информационная метка self.info_label = QLabel("Выберите спектральный канал и дату") self.info_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.info_label.setStyleSheet("color: #888; font-size: 11px; padding: 5px;") layout.addWidget(self.info_label) def populate_spectrums(self): """Заполняет список доступных спектров""" from models.api_model import HelioviewerAPI sources = HelioviewerAPI.get_available_sources() for source_id, info in sources.items(): display_text = f"{info['observatory']} - {info['name']} ({info['wavelength']})" self.spectrum_combo.addItem(display_text, source_id) def get_selected_source_id(self) -> int: """Возвращает ID выбранного источника""" return self.spectrum_combo.currentData() def get_selected_datetime(self) -> datetime: """Возвращает выбранную дату и время""" qdatetime = QDateTime(self.date_edit.date(), self.time_edit.time()) return qdatetime.toPython() def set_now(self): """Устанавливает текущее время""" now = QDateTime.currentDateTime() self.date_edit.setDate(now.date()) self.time_edit.setTime(now.time()) def set_today(self): """Устанавливает сегодняшнюю дату""" self.date_edit.setDate(QDateTime.currentDateTime().date()) def request_load_image(self): """Запрашивает загрузку изображения""" source_id = self.get_selected_source_id() date = self.get_selected_datetime() self.load_image_requested.emit(source_id, date) def show_progress(self, show: bool): """Показывает/скрывает прогресс бар""" self.progress_bar.setVisible(show) self.load_button.setEnabled(not show) self.info_label.setText("Загрузка..." if show else "Готово") def update_progress(self, value: int, maximum: int): """Обновляет прогресс""" self.progress_bar.setRange(0, maximum) self.progress_bar.setValue(value) self.info_label.setText(f"Загрузка: {int(value/maximum*100)}%")