Skip to content

Commit

Permalink
Merge pull request #38189 from mantidproject/38101_MVP_refactor_cutvi…
Browse files Browse the repository at this point in the history
…ewer_init_view_presenter_outside

Refactor cutviewer to init view and model outside presenter
  • Loading branch information
SilkeSchomann authored Oct 21, 2024
2 parents b7e0aaf + 0d12803 commit f4dd8e7
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,25 @@
# SPDX - License - Identifier: GPL - 3.0 +
# This file is part of the mantid workbench.
#
from mantidqt.widgets.sliceviewer.cutviewer.view import CutViewerView
from mantidqt.widgets.sliceviewer.cutviewer.model import CutViewerModel
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from mantidqt.widgets.sliceviewer.cutviewer.view import CutViewerView
from mantidqt.widgets.sliceviewer.cutviewer.model import CutViewerModel
from mantidqt.widgets.sliceviewer.presenters.presenter import SliceViewer


class CutViewerPresenter:
def __init__(self, sliceviewer_presenter, canvas):
def __init__(self, sliceviewer_presenter: "SliceViewer", model: "CutViewerModel", view: "CutViewerView"):
"""
:param painter: An object responsible for drawing the representation of the cut
:param sliceinfo_provider: An object responsible for providing access to current slice information
:param parent: An optional parent widget
"""
self.view = CutViewerView(self, canvas, sliceviewer_presenter.get_frame())
self.model = CutViewerModel(sliceviewer_presenter.get_proj_matrix())
self.view = view
self.model = model
self._sliceview_presenter = sliceviewer_presenter
self.view.subscribe_presenter(self)

def show_view(self):
self.view.show()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,18 @@
from numpy import eye, c_, array, tile, array_equal

from mantidqt.widgets.sliceviewer.cutviewer.presenter import CutViewerPresenter
from mantidqt.widgets.sliceviewer.cutviewer.view import CutViewerView
from mantidqt.widgets.sliceviewer.cutviewer.model import CutViewerModel
from mantidqt.widgets.sliceviewer.presenters.presenter import SliceViewer


class TestCutViewerModel(unittest.TestCase):
@mock.patch("mantidqt.widgets.sliceviewer.cutviewer.presenter.CutViewerModel", autospec=True)
@mock.patch("mantidqt.widgets.sliceviewer.cutviewer.presenter.CutViewerView", autospec=True)
def setUp(self, mock_view, mock_model):
def setUp(self):
# load empty instrument so can create a peak table
mock_view = mock.create_autospec(CutViewerView)
mock_model = mock.create_autospec(CutViewerModel)
self.mock_sv_presenter = mock.create_autospec(SliceViewer)
self.presenter = CutViewerPresenter(self.mock_sv_presenter, canvas=mock.MagicMock())
self.presenter = CutViewerPresenter(self.mock_sv_presenter, mock_model, mock_view)

def test_on_cut_done(self):
self.presenter.on_cut_done("wsname")
Expand Down
14 changes: 11 additions & 3 deletions qt/python/mantidqt/mantidqt/widgets/sliceviewer/cutviewer/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
from mantid.simpleapi import AnalysisDataService as ADS
from mantid.kernel import SpecialCoordinateSystem
from numpy import zeros
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from mantidqt.widgets.sliceviewer.cutviewer.presenter import CutViewerPresenter # noqa: F401
from workbench.plotting.mantidfigurecanvas import MantidFigureCanvas # noqa: F401

# local imports
from .representation.cut_representation import CutRepresentation
Expand All @@ -26,14 +31,14 @@ class CutViewerView(QWidget):
to interact with the peaks.
"""

def __init__(self, presenter, canvas, frame, parent=None):
def __init__(self, canvas: "SliceViewerCanvas", frame: SpecialCoordinateSystem):
"""
:param painter: An object responsible for drawing the representation of the cut
:param sliceinfo_provider: An object responsible for providing access to current slice information
:param parent: An optional parent widget
"""
super().__init__(parent)
self.presenter = presenter
super().__init__()
self.presenter = None
self.layout = None
self.figure_layout = None
self.table = None
Expand All @@ -45,6 +50,9 @@ def __init__(self, presenter, canvas, frame, parent=None):
self._init_slice_table()
self.table.cellChanged.connect(self.on_cell_changed)

def subscribe_presenter(self, presenter: "CutViewPresenter"):
self.presenter = presenter

def hide(self):
super().hide()
if self.cut_rep is not None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from mantidqt.widgets.sliceviewer.models.sliceinfo import SliceInfo
from mantidqt.widgets.sliceviewer.models.workspaceinfo import WorkspaceInfo
from mantidqt.widgets.sliceviewer.cutviewer.presenter import CutViewerPresenter
from mantidqt.widgets.sliceviewer.cutviewer.view import CutViewerView
from mantidqt.widgets.sliceviewer.cutviewer.model import CutViewerModel
from mantidqt.widgets.sliceviewer.peaksviewer import PeaksViewerPresenter, PeaksViewerCollectionPresenter
from mantidqt.widgets.sliceviewer.presenters.base_presenter import SliceViewerBasePresenter
from mantidqt.widgets.sliceviewer.views.toolbar import ToolItemText
Expand Down Expand Up @@ -362,7 +364,9 @@ def non_axis_aligned_cut(self, state):
data_view = self._data_view
if state:
if self._cutviewer_presenter is None:
self._cutviewer_presenter = CutViewerPresenter(self, data_view.canvas)
cutviewer_view = CutViewerView(data_view.canvas, self.get_frame())
cutviewer_model = CutViewerModel(self.get_proj_matrix())
self._cutviewer_presenter = CutViewerPresenter(self, cutviewer_model, cutviewer_view)
self.view.add_widget_to_splitter(self._cutviewer_presenter.get_view())
self._cutviewer_presenter.show_view()
data_view.deactivate_tool(ToolItemText.ZOOM)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,14 +328,16 @@ def test_cut_view_button_disabled_if_model_cannot_support_it(self):

self.view.data_view.disable_tool_button.assert_has_calls([mock.call(ToolItemText.NONAXISALIGNEDCUTS)])

@mock.patch("mantidqt.widgets.sliceviewer.presenters.presenter.CutViewerPresenter")
def test_cut_view_toggled_on(self, mock_cv_pres):
@mock.patch("mantidqt.widgets.sliceviewer.presenters.presenter.CutViewerPresenter", autospec=True)
@mock.patch("mantidqt.widgets.sliceviewer.presenters.presenter.CutViewerView", autospec=True)
@mock.patch("mantidqt.widgets.sliceviewer.presenters.presenter.CutViewerModel", autospec=True)
def test_cut_view_toggled_on(self, mock_cv_model, mock_cv_view, mock_cv_pres):
presenter = SliceViewer(None, model=self.model, view=self.view)
self.view.data_view.track_cursor = mock.MagicMock()

presenter.non_axis_aligned_cut(True)

mock_cv_pres.assert_called_once_with(presenter, self.view.data_view.canvas)
self.assertTrue(presenter._cutviewer_presenter is not None)
# test correct buttons disabled
self.view.data_view.deactivate_and_disable_tool.assert_has_calls(
[mock.call(tool) for tool in (ToolItemText.REGIONSELECTION, ToolItemText.LINEPLOTS)]
Expand Down

0 comments on commit f4dd8e7

Please sign in to comment.