Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring for SpectrumROI #2506

Merged
merged 7 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mantidimaging/gui/test/gui_system_liveviewer_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def test_roi_resized(self):
QTest.qWait(SHORT_DELAY)
wait_until(lambda: not np.isnan(self.live_viewer_window.presenter.model.mean).any(), max_retry=600)
old_mean = self.live_viewer_window.presenter.model.mean
roi = self.live_viewer_window.live_viewer.roi_object.roi
roi = self.live_viewer_window.live_viewer.roi_object
handle_index = 0
new_position = (10, 20)
roi.movePoint(handle_index, new_position)
Expand Down
12 changes: 4 additions & 8 deletions mantidimaging/gui/windows/live_viewer/live_view_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from PyQt5.QtCore import pyqtSignal
from pyqtgraph import GraphicsLayoutWidget, mkPen

from mantidimaging.core.utility.close_enough_point import CloseEnoughPoint
from mantidimaging.core.utility.sensible_roi import SensibleROI
from mantidimaging.gui.widgets.mi_mini_image_view.view import MIMiniImageView
from mantidimaging.gui.widgets.zslider.zslider import ZSlider
Expand Down Expand Up @@ -65,17 +64,14 @@ def add_roi(self) -> None:
self.roi_object = SpectrumROI('roi', roi, rotatable=False, scaleSnap=True, translateSnap=True)
self.roi_object.colour = (255, 194, 10, 255)
self.roi_object.hoverPen = mkPen(self.roi_object.colour, width=3)
self.roi_object.roi.sigRegionChangeFinished.connect(self.roi_changed.emit)
self.roi_object.roi.sigRegionChanged.connect(self.roi_changing.emit)
self.image.vb.addItem(self.roi_object.roi)
self.roi_object.sigRegionChangeFinished.connect(self.roi_changed.emit)
self.roi_object.sigRegionChanged.connect(self.roi_changing.emit)
self.image.vb.addItem(self.roi_object)

def get_roi(self) -> SensibleROI | None:
if not self.roi_object:
return None
roi = self.roi_object.roi
pos = CloseEnoughPoint(roi.pos())
size = CloseEnoughPoint(roi.size())
return SensibleROI.from_points(pos, size)
return self.roi_object.as_sensible_roi()

def set_roi_visibility_flags(self, visible: bool) -> None:
if not self.roi_object:
Expand Down
2 changes: 1 addition & 1 deletion mantidimaging/gui/windows/live_viewer/presenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ def update_intensity_with_mean(self) -> None:

def set_roi_enabled(self, enable: bool):
if self.view.live_viewer.roi_object is not None:
self.view.live_viewer.roi_object.roi.blockSignals(not enable)
self.view.live_viewer.roi_object.blockSignals(not enable)

def try_next_mean_chunk(self) -> None:
if np.isnan(self.model.mean).any():
Expand Down
2 changes: 1 addition & 1 deletion mantidimaging/gui/windows/spectrum_viewer/presenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ def do_add_roi(self) -> None:
self.view.auto_range_image()
self.do_add_roi_to_table(roi_name)

