diff --git a/src/petab_gui/controllers/mother_controller.py b/src/petab_gui/controllers/mother_controller.py index 3f28e43..7f9ae1e 100644 --- a/src/petab_gui/controllers/mother_controller.py +++ b/src/petab_gui/controllers/mother_controller.py @@ -391,6 +391,15 @@ def setup_actions(self): actions["redo"].triggered.connect(self.undo_stack.redo) actions["redo"].setEnabled(self.undo_stack.canRedo()) self.undo_stack.canRedoChanged.connect(actions["redo"].setEnabled) + # Clear cells + actions["clear_cells"] = QAction( + qta.icon("mdi6.delete"), + "&Clear Cells", self.view + ) + actions["clear_cells"].setShortcuts( + [QKeySequence.Delete, QKeySequence.Backspace] + ) + actions["clear_cells"].triggered.connect(self.clear_cells) return actions def sync_visibility_with_actions(self): @@ -768,6 +777,11 @@ def delete_column(self): if controller: controller.delete_column() + def clear_cells(self): + controller = self.active_controller() + if controller: + controller.clear_cells() + def filter_table(self): """Filter the currently activated tables""" filter_text = self.filter_input.text() diff --git a/src/petab_gui/controllers/table_controllers.py b/src/petab_gui/controllers/table_controllers.py index 7e6e964..c3f8a27 100644 --- a/src/petab_gui/controllers/table_controllers.py +++ b/src/petab_gui/controllers/table_controllers.py @@ -13,7 +13,7 @@ ColumnSuggestionDelegate, ComboBoxDelegate, ParameterIdSuggestionDelegate from ..utils import get_selected, process_file, ConditionInputDialog from .utils import prompt_overwrite_or_append, linter_wrapper -from ..C import COLUMN +from ..C import COLUMN, INDEX import re @@ -286,6 +286,11 @@ def add_column(self, column_name: str = None): return self.model.insertColumn(column_name) + def clear_cells(self): + """Clear all selected cells""" + selected = get_selected(self.view.table_view, mode=INDEX) + self.model.clear_cells(selected) + def set_index_on_new_row(self, index: QModelIndex): """Set the index of the model when a new row is added.""" proxy_index = self.proxy_model.mapFromSource(index) diff --git a/src/petab_gui/models/pandas_table_model.py b/src/petab_gui/models/pandas_table_model.py index 76acfea..83e1de4 100644 --- a/src/petab_gui/models/pandas_table_model.py +++ b/src/petab_gui/models/pandas_table_model.py @@ -148,7 +148,9 @@ def insertColumn(self, column_name: str): return True - def setData(self, index, value, role=Qt.EditRole): + def setData( + self, index, value, role=Qt.EditRole, check_multi: bool = True + ): if not (index.isValid() and role == Qt.EditRole): return False @@ -157,8 +159,10 @@ def setData(self, index, value, role=Qt.EditRole): if is_invalid(value) or value == "": value = None - # check whether multiple rows but only one column is selected - multi_row_change, selected = self.check_selection() + multi_row_change = False + if check_multi: + # check whether multiple rows but only one column is selected + multi_row_change, selected = self.check_selection() if not multi_row_change: self.undo_stack.beginMacro("Set data") success = self._set_data_single(index, value) @@ -250,6 +254,14 @@ def _push_change_and_notify( [Qt.DisplayRole]) self.something_changed.emit(True) + def clear_cells(self, selected): + """Clear the selected cells.""" + self.undo_stack.beginMacro("Clear cells") + for index in selected: + if index.isValid(): + self.setData(index, None, Qt.EditRole, False) + self.undo_stack.endMacro() + def handle_named_index(self, index, value): """Handle the named index column.""" pass