HelioParser/views/control_panel.py
2026-06-10 17:33:12 +03:00

159 lines
No EOL
5.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Панель управления - выбор даты, спектра, загрузка изображений
"""
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)}%")