Source code for vista.widgets.core.data.imagery_panel

"""Imagery panel for data manager"""
from PyQt6.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
    QTableWidget, QTableWidgetItem, QHeaderView
)
from PyQt6.QtCore import Qt, pyqtSignal


[docs] class ImageryPanel(QWidget): """Panel for managing imagery""" data_changed = pyqtSignal() # Signal when data is modified
[docs] def __init__(self, viewer): super().__init__() self.viewer = viewer self.init_ui()
[docs] def init_ui(self): """Initialize the user interface""" layout = QVBoxLayout() # Button layout button_layout = QHBoxLayout() self.delete_imagery_btn = QPushButton("Delete Selected") self.delete_imagery_btn.clicked.connect(self.delete_selected_imagery) button_layout.addWidget(self.delete_imagery_btn) button_layout.addStretch() layout.addLayout(button_layout) # Imagery table self.imagery_table = QTableWidget() self.imagery_table.setColumnCount(2) self.imagery_table.setHorizontalHeaderLabels([ "Name", "Frames" ]) # Enable row selection via vertical header (single selection only) self.imagery_table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) self.imagery_table.setSelectionMode(QTableWidget.SelectionMode.SingleSelection) # Set column resize modes header = self.imagery_table.horizontalHeader() header.setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) # Name (can be long) header.setSectionResizeMode(1, QHeaderView.ResizeMode.ResizeToContents) # Frames (numeric) self.imagery_table.itemSelectionChanged.connect(self.on_imagery_selection_changed) self.imagery_table.cellChanged.connect(self.on_imagery_cell_changed) layout.addWidget(self.imagery_table) self.setLayout(layout)
[docs] def refresh_imagery_table(self): """Refresh the imagery table, filtering by selected sensor""" self.imagery_table.blockSignals(True) self.imagery_table.setRowCount(0) # Get selected sensor from viewer selected_sensor = self.viewer.selected_sensor # Filter imageries by selected sensor filtered_imageries = [] if selected_sensor is not None: filtered_imageries = [img for img in self.viewer.imageries if img.sensor == selected_sensor] else: filtered_imageries = self.viewer.imageries for row, imagery in enumerate(filtered_imageries): self.imagery_table.insertRow(row) # Name (editable) name_item = QTableWidgetItem(imagery.name) name_item.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEditable) name_item.setData(Qt.ItemDataRole.UserRole, imagery.uuid) # Store imagery UUID self.imagery_table.setItem(row, 0, name_item) # Frames (not editable) frames_item = QTableWidgetItem(str(len(imagery.frames))) frames_item.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable) self.imagery_table.setItem(row, 1, frames_item) self.imagery_table.blockSignals(False) # Select the row for the currently active imagery for row, imagery in enumerate(filtered_imageries): if imagery == self.viewer.imagery: self.imagery_table.selectRow(row) break
[docs] def on_imagery_selection_changed(self): """Handle imagery selection changes from table""" # Get selected rows (should only be one due to SingleSelection mode) selected_rows = [index.row() for index in self.imagery_table.selectedIndexes()] if selected_rows: row = selected_rows[0] # Get the imagery UUID from the name item name_item = self.imagery_table.item(row, 0) if name_item: imagery_uuid = name_item.data(Qt.ItemDataRole.UserRole) # Find the imagery by UUID for imagery in self.viewer.imageries: if imagery.uuid == imagery_uuid: self.viewer.select_imagery(imagery) # Update frame range in main window self.parent().parent().parent().parent().parent().update_frame_range_from_imagery() # Note: Don't emit data_changed here - selection doesn't change data break
[docs] def on_imagery_cell_changed(self, row, column): """Handle imagery cell changes""" if column == 0: # Name column item = self.imagery_table.item(row, column) if item: imagery_uuid = item.data(Qt.ItemDataRole.UserRole) new_name = item.text() # Find the imagery and update its name for imagery in self.viewer.imageries: if imagery.uuid == imagery_uuid: imagery.name = new_name self.data_changed.emit() break
[docs] def delete_selected_imagery(self): """Delete imagery that is selected in the table""" # Get selected rows (should only be one due to SingleSelection mode) selected_rows = [index.row() for index in self.imagery_table.selectedIndexes()] if not selected_rows: return row = selected_rows[0] if row < len(self.viewer.imageries): imagery_to_delete = self.viewer.imageries[row] # Check if this is the currently displayed imagery if imagery_to_delete == self.viewer.imagery: # Clear the current imagery self.viewer.imagery = None self.viewer.image_item.clear() # Remove from list self.viewer.imageries.remove(imagery_to_delete) # If there are still imageries and none is selected, select the first one if len(self.viewer.imageries) > 0 and self.viewer.imagery is None: self.viewer.select_imagery(self.viewer.imageries[0]) self.parent().parent().parent().parent().parent().update_frame_range_from_imagery # Refresh table self.refresh_imagery_table() self.data_changed.emit()