fuck yeah!
This commit is contained in:
parent
ccb53d9091
commit
da10f5e132
44 changed files with 3260 additions and 448 deletions
126
views/metadata_viewer.py
Normal file
126
views/metadata_viewer.py
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
"""
|
||||
Виджет для отображения 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("Выберите слой для просмотра метаданных")
|
||||
Loading…
Add table
Add a link
Reference in a new issue