From 476ea691fd2a0803a51476f8c830f88482136309 Mon Sep 17 00:00:00 2001 From: ashmeigh Date: Tue, 18 Feb 2025 15:32:18 +0000 Subject: [PATCH] Fix tab stacking issue when loading datasets --- .../fix-2472-abs-not-always-stacked-correctly | 1 + mantidimaging/gui/windows/main/presenter.py | 38 +++++-------------- .../gui/windows/main/test/presenter_test.py | 35 +++++++---------- 3 files changed, 24 insertions(+), 50 deletions(-) create mode 100644 docs/release_notes/next/fix-2472-abs-not-always-stacked-correctly diff --git a/docs/release_notes/next/fix-2472-abs-not-always-stacked-correctly b/docs/release_notes/next/fix-2472-abs-not-always-stacked-correctly new file mode 100644 index 00000000000..6ffa3968a26 --- /dev/null +++ b/docs/release_notes/next/fix-2472-abs-not-always-stacked-correctly @@ -0,0 +1 @@ +2472: When loading data, tabs are stacked correctly in the main view \ No newline at end of file diff --git a/mantidimaging/gui/windows/main/presenter.py b/mantidimaging/gui/windows/main/presenter.py index 1a9315b054f..6a5af4fc5ba 100644 --- a/mantidimaging/gui/windows/main/presenter.py +++ b/mantidimaging/gui/windows/main/presenter.py @@ -198,15 +198,14 @@ def _add_dataset_to_view(self, dataset: Dataset) -> None: if dataset.sample: self.add_alternative_180_if_required(dataset) - def _create_and_tabify_stack_window(self, images: ImageStack, sample_dock: StackVisualiserView) -> None: + def _create_and_tabify_stack_window(self, images: ImageStack) -> None: """ Creates a new stack window with a given ImageStack object then makes sure it is placed on top of a sample/original stack window. :param images: The ImageStack object for the new stack window. - :param sample_dock: The existing stack window that the new one should be placed on top of. """ stack_visualiser = self._create_lone_stack_window(images) - self._tabify_stack_window(stack_visualiser, sample_dock) + self._tabify_stack_window(stack_visualiser) def get_active_stack_visualisers(self) -> list[StackVisualiserView]: return list(self.active_stacks.values()) @@ -233,19 +232,11 @@ def add_alternative_180_if_required(self, dataset: Dataset) -> None: proj180deg = ImageStack(_180_arr, name=f"{dataset.name}_180") self.add_images_to_existing_dataset(dataset.id, proj180deg, "proj_180") - def create_dataset_stack_visualisers(self, dataset: Dataset) -> StackVisualiserView: - """ - Creates the StackVisualiserView widgets for a new dataset. - """ - stacks = dataset.all - first_stack_vis = self._create_lone_stack_window(stacks[0]) - self._tabify_stack_window(first_stack_vis) - - for stack in stacks[1:]: - self._create_and_tabify_stack_window(stack, first_stack_vis) - + def create_dataset_stack_visualisers(self, dataset: Dataset) -> None: + """Creates StackVisualiserView widgets for a new dataset and tabifies them.""" + for stack in dataset.all: + self._create_and_tabify_stack_window(stack) self._focus_on_newest_stack_tab() - return first_stack_vis def _focus_on_newest_stack_tab(self) -> None: """ @@ -283,21 +274,12 @@ def _create_lone_stack_window(self, images: ImageStack) -> StackVisualiserView: self.stack_visualisers[stack_vis.id] = stack_vis return stack_vis - def _tabify_stack_window(self, - stack_window: StackVisualiserView, - tabify_stack: StackVisualiserView | None = None) -> None: + def _tabify_stack_window(self, stack_window: StackVisualiserView) -> None: """ Places the newly created stack window into a tab. - :param stack_window: The new stack window. - :param tabify_stack: The optional existing stack tab that needs to be - """ - current_stack_visualisers = self.get_active_stack_visualisers() - if tabify_stack is None and len(current_stack_visualisers) > 0: - for stack in current_stack_visualisers: - if stack_window is not stack: - self.view.tabifyDockWidget(stack, stack_window) - return - if tabify_stack is not None: + """ + tabify_stack = next(iter(self.stack_visualisers.values()), None) + if tabify_stack and stack_window is not tabify_stack: self.view.tabifyDockWidget(tabify_stack, stack_window) def _on_tab_clicked(self, stack: StackVisualiserView) -> None: diff --git a/mantidimaging/gui/windows/main/test/presenter_test.py b/mantidimaging/gui/windows/main/test/presenter_test.py index 0d45cd5656b..353d44b15ce 100644 --- a/mantidimaging/gui/windows/main/test/presenter_test.py +++ b/mantidimaging/gui/windows/main/test/presenter_test.py @@ -93,37 +93,28 @@ def test_load_stack(self, start_async_mock: mock.Mock): start_async_mock.assert_called_once_with(self.view, self.presenter.model.load_image_stack_to_new_dataset, self.presenter._on_dataset_load_done, {'file_path': file_path}) - def test_add_stack(self): + def test_add_second_stack(self): images = generate_images() dock_mock = mock.Mock() - sample_dock_mock = mock.Mock() stack_visualiser_mock = mock.Mock() - dock_mock.widget.return_value = stack_visualiser_mock self.view.create_stack_window.return_value = dock_mock - - self.presenter._create_and_tabify_stack_window(images, sample_dock_mock) + self.presenter._create_and_tabify_stack_window(images) self.assertEqual(1, len(self.presenter.stack_visualiser_list)) - self.view.tabifyDockWidget.assert_called_once_with(sample_dock_mock, dock_mock) + self.view.tabifyDockWidget.assert_not_called() def test_add_multiple_stacks(self): - images = generate_images() - images2 = generate_images() - dock_mock = mock.Mock() - sample_dock_mock = mock.Mock() - stack_visualiser_mock = mock.Mock() + images, images2 = generate_images(), generate_images() + dock_mock1, dock_mock2 = mock.Mock(), mock.Mock() self.presenter.model = mock.Mock() - dock_mock.widget.return_value = stack_visualiser_mock - self.view.create_stack_window.return_value = dock_mock - - self.presenter._create_and_tabify_stack_window(images, sample_dock_mock) - self.presenter._create_and_tabify_stack_window(images2, sample_dock_mock) + self.view.create_stack_window.side_effect = [dock_mock1, dock_mock2] + self.presenter._create_and_tabify_stack_window(images) + self.presenter._create_and_tabify_stack_window(images2) self.assertEqual(2, self.view.create_stack_window.call_count) - self.view.tabifyDockWidget.assert_called_with(sample_dock_mock, dock_mock) - self.assertEqual(2, self.view.tabifyDockWidget.call_count) + self.view.tabifyDockWidget.assert_called_once_with(dock_mock1, dock_mock2) def test_create_new_stack_images(self): self.view.model_changed.emit = mock.Mock() @@ -451,14 +442,14 @@ def test_create_mixed_dataset_stack_windows(self): def test_tabify_stack_window_to_sample_stack(self): new_stack = mock.Mock() sample_stack = mock.Mock() - self.presenter.stack_visualisers = {"new-id": new_stack, "sample-id": sample_stack} - self.presenter._tabify_stack_window(new_stack, sample_stack) - self.view.tabifyDockWidget.assert_called_once_with(sample_stack, new_stack) + self.presenter.stack_visualisers = {"sample-id": sample_stack, "new-id": new_stack} + self.presenter._tabify_stack_window(new_stack) + self.view.tabifyDockWidget.assert_called() def test_tabify_stack_window_to_item_in_list(self): new_stack = mock.Mock() other_stack = mock.Mock() - self.presenter.stack_visualisers = {"new-id": new_stack, "other-id": other_stack} + self.presenter.stack_visualisers = {"other-id": other_stack, "new-id": new_stack} self.presenter._tabify_stack_window(new_stack) self.view.tabifyDockWidget.assert_called_once_with(other_stack, new_stack)