HelioParser/views/metadata_viewer.py

126 lines
5.1 KiB
Python
Raw Permalink Normal View History

2026-06-10 17:33:12 +03:00
"""
Виджет для отображения FITS-метаданных из JP2 файлов
"""
from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem,
QGroupBox, QLabel, QScrollArea
)
from PySide6.QtCore import Qt
class MetadataViewer(QWidget):
"""Просмотрщик метаданных FITS"""
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
# Используем QScrollArea для метаданных
scroll_area = QScrollArea()
scroll_area.setWidgetResizable(True)
scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
scroll_area.setStyleSheet("""
QScrollArea {
border: 1px solid #555;
border-radius: 5px;
background-color: #2b2b2b;
}
""")
# Внутренний контейнер
content_widget = QWidget()
content_layout = QVBoxLayout(content_widget)
content_layout.setContentsMargins(5, 5, 5, 5)
# Дерево для метаданных
self.tree = QTreeWidget()
self.tree.setHeaderLabels(["Параметр", "Значение"])
self.tree.setAlternatingRowColors(True)
self.tree.setIndentation(10)
self.tree.setMinimumHeight(150)
self.tree.setStyleSheet("""
QTreeWidget {
background-color: #2b2b2b;
alternate-background-color: #252525;
border: none;
}
QTreeWidget::item {
padding: 3px;
}
""")
content_layout.addWidget(self.tree)
# Информационная метка
self.info_label = QLabel("Выберите слой для просмотра метаданных")
self.info_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.info_label.setStyleSheet("color: #888; padding: 20px;")
self.info_label.setWordWrap(True)
content_layout.addWidget(self.info_label)
scroll_area.setWidget(content_widget)
layout.addWidget(scroll_area)
def display_metadata(self, metadata: dict):
"""Отображает метаданные в дереве"""
self.tree.clear()
if not metadata:
self.info_label.setVisible(True)
self.tree.setVisible(False)
self.info_label.setText("Метаданные не найдены")
return
self.info_label.setVisible(False)
self.tree.setVisible(True)
# Группировка метаданных
categories = {
"📡 Инструмент": ["Телескоп", "Инструмент", "Детектор", "Обсерватория"],
"🌊 Спектр": ["Длина волны", "Единица длины волны"],
"📅 Время": ["Дата наблюдения", "Начало экспозиции", "Конец экспозиции", "Время экспозиции (сек)"],
"📐 Геометрия": ["Центр X (пикс)", "Центр Y (пикс)", "Шаг пикселя X (arcsec)", "Шаг пикселя Y (arcsec)",
"Угол поворота (град)"],
"📊 Изображение": ["Ширина (пикс)", "Высота (пикс)", "Бит на пиксель"],
"📝 Другое": []
}
# Сортируем метаданные
for category, keys in categories.items():
category_items = []
for key in keys:
if key in metadata and metadata[key]:
category_items.append((key, metadata[key]))
# Для категории "Другое" собираем остальные ключи
if category == "📝 Другое":
all_keys = [k for sublist in categories.values() for k in sublist if k != "Другое"]
for key, value in metadata.items():
if key not in all_keys and value:
category_items.append((key, value))
if category_items:
category_item = QTreeWidgetItem(self.tree)
category_item.setText(0, category)
category_item.setExpanded(True)
for key, value in category_items:
param_item = QTreeWidgetItem(category_item)
param_item.setText(0, key)
param_item.setText(1, str(value))
self.tree.expandAll()
self.tree.resizeColumnToContents(0)
self.tree.resizeColumnToContents(1)
def clear(self):
"""Очищает отображение метаданных"""
self.tree.clear()
self.info_label.setVisible(True)
self.tree.setVisible(False)
self.info_label.setText("Выберите слой для просмотра метаданных")