Source code for impy.viewer.widgets.results

from __future__ import annotations
from qtpy.QtWidgets import QWidget, QTableWidget, QTableWidgetItem, QAbstractItemView, QAbstractScrollArea, QVBoxLayout
from qtpy.QtCore import Qt
import napari

[docs]class ResultStackView(QWidget): MAX_ROW_NUMBER = 50 def __init__(self, viewer:"napari.Viewer"): super().__init__(viewer.window._qt_window) self.viewer = viewer self.setLayout(QVBoxLayout()) self._list = [] self._add_table() def __len__(self): return self.table.rowCount() def __getitem__(self, key): return self._list[key] def __iter__(self): return iter(self._list) def __repr__(self): names = [] for x in self._list: s = repr(x) if len(s) < 42: names.append(s) else: names.append(s.__class__.__name__) return f"{self.__class__.__name__} with \n{names}"
[docs] def append(self, result): self._list.append(result) nrow = self.table.rowCount() self.table.insertRow(nrow) item = QTableWidgetItem(result.__class__.__name__) item.setFlags(Qt.ItemIsEnabled) self.table.setItem(nrow, 0, item) item = QTableWidgetItem(_as_short_str(result)) item.setFlags(Qt.ItemIsEnabled) self.table.setItem(nrow, 1, item) if nrow > self.__class__.MAX_ROW_NUMBER: self.pop(0) # scroll to the last item = self.table.item(nrow, 0) self.table.scrollToItem(item, hint=QAbstractItemView.PositionAtTop) self.table.resizeColumnsToContents() if len(self._list) == 1: from ..viewer import ResultsWidgetName self.viewer.window._dock_widgets[ResultsWidgetName].show() return None
[docs] def pop(self, i:int=-1): if i < 0: i = len(self) + i out = self._list.pop(i) self.table.removeRow(i) return out
[docs] def clear(self): self.layout().removeWidget(self.table) self._list = [] self._add_table() return None
def _add_table(self): self.table = QTableWidget(0, 3, self) self.table.setHorizontalHeaderItem(0, QTableWidgetItem("Type")) self.table.setHorizontalHeaderItem(1, QTableWidgetItem("Value")) self.table.setHorizontalHeaderItem(2, QTableWidgetItem("Note")) self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.table.resizeColumnsToContents() self.layout().addWidget(self.table) return None
def _as_short_str(obj): try: s = str(obj) except Exception: s = obj.__class__.__name__ if "\n" in s: i = s.find("\n") s = s[:min(i, 20)] + " ..." elif len(s) > 20: s = s[:20] + " ..." return s