Source code for vista.widgets.core.data.data_manager
"""Data manager panel - coordinating panel for managing imagery, tracks, detections, and AOIs"""
from PyQt6.QtCore import QSettings, pyqtSignal
from PyQt6.QtWidgets import QTabWidget, QVBoxLayout, QWidget
from .aois_panel import AOIsPanel
from .detections_panel import DetectionsPanel
from .features_panel import FeaturesPanel
from .imagery_panel import ImageryPanel
from .sensors_panel import SensorsPanel
from .tracks_panel import TracksPanel
[docs]
class DataManagerPanel(QWidget):
"""Main panel for managing all data types"""
data_changed = pyqtSignal() # Signal when data is modified
[docs]
def __init__(self, viewer):
"""
Initialize the data manager panel.
Parameters
----------
viewer : ImageryViewer
ImageryViewer instance
"""
super().__init__()
self.viewer = viewer
self.settings = QSettings("VISTA", "DataManager")
self.selected_sensor = None
self.init_ui()
[docs]
def init_ui(self):
"""Initialize the user interface"""
layout = QVBoxLayout()
# Create tab widget
self.tabs = QTabWidget()
# Create panel instances
self.sensors_panel = SensorsPanel(self.viewer)
self.imagery_panel = ImageryPanel(self.viewer)
self.tracks_panel = TracksPanel(self.viewer)
self.detections_panel = DetectionsPanel(self.viewer)
self.aois_panel = AOIsPanel(self.viewer)
self.features_panel = FeaturesPanel(self.viewer)
# Connect panel signals
self.sensors_panel.data_changed.connect(self.on_sensor_data_changed)
self.sensors_panel.sensor_selected.connect(self.on_sensor_selected)
self.imagery_panel.data_changed.connect(self.data_changed.emit)
self.tracks_panel.data_changed.connect(self.data_changed.emit)
self.detections_panel.data_changed.connect(self.data_changed.emit)
self.aois_panel.data_changed.connect(self.data_changed.emit)
self.features_panel.data_changed.connect(self.data_changed.emit)
# Add panels as tabs
self.tabs.addTab(self.sensors_panel, "Sensors")
self.tabs.addTab(self.imagery_panel, "Imagery")
self.tabs.addTab(self.tracks_panel, "Tracks")
self.tabs.addTab(self.detections_panel, "Detections")
self.tabs.addTab(self.aois_panel, "AOIs")
self.tabs.addTab(self.features_panel, "Features")
layout.addWidget(self.tabs)
self.setLayout(layout)
[docs]
def on_sensor_selected(self, sensor):
"""Handle sensor selection change"""
self.selected_sensor = sensor
# Filter the viewer to show only data for selected sensor
self.viewer.filter_by_sensor(sensor)
# Refresh other panels to show only data for selected sensor
self.imagery_panel.refresh_imagery_table()
self.tracks_panel.refresh_tracks_table()
self.detections_panel.refresh_detections_table()
[docs]
def on_sensor_data_changed(self):
"""Handle sensor data changes (e.g., sensor deletion)"""
# Refresh all panels
self.refresh()
# Emit data changed signal
self.data_changed.emit()
[docs]
def refresh(self):
"""Refresh all panels"""
self.sensors_panel.refresh_sensors_table()
self.imagery_panel.refresh_imagery_table()
self.tracks_panel.refresh_tracks_table()
self.detections_panel.refresh_detections_table()
self.aois_panel.refresh_aois_table()
self.features_panel.refresh_features_table()
[docs]
def on_track_selected_in_viewer(self, track):
"""
Handle track selection from viewer click.
Forwards to tracks panel or detections panel depending on state.
Parameters
----------
track : Track
Track object that was clicked
"""
# Check if detections panel is waiting for track selection
if self.detections_panel.waiting_for_track_selection:
self.detections_panel.on_track_selected_for_adding_detections(track)
else:
self.tabs.setCurrentIndex(2) # Switch to tracks tab (now index 2 because sensors is 0)
self.tracks_panel.on_track_selected_in_viewer(track)
[docs]
def on_detections_selected_in_viewer(self, detections):
"""
Handle detection selection from viewer click.
Forwards to detections panel.
Parameters
----------
detections : list of tuple
List of tuples [(detector, frame, index), ...]
"""
self.detections_panel.on_detections_selected_in_viewer(detections)
[docs]
def refresh_aois_table(self):
"""Refresh AOIs table - wrapper for compatibility"""
self.aois_panel.refresh_aois_table()