diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_presenter.py index 024f708d4a67c1c80f887cd8983f627b003e3598..94c55bf97369439c0b75c3ed75b000d031d42edc 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_presenter.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_presenter.py @@ -18,6 +18,7 @@ class FittingDataPresenter(object): self.worker = None self.row_numbers = TwoWayRowDict() # {ws_name: table_row} and {table_row: ws_name} + self.plotted = set() # List of plotted workspace names # Connect view signals to local methods self.view.set_on_load_clicked(self.on_load_clicked) @@ -40,17 +41,24 @@ class FittingDataPresenter(object): if ws_name in self.get_loaded_workspaces(): removed = self.get_loaded_workspaces().pop(ws_name) self.plot_removed_notifier.notify_subscribers(removed) + self.plotted.discard(ws_name) self._repopulate_table() def rename_workspace(self, old_name, new_name): - if old_name in self.get_loaded_workspaces(): - self.get_loaded_workspaces()[new_name] = self.get_loaded_workspaces().pop( - old_name) + loaded_workspaces = self.get_loaded_workspaces() + if old_name in loaded_workspaces: + ws = loaded_workspaces.pop(old_name) + loaded_workspaces[new_name] = ws + if old_name in self.plotted: + self.all_plots_removed_notifier.notify_subscribers() + for ws_name in self.plotted: + self.plot_added_notifier.notify_subscribers(loaded_workspaces[ws_name]) self._repopulate_table() def clear_workspaces(self): self.get_loaded_workspaces().clear() self.all_plots_removed_notifier.notify_subscribers() + self.plotted.clear() self.row_numbers.clear() self._repopulate_table() @@ -90,7 +98,8 @@ class FittingDataPresenter(object): bank = self.model.get_sample_log_from_ws(name, "bankid") if bank == 0: bank = "cropped" - self._add_row_to_table(name, i, run_no, bank) + checked = name in self.plotted + self._add_row_to_table(name, i, run_no, bank, checked) except RuntimeError: self._add_row_to_table(name, i) @@ -100,6 +109,7 @@ class FittingDataPresenter(object): ws_name = self.row_numbers.pop(row_no) removed = self.get_loaded_workspaces().pop(ws_name) self.plot_removed_notifier.notify_subscribers(removed) + self.plotted.discard(ws_name) self._repopulate_table() def _remove_all_tracked_workspaces(self): @@ -109,10 +119,13 @@ class FittingDataPresenter(object): def _handle_table_cell_changed(self, row, col): if col == 2 and row in self.row_numbers: # Is from the plot check column ws = self.model.get_loaded_workspaces()[self.row_numbers[row]] + ws_name = self.row_numbers[row] if self.view.get_table_item(row, col).checkState() == 2: # Plot Box is checked self.plot_added_notifier.notify_subscribers(ws) + self.plotted.add(ws_name) else: # Plot box is unchecked self.plot_removed_notifier.notify_subscribers(ws) + self.plotted.discard(ws_name) def _enable_load_button(self, enabled): self.view.set_load_button_enabled(enabled) @@ -138,21 +151,21 @@ class FittingDataPresenter(object): return False return True - def _add_row_to_table(self, ws_name, row, run_no=None, bank=None): + def _add_row_to_table(self, ws_name, row, run_no=None, bank=None, checked=False): words = ws_name.split("_") if run_no is not None and bank is not None: - self.view.add_table_row(run_no, bank) + self.view.add_table_row(run_no, bank, checked) self.row_numbers[ws_name] = row elif len(words) == 4 and words[2] == "bank": logger.notice("No sample logs present, determining information from workspace name.") - self.view.add_table_row(words[1], words[3]) + self.view.add_table_row(words[1], words[3], checked) self.row_numbers[ws_name] = row else: logger.warning( "The workspace '{}' was not in the correct naming format. Files should be named in the following way: " "INSTRUMENT_RUNNUMBER_bank_BANK. Using workspace name as identifier.".format(ws_name) ) - self.view.add_table_row(ws_name, "N/A") + self.view.add_table_row(ws_name, "N/A", checked) self.row_numbers[ws_name] = row def _remove_table_row(self, row_no): diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_view.py b/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_view.py index e2a384439f5e90796ad348e272473591c69ce669..d1175d153e0a366cf87b81988ac87dc1cc9a83a4 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_view.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/data_view.py @@ -50,13 +50,16 @@ class FittingDataView(QtWidgets.QWidget, Ui_data): def set_load_button_enabled(self, enabled): self.button_load.setEnabled(enabled) - def add_table_row(self, run_no, bank): + def add_table_row(self, run_no, bank, checked): row_no = self.table_selection.rowCount() self.table_selection.insertRow(row_no) self.table_selection.setItem(row_no, 0, QtWidgets.QTableWidgetItem(str(run_no))) self.table_selection.setItem(row_no, 1, QtWidgets.QTableWidgetItem(str(bank))) check_box = QtWidgets.QTableWidgetItem() - check_box.setCheckState(QtCore.Qt.Unchecked) + if checked: + check_box.setCheckState(QtCore.Qt.Checked) + else: + check_box.setCheckState(QtCore.Qt.Unchecked) self.table_selection.setItem(row_no, 2, check_box) def remove_table_row(self, row_no): diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/test/test_data_presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/test/test_data_presenter.py index 6ab9c13b0efb6b8422ab57819b048557ad7f494e..7704b3bc16b5759fe8ee5766a94297239e1f02e5 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/test/test_data_presenter.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/fitting/data_handling/test/test_data_presenter.py @@ -77,8 +77,8 @@ class FittingDataPresenterTest(unittest.TestCase): self.presenter._on_worker_success("info") self.assertEqual(1, self.view.remove_all.call_count) - self.view.add_table_row.assert_any_call("bankOrRunNumber", "bankOrRunNumber") - self.view.add_table_row.assert_any_call("bankOrRunNumber", "bankOrRunNumber") + self.view.add_table_row.assert_any_call("bankOrRunNumber", "bankOrRunNumber", False) + self.view.add_table_row.assert_any_call("bankOrRunNumber", "bankOrRunNumber", False) @patch(dir_path + ".data_presenter.logger") def test_worker_success_invalid_filename(self, mock_logger): @@ -90,7 +90,7 @@ class FittingDataPresenterTest(unittest.TestCase): self.assertEqual(1, self.view.remove_all.call_count) self.assertEqual(2, self.view.add_table_row.call_count) - self.view.add_table_row.assert_any_call("invalid", "N/A") + self.view.add_table_row.assert_any_call("invalid", "N/A", False) self.assertEqual(2, mock_logger.warning.call_count) @patch(dir_path + ".data_presenter.logger") @@ -103,8 +103,8 @@ class FittingDataPresenterTest(unittest.TestCase): self.assertEqual(1, self.view.remove_all.call_count) self.assertEqual(2, self.view.add_table_row.call_count) - self.view.add_table_row.assert_any_call("10", "2") - self.view.add_table_row.assert_any_call("20", "1") + self.view.add_table_row.assert_any_call("10", "2", False) + self.view.add_table_row.assert_any_call("20", "1", False) self.assertEqual(2, mock_logger.notice.call_count) def test_remove_workspace_tracked(self):