Skip to content

Commit

Permalink
Tabs not always stacked correctly main window (#2501)
Browse files Browse the repository at this point in the history
  • Loading branch information
samtygier-stfc authored Feb 21, 2025
2 parents dd7bcf3 + 476ea69 commit 1fcf6fc
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 50 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2472: When loading data, tabs are stacked correctly in the main view
38 changes: 10 additions & 28 deletions mantidimaging/gui/windows/main/presenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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:
"""
Expand Down Expand Up @@ -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:
Expand Down
35 changes: 13 additions & 22 deletions mantidimaging/gui/windows/main/test/presenter_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit 1fcf6fc

Please sign in to comment.