From 5623547e926b86eeb5e2164fa6ec9e36b99b8f63 Mon Sep 17 00:00:00 2001 From: David Perl Date: Fri, 13 Jun 2025 17:23:16 +0200 Subject: [PATCH] fix: reset dict table properly --- bec_widgets/utils/forms_from_types/items.py | 10 +++++++--- bec_widgets/widgets/editors/dict_backed_table.py | 10 +++++++--- .../device_browser/device_item/device_config_dialog.py | 3 +-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/bec_widgets/utils/forms_from_types/items.py b/bec_widgets/utils/forms_from_types/items.py index f3fcd74d..6c7d6187 100644 --- a/bec_widgets/utils/forms_from_types/items.py +++ b/bec_widgets/utils/forms_from_types/items.py @@ -11,13 +11,13 @@ from bec_qthemes import material_icon from pydantic import BaseModel, ConfigDict, Field, field_validator from pydantic.fields import FieldInfo from pydantic_core import PydanticUndefined -from PySide6 import QtCore -from PySide6.QtWidgets import QComboBox +from qtpy import QtCore from qtpy.QtCore import Signal # type: ignore from qtpy.QtWidgets import ( QApplication, QButtonGroup, QCheckBox, + QComboBox, QDoubleSpinBox, QGridLayout, QHBoxLayout, @@ -178,6 +178,8 @@ class DynamicFormItem(QWidget): def _set_pretty_display(self): self.setEnabled(False) + if button := getattr(self, "_clear_button", None): + button.setVisible(False) def _describe(self, pad=" "): return pad + (self._desc if self._desc else "") @@ -476,6 +478,8 @@ class SetFormItem(ListFormItem): self._add_item_field = self._types.widget() self._buttons.addWidget(QLabel("Add new:")) self._buttons.addWidget(self._add_item_field) + self.setMinimumSize(QtCore.QSize(50, 100)) + self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.MinimumExpanding) @SafeSlot() def _add_row(self): @@ -504,7 +508,7 @@ class SetFormItem(ListFormItem): return set(self._data) def setValue(self, value: set): - return super().setValue(set(self._data)) + return super().setValue(set(value)) WidgetTypeRegistry = OrderedDict[str, tuple[Callable[[FormItemSpec], bool], type[DynamicFormItem]]] diff --git a/bec_widgets/widgets/editors/dict_backed_table.py b/bec_widgets/widgets/editors/dict_backed_table.py index 3bb57458..15086737 100644 --- a/bec_widgets/widgets/editors/dict_backed_table.py +++ b/bec_widgets/widgets/editors/dict_backed_table.py @@ -55,7 +55,10 @@ class DictBackedTableModel(QAbstractTableModel): Qt.ItemDataRole.EditRole, Qt.ItemDataRole.ToolTipRole, ]: - return str(self._data[index.row()][index.column()]) + try: + return str(self._data[index.row()][index.column()]) + except IndexError: + return None def setData(self, index, value, role): if role == Qt.ItemDataRole.EditRole: @@ -67,9 +70,10 @@ class DictBackedTableModel(QAbstractTableModel): return False def replaceData(self, data: dict): + self.delete_rows(list(range(len(self._data)))) self.resetInternalData() self._data = [[k, v] for k, v in data.items()] - self.dataChanged.emit(self.index(0, 0), self.index(len(self._data), 0)) + self.dataChanged.emit(self.index(0, 0), self.index(len(self._data), 1)) def update_disallowed_keys(self, keys: list[str]): """Set the list of keys which may not be used. @@ -80,7 +84,7 @@ class DictBackedTableModel(QAbstractTableModel): for i, item in enumerate(self._data): if item[0] in self._disallowed_keys: self._data[i][0] = "" - self.dataChanged.emit(self.index(i, 0), self.index(i, 0)) + self.dataChanged.emit(self.index(i, 0), self.index(i, 1)) def _other_keys(self, row: int): return [r[0] for r in self._data[:row] + self._data[row + 1 :]] diff --git a/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py b/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py index 89408514..d62b0561 100644 --- a/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py +++ b/bec_widgets/widgets/services/device_browser/device_item/device_config_dialog.py @@ -5,8 +5,7 @@ from bec_lib.atlas_models import Device as DeviceConfigModel from bec_lib.config_helper import CONF as DEVICE_CONF_KEYS from bec_lib.config_helper import ConfigHelper from bec_lib.logger import bec_logger -from PySide6.QtCore import QObject -from qtpy.QtCore import QRunnable, QSize, Qt, QThreadPool, Signal +from qtpy.QtCore import QObject, QRunnable, QSize, Qt, QThreadPool, Signal from qtpy.QtWidgets import ( QApplication, QDialog,