def change_roi_colour(self, roi_name: str, new_colour: tuple[int, int, int]) -> None:
def change_roi_colour(self, roi_name: str, new_colour: tuple[int, int, int, int]) -> None:
"""
Change the colour of a given ROI in both the spectrum widget and the table.

Expand Down
41 changes: 7 additions & 34 deletions mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,14 @@ def __init__(self, name: str, sensible_roi: SensibleROI, *args, **kwargs) -> Non
kwargs["pos"] = sensible_roi.left, sensible_roi.top
kwargs["size"] = sensible_roi.width, sensible_roi.height
super().__init__(*args, **kwargs)
self._name = name
self.name = name
self._colour = (0, 0, 0, 255)
self.maxBounds = self.parentBounds()
self.addScaleHandle([1, 1], [0, 0])
self.addScaleHandle([1, 0], [0, 1])
self.addScaleHandle([0, 0], [1, 1])
self.addScaleHandle([0, 1], [1, 0])
self._selected_row = None
self.roi.setAcceptedMouseButtons(Qt.MouseButton.LeftButton)
self.setAcceptedMouseButtons(Qt.MouseButton.LeftButton)

self.menu = QMenu()
self.change_color_action = QAction("Change ROI Colour", self)
Expand All @@ -54,33 +53,17 @@ def __init__(self, name: str, sensible_roi: SensibleROI, *args, **kwargs) -> Non
def onChangeColor(self) -> None:
current_color = QColor(*self._colour)
selected_color = self.openColorDialog(current_color)
color_valid = self.check_color_valid(selected_color)
if color_valid:
if selected_color.isValid():
new_color = (selected_color.red(), selected_color.green(), selected_color.blue(), 255)
self._colour = new_color
self.sig_colour_change.emit(self._name, new_color)
self.sig_colour_change.emit(self.name, new_color)

def openColorDialog(self, current_color: QColor) -> QColor:
return QColorDialog.getColor(current_color)

def check_color_valid(self, get_colour: QColor) -> bool:
return get_colour.isValid()

def contextMenuEnabled(self) -> bool:
return True

@property
def name(self) -> str:
return self._name

@name.setter
def name(self, name: str) -> None:
self._name = name

@property
def roi(self) -> ROI:
return self

@property
def colour(self) -> tuple[int, int, int, int]:
return self._colour
Expand All @@ -99,17 +82,10 @@ def set_visibility(self, visible: bool) -> None:
for handle in self.getHandles():
handle.setVisible(visible)

@property
def selected_row(self) -> int | None:
return self._selected_row

def adjust_spec_roi(self, roi: SensibleROI) -> None:
self.setPos((roi.left, roi.top))
self.setSize((roi.width, roi.height))

def rename_roi(self, new_name: str) -> None:
self._name = new_name

def as_sensible_roi(self) -> SensibleROI:
"""
Converts the SpectrumROI to a SensibleROI object.
Expand All @@ -133,7 +109,6 @@ class SpectrumWidget(QWidget):
spectrum: PlotItem

range_control: LinearRegionItem
roi_dict: dict[str, ROI]
last_clicked_roi: str

range_changed = pyqtSignal(object)
Expand Down Expand Up @@ -162,7 +137,7 @@ def __init__(self, main_window: MainWindowView) -> None:

self.spectrum_data_dict: dict[str, np.ndarray | None] = {}

self.roi_dict: dict[str, ROI] = {}
self.roi_dict: dict[str, SpectrumROI] = {}
self.colour_index = 0

def cleanup(self) -> None:
Expand Down Expand Up @@ -234,9 +209,7 @@ def get_roi(self, roi_name: str) -> SensibleROI:
@return: The ROI with the given name.
"""
if roi_name in self.roi_dict.keys():
pos = CloseEnoughPoint(self.roi_dict[roi_name].pos())
size = CloseEnoughPoint(self.roi_dict[roi_name].size())
return SensibleROI.from_points(pos, size)
return self.roi_dict[roi_name].as_sensible_roi()
elif roi_name == "all":
pos = CloseEnoughPoint((0, 0))
size = CloseEnoughPoint(self.max_roi_size)
Expand Down Expand Up @@ -275,7 +248,7 @@ def rename_roi(self, old_name: str, new_name: str) -> None:

self.roi_dict[new_name] = self.roi_dict.pop(old_name)
self.spectrum_data_dict[new_name] = self.spectrum_data_dict.pop(old_name)
self.roi_dict[new_name].rename_roi(new_name)
self.roi_dict[new_name].name = new_name

def _emit_roi_changed(self):
sender_roi = self.sender()
Expand Down
6 changes: 3 additions & 3 deletions mantidimaging/gui/windows/spectrum_viewer/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,15 +174,15 @@ def set_old_table_names(self, old_table_names) -> None:
if 'rits_roi' in self.old_table_names:
self.old_table_names.remove('rits_roi')

def update_roi_color(self, roi_name: str, new_color: tuple[int, int, int]) -> None:
def update_roi_color(self, roi_name: str, new_color: tuple[int, int, int, int]) -> None:
"""
Finds ROI by name in table and updates it's colour (R, G, B) format.
"""
row = self.find_row_for_roi(roi_name)
if row is not None:
self._roi_table_model.update_color(row, new_color)

def add_row(self, name: str, colour: tuple[int, int, int], roi_names: list[str]) -> None:
def add_row(self, name: str, colour: tuple[int, int, int, int], roi_names: list[str]) -> None:
"""
Add a new row to the ROI table
"""
Expand Down Expand Up @@ -560,7 +560,7 @@ def show_visible_spectrums(self) -> None:
name=key,
pen=self.spectrum_widget.roi_dict[key].colour)

def add_roi_table_row(self, name: str, colour: tuple[int, int, int]) -> None:
def add_roi_table_row(self, name: str, colour: tuple[int, int, int, int]) -> None:
"""
Add a new row to the ROI table

Expand Down
Loading