Source code for SDF.GUI.browser.sdf_tree
from typing import Optional, List
from PyQt5.QtCore import QItemSelection
from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QWidget
from SDF.GUI.browser.preview import DataPreviewWidget
from SDF.GUI.browser.summary import SummaryWidget
from SDF.data_model import ArrayDataset1D, ArrayDataset2D, ImageDataset, SDFObject, Workspace
[docs]class SDFTreeWidgetItem(QTreeWidgetItem):
def __init__(self, parent: "SDFTreeWidgetItem", sdf: SDFObject):
super().__init__(parent)
self.sdf = sdf
self.setText(0, sdf.name)
self.setText(1, self.__create_summary(sdf))
@staticmethod
def __create_summary(sdf: SDFObject) -> str:
"""
Create a summary text of an sdf_object to be displayed
in the second column of the QTreeView.
"""
ret = ""
if isinstance(sdf, ArrayDataset1D):
ret += f"single-column data of length {sdf.data.shape[0]}, "
elif isinstance(sdf, ArrayDataset2D):
ret += f"data array of shape {sdf.data.shape}, "
elif isinstance(sdf, ImageDataset):
ret += "image data, "
elif isinstance(sdf, Workspace):
ret += f"contains {len(sdf.workspaces)} workspaces, {len(sdf.datasets)} datasets, "
else:
raise TypeError(f"Expected SDFObject, got {sdf}")
n_samples = len(sdf.samples)
if n_samples:
ret += f"{n_samples} sample{'s' if n_samples>1 else ''}, "
n_instruments = len(sdf.instruments)
if n_instruments:
ret += f"{n_instruments} instrument{'s' if n_instruments>1 else ''}, "
n_parameters = len(sdf.parameters)
if n_parameters:
ret += f"{n_parameters} parameter{'s' if n_parameters>1 else ''}"
ret = ret.rstrip()
ret = ret.rstrip(',')
return ret
[docs]class SDFTreeWidget(QTreeWidget):
def __init__(self, parent: QWidget, summary_widget: SummaryWidget, data_preview_widget: DataPreviewWidget):
super().__init__(parent=parent)
self.data_preview_widget = data_preview_widget
self.summary_widget = summary_widget
self.setColumnCount(2)
self.setHeaderLabels(["Name", "Summary"])
[docs] def add_sdf_object(self, sdf: SDFObject) -> None:
self.addTopLevelItem(self.__sdf_to_item(sdf, parent=None))
self.resizeColumnToContents(0) # resize first column so that its content is fully displayed
@staticmethod
def __sdf_to_item(sdf: SDFObject, parent: Optional[SDFTreeWidgetItem]) -> QTreeWidgetItem:
item = SDFTreeWidgetItem(parent, sdf)
if isinstance(sdf, Workspace):
for child in sdf:
item.addChild(SDFTreeWidget.__sdf_to_item(child, parent=item))
return item
[docs] def selectionChanged(self, selected: QItemSelection, deselected: QItemSelection) -> None:
selected_items: List[SDFTreeWidgetItem] = self.selectedItems()
if selected_items:
sdf = selected_items[0].sdf
if sdf is None:
# sometimes, the left arrow key can select empty elements of the TreeView
return
self.summary_widget.display_sdf_object(sdf)
self.data_preview_widget.display_sdf_object(sdf)