From 02ad6269c61e6550bc2e9d0657aa2720210596c2 Mon Sep 17 00:00:00 2001 From: martinappleby Date: Fri, 7 Nov 2025 14:02:17 +0100 Subject: [PATCH] GUI: fixed bug where reference_tools_panel.py would infinite loop due to refactoring of self._rows to self._samples --- .../aaregui/panels/reference_tools_panel.py | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/gui/src/aaregui/panels/reference_tools_panel.py b/gui/src/aaregui/panels/reference_tools_panel.py index b65f8054..e3b5a2c3 100644 --- a/gui/src/aaregui/panels/reference_tools_panel.py +++ b/gui/src/aaregui/panels/reference_tools_panel.py @@ -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(