From c687e05d8fe387fe6c463d3c0f0eedbcfd62dcc5 Mon Sep 17 00:00:00 2001 From: Dylan Jeannin Date: Fri, 22 May 2026 18:36:28 +0200 Subject: [PATCH] Pollutant types: Add type combobox with readable names --- src/Model/Pollutants/Pollutants.py | 12 ++++++ src/Model/Study.py | 3 +- src/View/Network/GraphWidget.py | 2 +- src/View/Pollutants/Edit/Table.py | 59 +++++++++++++++++++++++++++++- src/View/Pollutants/Edit/Window.py | 9 ++++- 5 files changed, 80 insertions(+), 5 deletions(-) diff --git a/src/Model/Pollutants/Pollutants.py b/src/Model/Pollutants/Pollutants.py index cb8f345c..adb85a1d 100644 --- a/src/Model/Pollutants/Pollutants.py +++ b/src/Model/Pollutants/Pollutants.py @@ -34,6 +34,18 @@ from Model.BoundaryConditionsAdisTS.BoundaryConditionAdisTS import ( logger = logging.getLogger() +# Types de polluants: indice -> nom du type +POLLUTANT_TYPES = { + 0: "Soluté", + 1: "Particules sphériques", + 2: "Galets lisses", + 3: "Sable naturel", + 4: "Sable concassé", + 5: "Cylindres longs", + 6: "Limon, particules cohésives", + 7: "Flocs" +} + class PollutantCharacteristics(SQLSubModel): _sub_classes = [] diff --git a/src/Model/Study.py b/src/Model/Study.py index 250efa8f..d08e7c4d 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -546,7 +546,8 @@ class Study(SQLModel): self.status.scenario = scenario if reduce( - lambda a, s: a or (s.parent is scenario and not s.is_deleted()), + lambda a, s: a or (s.parent is scenario + and not s.is_deleted()), self.scenarios.lst, False ): diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py index 5c41ee9d..160c1f45 100644 --- a/src/View/Network/GraphWidget.py +++ b/src/View/Network/GraphWidget.py @@ -965,7 +965,7 @@ class GraphWidget(QGraphicsView): if self.selected_new_edge_src_node() is None: self.set_selected_new_edge_src_node(nodes[0]) else: - self.add_edge(self.selected_new_edge_src_node(), + self.add_edge(self.selected_new_edge_src_node(), nodes[0]) # Delete nodes and edges diff --git a/src/View/Pollutants/Edit/Table.py b/src/View/Pollutants/Edit/Table.py index b3d4e96d..8a740c18 100644 --- a/src/View/Pollutants/Edit/Table.py +++ b/src/View/Pollutants/Edit/Table.py @@ -33,17 +33,68 @@ from PyQt5.QtCore import ( from PyQt5.QtWidgets import ( QTableView, QAbstractItemView, QSpinBox, QItemDelegate, + QComboBox, ) from View.Pollutants.Edit.UndoCommand import ( SetDataCommand, PasteCommand, ) +from Model.Pollutants.Pollutants import POLLUTANT_TYPES + _translate = QCoreApplication.translate logger = logging.getLogger() +class ComboBoxDelegate(QItemDelegate): + def __init__(self, type_dict=None, trad=None, parent=None): + super(ComboBoxDelegate, self).__init__(parent) + + self._type_dict = type_dict if type_dict else POLLUTANT_TYPES + self._trad = trad + self.editor = None + + def createEditor(self, parent, option, index): + self.editor = QComboBox(parent) + + # Ajouter les items du dictionnaire + for key in sorted(self._type_dict.keys()): + display_text = self._type_dict[key] + self.editor.addItem(display_text, userData=key) + + self.editor.currentTextChanged.connect(self.currentItemChanged) + return self.editor + + def setEditorData(self, editor, index): + """Affiche la valeur courante""" + current_value = index.data(Qt.DisplayRole) # C'est la string + + # Trouve l'index du combobox qui correspond au texte affiché + current_index = editor.findText(current_value) + if current_index >= 0: + editor.setCurrentIndex(current_index) + + def setModelData(self, editor, model, index): + """Récupère l'index (la clé) et le stocke dans le modèle""" + # Récupère la clé (userData) du combobox + selected_index = editor.currentData() + model.setData(index, selected_index) + editor.close() + editor.deleteLater() + + def updateEditorGeometry(self, editor, option, index): + r = QRect(option.rect) + if self.editor and self.editor.windowFlags() & Qt.Popup: + if editor.parent() is not None: + r.setTopLeft(self.editor.parent().mapToGlobal(r.topLeft())) + editor.setGeometry(r) + + @pyqtSlot() + def currentItemChanged(self): + self.commitData.emit(self.sender()) + + class TableModel(PamhyrTableModel): def data(self, index, role): if role == Qt.TextAlignmentRole: @@ -58,7 +109,13 @@ class TableModel(PamhyrTableModel): if len(self._data.data) == 0 or len(self._data.data[row]) == 0: return QVariant() - return self._data.data[row][column] + value = self._data.data[row][column] + + # Si c'est la colonne "type", convertir l'indice en string + if self._headers[column] == "type": + return POLLUTANT_TYPES.get(int(value), str(value)) + + return value def setData(self, index, value, role=Qt.EditRole): if not index.isValid() or role != Qt.EditRole: diff --git a/src/View/Pollutants/Edit/Window.py b/src/View/Pollutants/Edit/Window.py index bade6cae..d0061f80 100644 --- a/src/View/Pollutants/Edit/Window.py +++ b/src/View/Pollutants/Edit/Window.py @@ -41,7 +41,7 @@ from PyQt5.QtWidgets import ( ) from View.Pollutants.Edit.Translate import EditPollutantTranslate -from View.Pollutants.Edit.Table import TableModel +from View.Pollutants.Edit.Table import TableModel, ComboBoxDelegate _translate = QCoreApplication.translate @@ -78,6 +78,11 @@ class EditPolluantWindow(PamhyrWindow): def setup_table(self): table_headers = self._trad.get_dict("table_headers") + self._delegate_type = ComboBoxDelegate( + trad=self._trad, + parent=self + ) + if self._study.is_editable(): editable_headers = self._trad.get_dict("table_headers") else: @@ -88,7 +93,7 @@ class EditPolluantWindow(PamhyrWindow): table_view=table, table_headers=table_headers, editable_headers=editable_headers, - delegates={}, + delegates={"type": self._delegate_type}, data=self._data, undo=self._undo_stack, opt_data=self._study.time_system