HelioParser/views/control_panel.py

159 lines
5.9 KiB
Python
Raw Permalink Normal View History

2026-06-10 17:33:12 +03:00
"""
Панель управления - выбор даты, спектра, загрузка изображений
"""
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)}%")