diff --git a/src/View/SolverParameters/Table.py b/src/View/SolverParameters/Table.py index 67034ceb..a38eeb1f 100644 --- a/src/View/SolverParameters/Table.py +++ b/src/View/SolverParameters/Table.py @@ -45,6 +45,36 @@ logger = logging.getLogger() _translate = QCoreApplication.translate +class ValueDelegate(QItemDelegate): + """Use a combo box for solver parameters backed by an index.""" + + def createEditor(self, parent, option, index): + choices = index.model().value_choices(index) + if choices is None: + return QLineEdit(parent) + + editor = QComboBox(parent) + for value, label in choices.items(): + editor.addItem(label, value) + return editor + + def setEditorData(self, editor, index): + if isinstance(editor, QComboBox): + current = index.model().raw_value(index) + editor.setCurrentIndex(editor.findData(current)) + else: + editor.setText(str(index.model().raw_value(index))) + + def setModelData(self, editor, model, index): + if isinstance(editor, QComboBox): + model.setData(index, editor.currentData()) + else: + model.setData(index, editor.text()) + + def updateEditorGeometry(self, editor, option, index): + editor.setGeometry(option.rect) + + class TableModel(PamhyrTableModel): def _setup_lst(self): self._tab = self._opt_data @@ -68,6 +98,10 @@ class TableModel(PamhyrTableModel): elif cname == "value": value = self._lst.get(row)[cname] + choices = self.value_choices(index) + if choices is not None: + return choices.get(value, value) + if value in self._trad.get_dict("yes_no"): value = self._trad.get_dict("yes_no")[value] @@ -79,7 +113,14 @@ class TableModel(PamhyrTableModel): if not index.isValid() or role != Qt.EditRole: return False - if self.is_same_data(index, value): + choices = self.value_choices(index) + if choices is not None: + reverse_choices = {label: key for key, label in choices.items()} + value = reverse_choices.get(value, value) + if str(self.raw_value(index)) == str(value): + return False + + elif self.is_same_data(index, value): return False row = index.row() @@ -103,6 +144,15 @@ class TableModel(PamhyrTableModel): self.dataChanged.emit(index, index) return True + def value_choices(self, index): + if not index.isValid(): + return None + name = self._lst.get(index.row())["name"] + return self._trad.get_dict("indexed_values").get(name) + + def raw_value(self, index): + return self._lst.get(index.row())["value"] + def undo(self): self._undo.undo() self.layoutChanged.emit() diff --git a/src/View/SolverParameters/Window.py b/src/View/SolverParameters/Window.py index fcef53b0..408d9d89 100644 --- a/src/View/SolverParameters/Window.py +++ b/src/View/SolverParameters/Window.py @@ -41,7 +41,7 @@ from PyQt5.QtWidgets import ( ) from View.SolverParameters.UndoCommand import * -from View.SolverParameters.Table import TableModel +from View.SolverParameters.Table import TableModel, ValueDelegate from View.SolverParameters.translate import ParamTranslate from Solver.Solvers import solver_long_name, solver_type_list @@ -103,6 +103,7 @@ class SolverParametersWindow(PamhyrWindow): opt_data=st, table_headers=self._trad.get_dict("table_headers"), editable_headers=editable_headers, + delegates={"value": ValueDelegate(table)}, trad=self._trad, undo=self._undo_stack[st], ) diff --git a/src/View/SolverParameters/translate.py b/src/View/SolverParameters/translate.py index 05e141f1..a831d004 100644 --- a/src/View/SolverParameters/translate.py +++ b/src/View/SolverParameters/translate.py @@ -50,6 +50,30 @@ class ParamTranslate(MainTranslate): _translate("SolverParameters", "N"): "n", } + self._sub_dict["indexed_values"] = { + "mage_shields_critique": { + "1": _translate("SolverParameters", "Constant (0.047)"), + "2": _translate("SolverParameters", "Soulsby (1997)"), + "3": _translate("SolverParameters", "Camenen (2012)"), + }, + "mage_shields_correction": { + "0": _translate("SolverParameters", "No correction"), + "1": _translate("SolverParameters", "Effective Shields"), + }, + "mage_capacite_solide": { + "1": _translate( + "SolverParameters", "Meyer-Peter & Muller (1948)" + ), + "2": _translate( + "SolverParameters", "Camenen & Larson (2005)" + ), + "3": _translate( + "SolverParameters", "Engelund & Hansen (1967)" + ), + "4": _translate("SolverParameters", "Recking (2013)"), + }, + } + self._sub_dict["names"] = { "all_init_time": _translate("SolverParameters",