""" Виджет для отображения 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("Выберите слой для просмотра метаданных")