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