GUI: fixed bug where reference_tools_panel.py would infinite loop due to refactoring of self._rows to self._samples

This commit is contained in:
martinappleby
2025-11-07 14:02:17 +01:00
parent f6228dad5a
commit 02ad6269c6
@@ -13,9 +13,13 @@ from PySide6.QtWidgets import (
QMenu,
QAbstractItemView,
)
from aaredaqlib.logger_config import setup_logger
from aaredaqlib.models import SampleShortInfoList, SampleShortInfo, BeamlineStateEnum, DAQStatusModel
from aaregui.widgets.title_label import TitleLabel
logger = setup_logger("aareGUI")
def get_entry(sample: SampleShortInfo, column: int):
if column == 0:
return sample.loc_str()
@@ -23,22 +27,25 @@ def get_entry(sample: SampleShortInfo, column: int):
return sample.sample_name
elif column == 2:
return sample.mount_count
return None
return ""
class ReferenceToolsModel(QAbstractTableModel):
def __init__(self, rows: Optional[list[SampleShortInfo]] | None = None, parent=None, current_reference: int | None = None,):
super().__init__(parent)
self._rows: list[SampleShortInfo] = rows or []
self.samples: list[SampleShortInfo] = rows or []
self.current_reference = current_reference
self.header = ["Position", "Sample name", "Mount count"]
self.__sort_col = 0
self.__sort_order = Qt.SortOrder.AscendingOrder
self.__sorted_samples: list[SampleShortInfo] = []
self._sort()
if self.samples:
self._sort()
else:
self.__sorted_samples = []
def rowCount(self, parent: QModelIndex = QModelIndex()) -> int:
return len(self._rows)
return len(self.__sorted_samples)
def columnCount(self, parent: QModelIndex = QModelIndex()) -> int:
return len(self.header)
@@ -47,6 +54,9 @@ class ReferenceToolsModel(QAbstractTableModel):
if not index.isValid():
return None
if index.row() >= len(self.__sorted_samples):
return None
if role == Qt.ItemDataRole.DisplayRole:
return get_entry(self.__sorted_samples[index.row()], index.column())
elif role == Qt.ItemDataRole.TextAlignmentRole:
@@ -69,9 +79,13 @@ class ReferenceToolsModel(QAbstractTableModel):
def update_rows(self, rows: list[SampleShortInfo]):
self.beginResetModel()
self.samples = rows
self._sort()
if self.samples: # Only sort if we have samples
self._sort()
else:
self.__sorted_samples = [] # Clear sorted samples if no data
self.endResetModel()
def sort(self, column, order):
self.layoutAboutToBeChanged.emit()
self.__sort_order = order
@@ -81,6 +95,10 @@ class ReferenceToolsModel(QAbstractTableModel):
def _sort(self):
"""Sort samples, using special handling for location column."""
if not self.samples:
self.__sorted_samples = []
return
if self.__sort_col == 0:
# Special sorting for location (Position column)
self.__sorted_samples = sorted(
@@ -158,12 +176,16 @@ class ReferenceToolsPanel(QFrame):
)
self.table_view.setEditTriggers(QTableView.EditTrigger.NoEditTriggers)
logger.debug("Setting up table header")
header = self.table_view.horizontalHeader()
logger.debug("Setting up table header")
header.setSectionResizeMode(QHeaderView.ResizeMode.Interactive)
logger.debug("Setting up table header")
header.setStretchLastSection(True)
self.table_view.verticalHeader().setVisible(True)
logger.debug("Setting up table view sorting")
self.table_view.setSortingEnabled(True)
logger.debug("Setting up table view context menu")
self.table_view.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.table_view.customContextMenuRequested.connect(self._context_menu)
self.table_view.setSelectionBehavior(