From 5bf363ab3a2a9ce54c08567e1e47ab608deba4c3 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Thu, 1 Feb 2024 17:06:26 +0000 Subject: [PATCH 01/19] properties table and nearly functioning --- mantidimaging/gui/ui/spectrum_viewer.ui | 26 ++++---- .../gui/windows/spectrum_viewer/view.py | 61 ++++++++++++++++++- 2 files changed, 73 insertions(+), 14 deletions(-) diff --git a/mantidimaging/gui/ui/spectrum_viewer.ui b/mantidimaging/gui/ui/spectrum_viewer.ui index b00fe2be2cc..b2c7eae08a8 100644 --- a/mantidimaging/gui/ui/spectrum_viewer.ui +++ b/mantidimaging/gui/ui/spectrum_viewer.ui @@ -351,20 +351,22 @@ - - - Qt::Vertical + + + + 0 + 0 + - - QSizePolicy::MinimumExpanding + + ROI Properties - - - 20 - 20 - - - + + + + + + diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 829a7d30135..b63b457cf8e 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -6,7 +6,7 @@ from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QCheckBox, QVBoxLayout, QFileDialog, QPushButton, QLabel, QAbstractItemView, QHeaderView, \ - QTabWidget, QComboBox, QSpinBox + QTabWidget, QComboBox, QSpinBox, QTableWidget, QTableWidgetItem from mantidimaging.core.utility import finder from mantidimaging.gui.mvp_base import BaseMainWindowView @@ -14,10 +14,12 @@ from .model import ROI_RITS from .presenter import SpectrumViewerWindowPresenter, ExportMode from mantidimaging.gui.widgets import RemovableRowTableView -from .spectrum_widget import SpectrumWidget +from .spectrum_widget import SpectrumWidget, SpectrumROI from mantidimaging.gui.windows.spectrum_viewer.roi_table_model import TableModel +from mantidimaging.core.utility.sensible_roi import SensibleROI import numpy as np +from random import randint if TYPE_CHECKING: from mantidimaging.gui.windows.main import MainWindowView # noqa:F401 # pragma: no cover @@ -41,6 +43,8 @@ class SpectrumViewerWindowView(BaseMainWindowView): bin_size_spinBox: QSpinBox bin_step_spinBox: QSpinBox + roiPropertiesTableWidget: QTableWidget + def __init__(self, main_window: 'MainWindowView'): super().__init__(None, 'gui/ui/spectrum_viewer.ui') @@ -92,7 +96,32 @@ def __init__(self, main_window: 'MainWindowView'): self.tableView.setSelectionMode(QAbstractItemView.SingleSelection) self.tableView.setAlternatingRowColors(True) + # Roi Prop table + self.roiPropertiesTableWidget.setColumnCount(2) + self.roiPropertiesTableWidget.setRowCount(4) + self.roi_table_properties = ["Top", "Bottom", "Left", "Right"] + self.roiPropertiesSpinBoxes = {} + + for row in range(self.roiPropertiesTableWidget.rowCount()): + spin_box = QSpinBox() + if self.roi_table_properties[row] == "Top" or self.roi_table_properties[row] == "Bottom": + spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) + if self.roi_table_properties[row] == "Left" or self.roi_table_properties[row] == "Right": + spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) + spin_box.valueChanged.connect(self.adjust_roi) + self.roiPropertiesTableWidget.setCellWidget(row, 1, spin_box) + self.roiPropertiesTableWidget.setItem(row, 0, QTableWidgetItem(self.roi_table_properties[row])) + self.roiPropertiesSpinBoxes[self.roi_table_properties[row]] = spin_box + + self.roiPropertiesTableWidget.horizontalHeader().hide() + self.roiPropertiesTableWidget.verticalHeader().hide() + self.roiPropertiesTableWidget.setShowGrid(False) + + self.spectrum.roi_changed.connect(self.set_roi_properties) + _ = self.roi_table_model # Initialise model + self.current_roi = self.roi_table_model.roi_names()[0] + print(f"{self.current_roi=}") def on_row_change(item, _) -> None: """ @@ -104,6 +133,9 @@ def on_row_change(item, _) -> None: selected_row_data = self.roi_table_model.row_data(item.row()) self.selected_row = item.row() self.current_roi = selected_row_data[0] + self.set_roi_properties() + + self.tableView.selectionModel().currentRowChanged.connect(on_row_change) @@ -334,3 +366,28 @@ def set_binning_visibility(self) -> None: self.bin_size_spinBox.setHidden(hide_binning) self.bin_step_label.setHidden(hide_binning) self.bin_step_spinBox.setHidden(hide_binning) + + def set_roi_properties(self) -> None: + current_roi = self.presenter.model.get_roi(self.current_roi) + roi_iter_order = ["Left", "Top", "Right", "Bottom"] + row = 0 + for pos in current_roi.__iter__(): + self.roiPropertiesSpinBoxes[roi_iter_order[row]].setValue(pos) + row = row + 1 + + def adjust_roi(self) -> None: + roi_iter_order = ["Left", "Top", "Right", "Bottom"] + new_points = [self.roiPropertiesSpinBoxes[prop].value() for prop in roi_iter_order] + print(f"{new_points=}") + new_roi = SensibleROI().from_list(new_points) + print(f"{new_roi.__str__()=}") + print(f"{self.current_roi=}") + self.presenter.model.set_roi(self.current_roi, new_roi) + print(self.presenter.model.get_roi(self.current_roi).__str__()) + new_spectrum_roi_origin = (new_points[0], new_points[-1]) + new_spectrum_roi = SpectrumROI(self.current_roi, new_roi, pos=new_spectrum_roi_origin, rotatable=False, + scaleSnap=True, translateSnap=True) + + # need to make a function like add_roi in spectrum_widget which will change the roi in roi_dict + #self.spectrum.roi_dict[self.current_roi] = new_spectrum_roi + From f6322b1e3c2ffbfe7dd8f4c6fe812f4980c8a32f Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Fri, 2 Feb 2024 17:23:43 +0000 Subject: [PATCH 02/19] Fully functioning --- mantidimaging/gui/ui/spectrum_viewer.ui | 6 +-- .../spectrum_viewer/spectrum_widget.py | 15 ++++++ .../gui/windows/spectrum_viewer/view.py | 46 +++++++++++++------ 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/mantidimaging/gui/ui/spectrum_viewer.ui b/mantidimaging/gui/ui/spectrum_viewer.ui index b2c7eae08a8..c475e797aae 100644 --- a/mantidimaging/gui/ui/spectrum_viewer.ui +++ b/mantidimaging/gui/ui/spectrum_viewer.ui @@ -6,8 +6,8 @@ 0 0 - 921 - 739 + 913 + 710 @@ -351,7 +351,7 @@ - + 0 diff --git a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py index ab94108f895..4de6dbe51fb 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py +++ b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py @@ -63,6 +63,11 @@ def colour(self, colour: tuple[int, int, int, int]) -> None: def selected_row(self) -> Optional[int]: return self._selected_row + def adjust_spec_roi(self, roi: SensibleROI) -> None: + self.setPos((roi.left, roi.top)) + self.setSize((roi.width, roi.height)) + + class SpectrumWidget(GraphicsLayoutWidget): """ @@ -183,6 +188,16 @@ def add_roi(self, roi: SensibleROI, name: str) -> None: self.image.vb.addItem(self.roi_dict[name]) self.roi_dict[name].hoverPen = mkPen(self.roi_dict[name].colour, width=3) + def adjust_roi(self, new_roi: SensibleROI, roi_name: str): + """ + Adjust the existing ROI with the given name. + @param spec_roi: The new SpectrumROI to replace the existing SpectrumROI + @param roi_name: The name of the existing ROI. + """ + self.roi_dict[roi_name].adjust_spec_roi(new_roi) + + + def get_roi(self, roi_name: str) -> SensibleROI: """ Get the ROI with the given name. If no name is given, the default ROI is returned. diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index b63b457cf8e..e19d7397aac 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -6,7 +6,8 @@ from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QCheckBox, QVBoxLayout, QFileDialog, QPushButton, QLabel, QAbstractItemView, QHeaderView, \ - QTabWidget, QComboBox, QSpinBox, QTableWidget, QTableWidgetItem + QTabWidget, QComboBox, QSpinBox, QTableWidget, QTableWidgetItem, QGroupBox +from PyQt5.QtCore import QSignalBlocker, Qt from mantidimaging.core.utility import finder from mantidimaging.gui.mvp_base import BaseMainWindowView @@ -44,6 +45,7 @@ class SpectrumViewerWindowView(BaseMainWindowView): bin_step_spinBox: QSpinBox roiPropertiesTableWidget: QTableWidget + roiPropertiesGroupBox: QGroupBox def __init__(self, main_window: 'MainWindowView'): super().__init__(None, 'gui/ui/spectrum_viewer.ui') @@ -97,6 +99,7 @@ def __init__(self, main_window: 'MainWindowView'): self.tableView.setAlternatingRowColors(True) # Roi Prop table + self.roiPropertiesGroupBoxTitle: str = "Roi Properties: " self.roiPropertiesTableWidget.setColumnCount(2) self.roiPropertiesTableWidget.setRowCount(4) self.roi_table_properties = ["Top", "Bottom", "Left", "Right"] @@ -110,7 +113,9 @@ def __init__(self, main_window: 'MainWindowView'): spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) spin_box.valueChanged.connect(self.adjust_roi) self.roiPropertiesTableWidget.setCellWidget(row, 1, spin_box) - self.roiPropertiesTableWidget.setItem(row, 0, QTableWidgetItem(self.roi_table_properties[row])) + table_widget = QTableWidgetItem(self.roi_table_properties[row]) + table_widget.setFlags(Qt.ItemIsSelectable) + self.roiPropertiesTableWidget.setItem(row, 0, table_widget) self.roiPropertiesSpinBoxes[self.roi_table_properties[row]] = spin_box self.roiPropertiesTableWidget.horizontalHeader().hide() @@ -121,7 +126,9 @@ def __init__(self, main_window: 'MainWindowView'): _ = self.roi_table_model # Initialise model self.current_roi = self.roi_table_model.roi_names()[0] - print(f"{self.current_roi=}") + self.set_roi_properties() + + print(f"{self.presenter.export_mode=}") def on_row_change(item, _) -> None: """ @@ -182,6 +189,8 @@ def on_visibility_change(self) -> None: When the visibility of an ROI is changed, update the visibility of the ROI in the spectrum widget """ if self.presenter.export_mode == ExportMode.ROI_MODE: + self.current_roi = self.roi_table_model.row_data(self.selected_row)[0] + self.set_roi_properties() for roi_name, _, roi_visible in self.roi_table_model: if roi_visible is False: self.set_roi_alpha(0, roi_name) @@ -195,6 +204,8 @@ def on_visibility_change(self) -> None: if self.presenter.export_mode == ExportMode.IMAGE_MODE: self.set_roi_alpha(255, ROI_RITS) self.presenter.redraw_spectrum(ROI_RITS) + self.current_roi = ROI_RITS + self.set_roi_properties() else: self.set_roi_alpha(0, ROI_RITS) @@ -369,25 +380,32 @@ def set_binning_visibility(self) -> None: def set_roi_properties(self) -> None: current_roi = self.presenter.model.get_roi(self.current_roi) + self.roiPropertiesGroupBox.setTitle(self.roiPropertiesGroupBoxTitle + self.current_roi) roi_iter_order = ["Left", "Top", "Right", "Bottom"] row = 0 for pos in current_roi.__iter__(): - self.roiPropertiesSpinBoxes[roi_iter_order[row]].setValue(pos) + with QSignalBlocker(self.roiPropertiesSpinBoxes[roi_iter_order[row]]): + self.roiPropertiesSpinBoxes[roi_iter_order[row]].setValue(pos) row = row + 1 + self.set_roi_spinbox_ranges() + self.presenter.redraw_spectrum(self.current_roi) def adjust_roi(self) -> None: roi_iter_order = ["Left", "Top", "Right", "Bottom"] new_points = [self.roiPropertiesSpinBoxes[prop].value() for prop in roi_iter_order] - print(f"{new_points=}") new_roi = SensibleROI().from_list(new_points) - print(f"{new_roi.__str__()=}") - print(f"{self.current_roi=}") self.presenter.model.set_roi(self.current_roi, new_roi) - print(self.presenter.model.get_roi(self.current_roi).__str__()) - new_spectrum_roi_origin = (new_points[0], new_points[-1]) - new_spectrum_roi = SpectrumROI(self.current_roi, new_roi, pos=new_spectrum_roi_origin, rotatable=False, - scaleSnap=True, translateSnap=True) - - # need to make a function like add_roi in spectrum_widget which will change the roi in roi_dict - #self.spectrum.roi_dict[self.current_roi] = new_spectrum_roi + self.spectrum.adjust_roi(new_roi, self.current_roi) + + def set_roi_spinbox_ranges(self): + spin_boxes = self.roiPropertiesSpinBoxes + for key, value in spin_boxes.items(): + if key == "Left": + value.setMaximum(spin_boxes["Right"].value() - 1) + elif key == "Right": + value.setMinimum(spin_boxes["Left"].value() + 1) + elif key == "Top": + value.setMaximum(spin_boxes["Bottom"].value() - 1) + elif key == "Bottom": + value.setMinimum(spin_boxes["Top"].value() + 1) From 2680baf4e8fb1f7a49bab3bf936f08157a4ac782 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Mon, 5 Feb 2024 16:18:32 +0000 Subject: [PATCH 03/19] added width, height, area --- .../spectrum_viewer/spectrum_widget.py | 3 -- .../gui/windows/spectrum_viewer/view.py | 51 ++++++++++++------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py index 4de6dbe51fb..bc66b910329 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py +++ b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py @@ -68,7 +68,6 @@ def adjust_spec_roi(self, roi: SensibleROI) -> None: self.setSize((roi.width, roi.height)) - class SpectrumWidget(GraphicsLayoutWidget): """ The widget containing the spectrum plot and the image projection. @@ -196,8 +195,6 @@ def adjust_roi(self, new_roi: SensibleROI, roi_name: str): """ self.roi_dict[roi_name].adjust_spec_roi(new_roi) - - def get_roi(self, roi_name: str) -> SensibleROI: """ Get the ROI with the given name. If no name is given, the default ROI is returned. diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index e19d7397aac..bf82b61f1b6 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -15,12 +15,11 @@ from .model import ROI_RITS from .presenter import SpectrumViewerWindowPresenter, ExportMode from mantidimaging.gui.widgets import RemovableRowTableView -from .spectrum_widget import SpectrumWidget, SpectrumROI +from .spectrum_widget import SpectrumWidget from mantidimaging.gui.windows.spectrum_viewer.roi_table_model import TableModel from mantidimaging.core.utility.sensible_roi import SensibleROI import numpy as np -from random import randint if TYPE_CHECKING: from mantidimaging.gui.windows.main import MainWindowView # noqa:F401 # pragma: no cover @@ -100,23 +99,34 @@ def __init__(self, main_window: 'MainWindowView'): # Roi Prop table self.roiPropertiesGroupBoxTitle: str = "Roi Properties: " - self.roiPropertiesTableWidget.setColumnCount(2) - self.roiPropertiesTableWidget.setRowCount(4) self.roi_table_properties = ["Top", "Bottom", "Left", "Right"] - self.roiPropertiesSpinBoxes = {} + self.roi_table_properties_secondary = ["Width", "Height", "Area"] + self.roi_table_properties_all = self.roi_table_properties + self.roi_table_properties_secondary + self.roiPropertiesTableWidget.setColumnCount(2) + self.roiPropertiesTableWidget.setRowCount(len(self.roi_table_properties_all)) - for row in range(self.roiPropertiesTableWidget.rowCount()): - spin_box = QSpinBox() - if self.roi_table_properties[row] == "Top" or self.roi_table_properties[row] == "Bottom": - spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) - if self.roi_table_properties[row] == "Left" or self.roi_table_properties[row] == "Right": - spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) - spin_box.valueChanged.connect(self.adjust_roi) - self.roiPropertiesTableWidget.setCellWidget(row, 1, spin_box) - table_widget = QTableWidgetItem(self.roi_table_properties[row]) + self.roiPropertiesSpinBoxes = {} + self.roiPropertiesLabels = {} + row_ind = 0 + for prop in self.roi_table_properties_all: + print(f"{row_ind=}") + table_widget = QTableWidgetItem(prop) table_widget.setFlags(Qt.ItemIsSelectable) - self.roiPropertiesTableWidget.setItem(row, 0, table_widget) - self.roiPropertiesSpinBoxes[self.roi_table_properties[row]] = spin_box + self.roiPropertiesTableWidget.setItem(row_ind, 0, table_widget) + if prop in self.roi_table_properties: + spin_box = QSpinBox() + if prop == "Top" or prop == "Bottom": + spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) + if prop == "Left" or prop == "Right": + spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) + spin_box.valueChanged.connect(self.adjust_roi) + self.roiPropertiesTableWidget.setCellWidget(row_ind, 1, spin_box) + self.roiPropertiesSpinBoxes[prop] = spin_box + if prop in self.roi_table_properties_secondary: + label = QLabel() + self.roiPropertiesTableWidget.setCellWidget(row_ind, 1, label) + self.roiPropertiesLabels[prop] = label + row_ind += 1 self.roiPropertiesTableWidget.horizontalHeader().hide() self.roiPropertiesTableWidget.verticalHeader().hide() @@ -142,8 +152,6 @@ def on_row_change(item, _) -> None: self.current_roi = selected_row_data[0] self.set_roi_properties() - - self.tableView.selectionModel().currentRowChanged.connect(on_row_change) def on_data_in_table_change() -> None: @@ -389,6 +397,12 @@ def set_roi_properties(self) -> None: row = row + 1 self.set_roi_spinbox_ranges() self.presenter.redraw_spectrum(self.current_roi) + roi_width = abs(self.roiPropertiesSpinBoxes["Right"].value() - self.roiPropertiesSpinBoxes["Left"].value()) + self.roiPropertiesLabels["Width"].setText(str(roi_width)) + roi_height = abs(self.roiPropertiesSpinBoxes["Top"].value() - self.roiPropertiesSpinBoxes["Bottom"].value()) + self.roiPropertiesLabels["Height"].setText(str(roi_height)) + roi_area = roi_width * roi_height + self.roiPropertiesLabels["Area"].setText(str(roi_area)) def adjust_roi(self) -> None: roi_iter_order = ["Left", "Top", "Right", "Bottom"] @@ -408,4 +422,3 @@ def set_roi_spinbox_ranges(self): value.setMaximum(spin_boxes["Bottom"].value() - 1) elif key == "Bottom": value.setMinimum(spin_boxes["Top"].value() + 1) - From 40ff0b10dcb295ece45a336a64f2b4e04104441d Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Mon, 5 Feb 2024 16:18:32 +0000 Subject: [PATCH 04/19] added width, height, area --- .../spectrum_viewer/spectrum_widget.py | 3 -- .../gui/windows/spectrum_viewer/view.py | 50 ++++++++++++------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py index 4de6dbe51fb..bc66b910329 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py +++ b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py @@ -68,7 +68,6 @@ def adjust_spec_roi(self, roi: SensibleROI) -> None: self.setSize((roi.width, roi.height)) - class SpectrumWidget(GraphicsLayoutWidget): """ The widget containing the spectrum plot and the image projection. @@ -196,8 +195,6 @@ def adjust_roi(self, new_roi: SensibleROI, roi_name: str): """ self.roi_dict[roi_name].adjust_spec_roi(new_roi) - - def get_roi(self, roi_name: str) -> SensibleROI: """ Get the ROI with the given name. If no name is given, the default ROI is returned. diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index e19d7397aac..0e288f24c8e 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -15,12 +15,11 @@ from .model import ROI_RITS from .presenter import SpectrumViewerWindowPresenter, ExportMode from mantidimaging.gui.widgets import RemovableRowTableView -from .spectrum_widget import SpectrumWidget, SpectrumROI +from .spectrum_widget import SpectrumWidget from mantidimaging.gui.windows.spectrum_viewer.roi_table_model import TableModel from mantidimaging.core.utility.sensible_roi import SensibleROI import numpy as np -from random import randint if TYPE_CHECKING: from mantidimaging.gui.windows.main import MainWindowView # noqa:F401 # pragma: no cover @@ -100,23 +99,33 @@ def __init__(self, main_window: 'MainWindowView'): # Roi Prop table self.roiPropertiesGroupBoxTitle: str = "Roi Properties: " - self.roiPropertiesTableWidget.setColumnCount(2) - self.roiPropertiesTableWidget.setRowCount(4) self.roi_table_properties = ["Top", "Bottom", "Left", "Right"] - self.roiPropertiesSpinBoxes = {} + self.roi_table_properties_secondary = ["Width", "Height", "Area"] + self.roi_table_properties_all = self.roi_table_properties + self.roi_table_properties_secondary + self.roiPropertiesTableWidget.setColumnCount(2) + self.roiPropertiesTableWidget.setRowCount(len(self.roi_table_properties_all)) - for row in range(self.roiPropertiesTableWidget.rowCount()): - spin_box = QSpinBox() - if self.roi_table_properties[row] == "Top" or self.roi_table_properties[row] == "Bottom": - spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) - if self.roi_table_properties[row] == "Left" or self.roi_table_properties[row] == "Right": - spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) - spin_box.valueChanged.connect(self.adjust_roi) - self.roiPropertiesTableWidget.setCellWidget(row, 1, spin_box) - table_widget = QTableWidgetItem(self.roi_table_properties[row]) + self.roiPropertiesSpinBoxes = {} + self.roiPropertiesLabels = {} + row_ind = 0 + for prop in self.roi_table_properties_all: + table_widget = QTableWidgetItem(prop) table_widget.setFlags(Qt.ItemIsSelectable) - self.roiPropertiesTableWidget.setItem(row, 0, table_widget) - self.roiPropertiesSpinBoxes[self.roi_table_properties[row]] = spin_box + self.roiPropertiesTableWidget.setItem(row_ind, 0, table_widget) + if prop in self.roi_table_properties: + spin_box = QSpinBox() + if prop == "Top" or prop == "Bottom": + spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) + if prop == "Left" or prop == "Right": + spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) + spin_box.valueChanged.connect(self.adjust_roi) + self.roiPropertiesTableWidget.setCellWidget(row_ind, 1, spin_box) + self.roiPropertiesSpinBoxes[prop] = spin_box + if prop in self.roi_table_properties_secondary: + label = QLabel() + self.roiPropertiesTableWidget.setCellWidget(row_ind, 1, label) + self.roiPropertiesLabels[prop] = label + row_ind += 1 self.roiPropertiesTableWidget.horizontalHeader().hide() self.roiPropertiesTableWidget.verticalHeader().hide() @@ -142,8 +151,6 @@ def on_row_change(item, _) -> None: self.current_roi = selected_row_data[0] self.set_roi_properties() - - self.tableView.selectionModel().currentRowChanged.connect(on_row_change) def on_data_in_table_change() -> None: @@ -389,6 +396,12 @@ def set_roi_properties(self) -> None: row = row + 1 self.set_roi_spinbox_ranges() self.presenter.redraw_spectrum(self.current_roi) + roi_width = abs(self.roiPropertiesSpinBoxes["Right"].value() - self.roiPropertiesSpinBoxes["Left"].value()) + self.roiPropertiesLabels["Width"].setText(str(roi_width)) + roi_height = abs(self.roiPropertiesSpinBoxes["Top"].value() - self.roiPropertiesSpinBoxes["Bottom"].value()) + self.roiPropertiesLabels["Height"].setText(str(roi_height)) + roi_area = roi_width * roi_height + self.roiPropertiesLabels["Area"].setText(str(roi_area)) def adjust_roi(self) -> None: roi_iter_order = ["Left", "Top", "Right", "Bottom"] @@ -408,4 +421,3 @@ def set_roi_spinbox_ranges(self): value.setMaximum(spin_boxes["Bottom"].value() - 1) elif key == "Bottom": value.setMinimum(spin_boxes["Top"].value() + 1) - From bd9daa491d3443815e46eda0170e3cfba3dc36c9 Mon Sep 17 00:00:00 2001 From: MikeSullivan7 <30868085+MikeSullivan7@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:24:07 +0000 Subject: [PATCH 05/19] small fix --- mantidimaging/gui/windows/spectrum_viewer/view.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index bf82b61f1b6..0e288f24c8e 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -109,7 +109,6 @@ def __init__(self, main_window: 'MainWindowView'): self.roiPropertiesLabels = {} row_ind = 0 for prop in self.roi_table_properties_all: - print(f"{row_ind=}") table_widget = QTableWidgetItem(prop) table_widget.setFlags(Qt.ItemIsSelectable) self.roiPropertiesTableWidget.setItem(row_ind, 0, table_widget) From dde818dbd212266bb93aaa06195dfc5e5e107c27 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Mon, 12 Feb 2024 15:36:09 +0000 Subject: [PATCH 06/19] Gui adjustments --- mantidimaging/gui/ui/spectrum_viewer.ui | 36 ++++++++- .../gui/windows/spectrum_viewer/view.py | 81 +++++++++---------- 2 files changed, 74 insertions(+), 43 deletions(-) diff --git a/mantidimaging/gui/ui/spectrum_viewer.ui b/mantidimaging/gui/ui/spectrum_viewer.ui index c475e797aae..1396d005060 100644 --- a/mantidimaging/gui/ui/spectrum_viewer.ui +++ b/mantidimaging/gui/ui/spectrum_viewer.ui @@ -7,7 +7,7 @@ 0 0 913 - 710 + 781 @@ -358,16 +358,48 @@ 0 + + + 16777215 + 110 + + ROI Properties - + + + + 0 + 0 + + + + + 16777215 + 100 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 0e288f24c8e..5af95a35c6b 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -100,45 +100,54 @@ def __init__(self, main_window: 'MainWindowView'): # Roi Prop table self.roiPropertiesGroupBoxTitle: str = "Roi Properties: " self.roi_table_properties = ["Top", "Bottom", "Left", "Right"] - self.roi_table_properties_secondary = ["Width", "Height", "Area"] - self.roi_table_properties_all = self.roi_table_properties + self.roi_table_properties_secondary - self.roiPropertiesTableWidget.setColumnCount(2) - self.roiPropertiesTableWidget.setRowCount(len(self.roi_table_properties_all)) + self.roi_table_properties_secondary = ["Width", "Height"] + self.roiPropertiesTableWidget.setColumnCount(3) + self.roiPropertiesTableWidget.setRowCount(3) + self.roiPropertiesTableWidget.setColumnWidth(0, 60) + self.roiPropertiesTableWidget.setColumnWidth(1, 50) + self.roiPropertiesTableWidget.setColumnWidth(2, 50) self.roiPropertiesSpinBoxes = {} self.roiPropertiesLabels = {} - row_ind = 0 - for prop in self.roi_table_properties_all: - table_widget = QTableWidgetItem(prop) - table_widget.setFlags(Qt.ItemIsSelectable) - self.roiPropertiesTableWidget.setItem(row_ind, 0, table_widget) - if prop in self.roi_table_properties: - spin_box = QSpinBox() - if prop == "Top" or prop == "Bottom": - spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) - if prop == "Left" or prop == "Right": - spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) - spin_box.valueChanged.connect(self.adjust_roi) - self.roiPropertiesTableWidget.setCellWidget(row_ind, 1, spin_box) - self.roiPropertiesSpinBoxes[prop] = spin_box - if prop in self.roi_table_properties_secondary: - label = QLabel() - self.roiPropertiesTableWidget.setCellWidget(row_ind, 1, label) - self.roiPropertiesLabels[prop] = label - row_ind += 1 + for prop in self.roi_table_properties: + spin_box = QSpinBox() + if prop == "Top" or prop == "Bottom": + spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) + if prop == "Left" or prop == "Right": + spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) + spin_box.valueChanged.connect(self.adjust_roi) + self.roiPropertiesSpinBoxes[prop] = spin_box + for prop in self.roi_table_properties_secondary: + label = QLabel() + self.roiPropertiesLabels[prop] = label self.roiPropertiesTableWidget.horizontalHeader().hide() self.roiPropertiesTableWidget.verticalHeader().hide() self.roiPropertiesTableWidget.setShowGrid(False) + roiPropertiesTableText = ["x1,2", "y1,2", "Width, Height"] + self.roiPropertiesTableTextDict = {} + for text in roiPropertiesTableText: + item = QTableWidgetItem(text) + item.setFlags(Qt.ItemIsSelectable) + self.roiPropertiesTableTextDict[text] = item + + self.roiPropertiesTableWidget.setItem(0, 0, self.roiPropertiesTableTextDict["x1,2"]) + self.roiPropertiesTableWidget.setCellWidget(0, 1, self.roiPropertiesSpinBoxes["Left"]) + self.roiPropertiesTableWidget.setCellWidget(0, 2, self.roiPropertiesSpinBoxes["Right"]) + self.roiPropertiesTableWidget.setItem(1, 0, self.roiPropertiesTableTextDict["y1,2"]) + self.roiPropertiesTableWidget.setCellWidget(1, 1, self.roiPropertiesSpinBoxes["Top"]) + self.roiPropertiesTableWidget.setCellWidget(1, 2, self.roiPropertiesSpinBoxes["Bottom"]) + self.roiPropertiesTableWidget.setItem(2, 0, self.roiPropertiesTableTextDict["Width, Height"]) + self.roiPropertiesTableWidget.setCellWidget(2, 1, self.roiPropertiesLabels["Width"]) + self.roiPropertiesTableWidget.setCellWidget(2, 2, self.roiPropertiesLabels["Height"]) + self.spectrum.roi_changed.connect(self.set_roi_properties) _ = self.roi_table_model # Initialise model self.current_roi = self.roi_table_model.roi_names()[0] self.set_roi_properties() - print(f"{self.presenter.export_mode=}") - def on_row_change(item, _) -> None: """ Handle cell change in table view and update selected ROI and @@ -396,12 +405,8 @@ def set_roi_properties(self) -> None: row = row + 1 self.set_roi_spinbox_ranges() self.presenter.redraw_spectrum(self.current_roi) - roi_width = abs(self.roiPropertiesSpinBoxes["Right"].value() - self.roiPropertiesSpinBoxes["Left"].value()) - self.roiPropertiesLabels["Width"].setText(str(roi_width)) - roi_height = abs(self.roiPropertiesSpinBoxes["Top"].value() - self.roiPropertiesSpinBoxes["Bottom"].value()) - self.roiPropertiesLabels["Height"].setText(str(roi_height)) - roi_area = roi_width * roi_height - self.roiPropertiesLabels["Area"].setText(str(roi_area)) + self.roiPropertiesLabels["Width"].setText(str(current_roi.width)) + self.roiPropertiesLabels["Height"].setText(str(current_roi.height)) def adjust_roi(self) -> None: roi_iter_order = ["Left", "Top", "Right", "Bottom"] @@ -411,13 +416,7 @@ def adjust_roi(self) -> None: self.spectrum.adjust_roi(new_roi, self.current_roi) def set_roi_spinbox_ranges(self): - spin_boxes = self.roiPropertiesSpinBoxes - for key, value in spin_boxes.items(): - if key == "Left": - value.setMaximum(spin_boxes["Right"].value() - 1) - elif key == "Right": - value.setMinimum(spin_boxes["Left"].value() + 1) - elif key == "Top": - value.setMaximum(spin_boxes["Bottom"].value() - 1) - elif key == "Bottom": - value.setMinimum(spin_boxes["Top"].value() + 1) + self.roiPropertiesSpinBoxes["Left"].setMaximum(self.roiPropertiesSpinBoxes["Right"].value() - 1) + self.roiPropertiesSpinBoxes["Right"].setMinimum(self.roiPropertiesSpinBoxes["Left"].value() + 1) + self.roiPropertiesSpinBoxes["Top"].setMaximum(self.roiPropertiesSpinBoxes["Bottom"].value() - 1) + self.roiPropertiesSpinBoxes["Bottom"].setMinimum(self.roiPropertiesSpinBoxes["Top"].value() + 1) From cba5dd7fc4e34c61be590c94b23336219eb1b55b Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Mon, 12 Feb 2024 17:29:45 +0000 Subject: [PATCH 07/19] Handling clicked ROI --- mantidimaging/gui/windows/spectrum_viewer/presenter.py | 4 ++++ .../gui/windows/spectrum_viewer/spectrum_widget.py | 9 +++++++++ mantidimaging/gui/windows/spectrum_viewer/view.py | 1 + 3 files changed, 14 insertions(+) diff --git a/mantidimaging/gui/windows/spectrum_viewer/presenter.py b/mantidimaging/gui/windows/spectrum_viewer/presenter.py index f7018fed1e1..28e1f26a713 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/presenter.py +++ b/mantidimaging/gui/windows/spectrum_viewer/presenter.py @@ -131,6 +131,10 @@ def handle_roi_moved(self, force_new_spectrums: bool = False) -> None: self.model.set_roi(name, roi) self.view.set_spectrum(name, self.model.get_spectrum(name, self.spectrum_mode)) + def handle_roi_clicked(self, roi) -> None: + print(f"ROI CLICKED: {roi.name}") + + def redraw_spectrum(self, name: str) -> None: """ Redraw the spectrum with the given name diff --git a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py index bc66b910329..105a9214d6f 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py +++ b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py @@ -37,6 +37,7 @@ def __init__(self, name: str, sensible_roi: SensibleROI, *args, **kwargs): self.addScaleHandle([0, 0], [1, 1]) self.addScaleHandle([0, 1], [1, 0]) self._selected_row = None + self.roi.setAcceptedMouseButtons(Qt.MouseButton.LeftButton) @property def name(self) -> str: @@ -78,9 +79,11 @@ class SpectrumWidget(GraphicsLayoutWidget): spectrum: PlotItem range_control: LinearRegionItem roi_dict: dict[Optional[str], ROI] + last_clicked_roi = str range_changed = pyqtSignal(object) roi_changed = pyqtSignal() + roi_clicked = pyqtSignal(object) def __init__(self) -> None: super().__init__() @@ -158,6 +161,11 @@ def set_roi_visibility_flags(self, name: str, visible: bool) -> None: self.roi_dict[name].setVisible(visible) self.roi_dict[name].setAcceptedMouseButtons(Qt.NoButton) self.roi_dict[name].sigRegionChanged.connect(self.roi_changed.emit) + self.roi_dict[name].sigClicked.connect(self._handle_roi_clicked) + self.last_clicked_roi = name + + def _handle_roi_clicked(self) -> None: + self.roi_clicked.emit(self.last_clicked_roi) def set_roi_alpha(self, name: str, alpha: float) -> None: """ @@ -184,6 +192,7 @@ def add_roi(self, roi: SensibleROI, name: str) -> None: self.roi_dict[name] = roi_object.roi self.max_roi_size = roi_object.size() self.roi_dict[name].sigRegionChanged.connect(self.roi_changed.emit) + self.roi_dict[name].sigClicked.connect(self.roi_clicked.emit) self.image.vb.addItem(self.roi_dict[name]) self.roi_dict[name].hoverPen = mkPen(self.roi_dict[name].colour, width=3) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 5af95a35c6b..c7fba2c6092 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -65,6 +65,7 @@ def __init__(self, main_window: 'MainWindowView'): self.spectrum.range_changed.connect(self.presenter.handle_range_slide_moved) self.spectrum.roi_changed.connect(self.presenter.handle_roi_moved) + self.spectrum.roi_clicked.connect(self.presenter.handle_roi_clicked) self._current_dataset_id = None self.sampleStackSelector.stack_selected_uuid.connect(self.presenter.handle_sample_change) From 330ce94b2a3c9bb77f455b8675a1cae3cb3f3a9b Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Tue, 13 Feb 2024 11:33:20 +0000 Subject: [PATCH 08/19] ROIs selectable by clicking --- mantidimaging/gui/windows/spectrum_viewer/presenter.py | 4 ++-- .../gui/windows/spectrum_viewer/spectrum_widget.py | 10 +++------- mantidimaging/gui/windows/spectrum_viewer/view.py | 5 ++++- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/presenter.py b/mantidimaging/gui/windows/spectrum_viewer/presenter.py index 28e1f26a713..e03812d44a5 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/presenter.py +++ b/mantidimaging/gui/windows/spectrum_viewer/presenter.py @@ -132,8 +132,8 @@ def handle_roi_moved(self, force_new_spectrums: bool = False) -> None: self.view.set_spectrum(name, self.model.get_spectrum(name, self.spectrum_mode)) def handle_roi_clicked(self, roi) -> None: - print(f"ROI CLICKED: {roi.name}") - + self.view.current_roi = roi.name + self.view.set_roi_properties() def redraw_spectrum(self, name: str) -> None: """ diff --git a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py index 105a9214d6f..e7710200754 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py +++ b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py @@ -79,7 +79,7 @@ class SpectrumWidget(GraphicsLayoutWidget): spectrum: PlotItem range_control: LinearRegionItem roi_dict: dict[Optional[str], ROI] - last_clicked_roi = str + last_clicked_roi: str range_changed = pyqtSignal(object) roi_changed = pyqtSignal() @@ -159,13 +159,9 @@ def set_roi_visibility_flags(self, name: str, visible: bool) -> None: for handle in handles: handle.setVisible(visible) self.roi_dict[name].setVisible(visible) - self.roi_dict[name].setAcceptedMouseButtons(Qt.NoButton) + self.roi_dict[name].setAcceptedMouseButtons(Qt.MouseButton.LeftButton) self.roi_dict[name].sigRegionChanged.connect(self.roi_changed.emit) - self.roi_dict[name].sigClicked.connect(self._handle_roi_clicked) - self.last_clicked_roi = name - - def _handle_roi_clicked(self) -> None: - self.roi_clicked.emit(self.last_clicked_roi) + self.roi_dict[name].sigClicked.connect(self.roi_clicked.emit) def set_roi_alpha(self, name: str, alpha: float) -> None: """ diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index c7fba2c6092..2cdd546ade2 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -46,6 +46,8 @@ class SpectrumViewerWindowView(BaseMainWindowView): roiPropertiesTableWidget: QTableWidget roiPropertiesGroupBox: QGroupBox + last_clicked_roi: str + def __init__(self, main_window: 'MainWindowView'): super().__init__(None, 'gui/ui/spectrum_viewer.ui') @@ -206,7 +208,7 @@ def on_visibility_change(self) -> None: When the visibility of an ROI is changed, update the visibility of the ROI in the spectrum widget """ if self.presenter.export_mode == ExportMode.ROI_MODE: - self.current_roi = self.roi_table_model.row_data(self.selected_row)[0] + self.current_roi = self.last_clicked_roi self.set_roi_properties() for roi_name, _, roi_visible in self.roi_table_model: if roi_visible is False: @@ -221,6 +223,7 @@ def on_visibility_change(self) -> None: if self.presenter.export_mode == ExportMode.IMAGE_MODE: self.set_roi_alpha(255, ROI_RITS) self.presenter.redraw_spectrum(ROI_RITS) + self.last_clicked_roi = self.current_roi self.current_roi = ROI_RITS self.set_roi_properties() else: From 3bbda7d7c194bc9dde9dc23da16589902e1ba3ee Mon Sep 17 00:00:00 2001 From: MikeSullivan7 <30868085+MikeSullivan7@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:35:17 +0000 Subject: [PATCH 09/19] test fix --- mantidimaging/gui/windows/spectrum_viewer/view.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 8eecc68dc35..57d3c4861f9 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -51,7 +51,6 @@ class SpectrumViewerWindowView(BaseMainWindowView): spectrum_widget: SpectrumWidget - def __init__(self, main_window: 'MainWindowView'): super().__init__(None, 'gui/ui/spectrum_viewer.ui') From ac90af4c3f3595512f24928b3b2c822e795f8892 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Tue, 13 Feb 2024 14:24:42 +0000 Subject: [PATCH 10/19] eyes test fix --- mantidimaging/gui/windows/spectrum_viewer/view.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 8eecc68dc35..aac6a5fa025 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -51,7 +51,6 @@ class SpectrumViewerWindowView(BaseMainWindowView): spectrum_widget: SpectrumWidget - def __init__(self, main_window: 'MainWindowView'): super().__init__(None, 'gui/ui/spectrum_viewer.ui') @@ -123,9 +122,9 @@ def __init__(self, main_window: 'MainWindowView'): for prop in self.roi_table_properties: spin_box = QSpinBox() if prop == "Top" or prop == "Bottom": - spin_box.setMaximum(self.spectrum.image.image_data.shape[0]) + spin_box.setMaximum(self.spectrum_widget.image.image_data.shape[0]) if prop == "Left" or prop == "Right": - spin_box.setMaximum(self.spectrum.image.image_data.shape[1]) + spin_box.setMaximum(self.spectrum_widget.image_data.shape[1]) spin_box.valueChanged.connect(self.adjust_roi) self.roiPropertiesSpinBoxes[prop] = spin_box for prop in self.roi_table_properties_secondary: From 86b0e76b353905b5a62eb436be8bde0ade915480 Mon Sep 17 00:00:00 2001 From: MikeSullivan7 <30868085+MikeSullivan7@users.noreply.github.com> Date: Tue, 13 Feb 2024 14:26:22 +0000 Subject: [PATCH 11/19] eyes test fix --- mantidimaging/gui/windows/spectrum_viewer/view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index aac6a5fa025..5cd5dfcded7 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -124,7 +124,7 @@ def __init__(self, main_window: 'MainWindowView'): if prop == "Top" or prop == "Bottom": spin_box.setMaximum(self.spectrum_widget.image.image_data.shape[0]) if prop == "Left" or prop == "Right": - spin_box.setMaximum(self.spectrum_widget.image_data.shape[1]) + spin_box.setMaximum(self.spectrum_widget.image.image_data.shape[1]) spin_box.valueChanged.connect(self.adjust_roi) self.roiPropertiesSpinBoxes[prop] = spin_box for prop in self.roi_table_properties_secondary: From 129201d6a28e25fe94feb64a44001589ca3b9950 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Wed, 14 Feb 2024 09:37:16 +0000 Subject: [PATCH 12/19] More test fixes --- mantidimaging/gui/windows/spectrum_viewer/view.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index aac6a5fa025..2144807ba6f 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -124,7 +124,7 @@ def __init__(self, main_window: 'MainWindowView'): if prop == "Top" or prop == "Bottom": spin_box.setMaximum(self.spectrum_widget.image.image_data.shape[0]) if prop == "Left" or prop == "Right": - spin_box.setMaximum(self.spectrum_widget.image_data.shape[1]) + spin_box.setMaximum(self.spectrum_widget.image.image_data.shape[1]) spin_box.valueChanged.connect(self.adjust_roi) self.roiPropertiesSpinBoxes[prop] = spin_box for prop in self.roi_table_properties_secondary: @@ -152,7 +152,7 @@ def __init__(self, main_window: 'MainWindowView'): self.roiPropertiesTableWidget.setCellWidget(2, 1, self.roiPropertiesLabels["Width"]) self.roiPropertiesTableWidget.setCellWidget(2, 2, self.roiPropertiesLabels["Height"]) - self.spectrum.roi_changed.connect(self.set_roi_properties) + self.spectrum_widget.roi_changed.connect(self.set_roi_properties) _ = self.roi_table_model # Initialise model self.current_roi = self.roi_table_model.roi_names()[0] From 4aa16238e87d06ddac7d367b3dedeccec30f3e08 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Wed, 14 Feb 2024 10:23:31 +0000 Subject: [PATCH 13/19] Added release note --- docs/release_notes/next/feature-2027-Spectrum-ROI-Adjustable | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/release_notes/next/feature-2027-Spectrum-ROI-Adjustable diff --git a/docs/release_notes/next/feature-2027-Spectrum-ROI-Adjustable b/docs/release_notes/next/feature-2027-Spectrum-ROI-Adjustable new file mode 100644 index 00000000000..1c6d6156b91 --- /dev/null +++ b/docs/release_notes/next/feature-2027-Spectrum-ROI-Adjustable @@ -0,0 +1 @@ +#2027: The Spectrum ROI details display in an adjustable table via spinboxes \ No newline at end of file From 986e69d6b12aa5b2392b7cf62ea401440bfa555d Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Wed, 14 Feb 2024 17:08:04 +0000 Subject: [PATCH 14/19] Additional Changes --- mantidimaging/gui/ui/spectrum_viewer.ui | 11 +++++++---- .../windows/spectrum_viewer/spectrum_widget.py | 2 +- .../gui/windows/spectrum_viewer/view.py | 17 +++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mantidimaging/gui/ui/spectrum_viewer.ui b/mantidimaging/gui/ui/spectrum_viewer.ui index 1396d005060..52be844f773 100644 --- a/mantidimaging/gui/ui/spectrum_viewer.ui +++ b/mantidimaging/gui/ui/spectrum_viewer.ui @@ -6,8 +6,8 @@ 0 0 - 913 - 781 + 905 + 752 @@ -361,7 +361,7 @@ 16777215 - 110 + 200 @@ -379,9 +379,12 @@ 16777215 - 100 + 200 + + QAbstractScrollArea::AdjustToContentsOnFirstShow + diff --git a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py index c8ed215f794..4ff77bc2d8e 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py +++ b/mantidimaging/gui/windows/spectrum_viewer/spectrum_widget.py @@ -210,7 +210,7 @@ def add_roi(self, roi: SensibleROI, name: str) -> None: def adjust_roi(self, new_roi: SensibleROI, roi_name: str): """ Adjust the existing ROI with the given name. - @param spec_roi: The new SpectrumROI to replace the existing SpectrumROI + @param new_roi: The new SpectrumROI to replace the existing SpectrumROI @param roi_name: The name of the existing ROI. """ self.roi_dict[roi_name].adjust_spec_roi(new_roi) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 2144807ba6f..19e1d51ce46 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -108,12 +108,11 @@ def __init__(self, main_window: 'MainWindowView'): self.tableView.setAlternatingRowColors(True) # Roi Prop table - self.roiPropertiesGroupBoxTitle: str = "Roi Properties: " self.roi_table_properties = ["Top", "Bottom", "Left", "Right"] self.roi_table_properties_secondary = ["Width", "Height"] self.roiPropertiesTableWidget.setColumnCount(3) self.roiPropertiesTableWidget.setRowCount(3) - self.roiPropertiesTableWidget.setColumnWidth(0, 60) + self.roiPropertiesTableWidget.setColumnWidth(0, 80) self.roiPropertiesTableWidget.setColumnWidth(1, 50) self.roiPropertiesTableWidget.setColumnWidth(2, 50) @@ -135,17 +134,17 @@ def __init__(self, main_window: 'MainWindowView'): self.roiPropertiesTableWidget.verticalHeader().hide() self.roiPropertiesTableWidget.setShowGrid(False) - roiPropertiesTableText = ["x1,2", "y1,2", "Width, Height"] + roiPropertiesTableText = ["x1, x2", "y1, y2", "Width, Height"] self.roiPropertiesTableTextDict = {} for text in roiPropertiesTableText: item = QTableWidgetItem(text) item.setFlags(Qt.ItemIsSelectable) self.roiPropertiesTableTextDict[text] = item - self.roiPropertiesTableWidget.setItem(0, 0, self.roiPropertiesTableTextDict["x1,2"]) + self.roiPropertiesTableWidget.setItem(0, 0, self.roiPropertiesTableTextDict["x1, x2"]) self.roiPropertiesTableWidget.setCellWidget(0, 1, self.roiPropertiesSpinBoxes["Left"]) self.roiPropertiesTableWidget.setCellWidget(0, 2, self.roiPropertiesSpinBoxes["Right"]) - self.roiPropertiesTableWidget.setItem(1, 0, self.roiPropertiesTableTextDict["y1,2"]) + self.roiPropertiesTableWidget.setItem(1, 0, self.roiPropertiesTableTextDict["y1, y2"]) self.roiPropertiesTableWidget.setCellWidget(1, 1, self.roiPropertiesSpinBoxes["Top"]) self.roiPropertiesTableWidget.setCellWidget(1, 2, self.roiPropertiesSpinBoxes["Bottom"]) self.roiPropertiesTableWidget.setItem(2, 0, self.roiPropertiesTableTextDict["Width, Height"]) @@ -438,13 +437,11 @@ def set_binning_visibility(self) -> None: def set_roi_properties(self) -> None: current_roi = self.presenter.model.get_roi(self.current_roi) - self.roiPropertiesGroupBox.setTitle(self.roiPropertiesGroupBoxTitle + self.current_roi) + self.roiPropertiesGroupBox.setTitle(f"Roi Properties: {self.current_roi}") roi_iter_order = ["Left", "Top", "Right", "Bottom"] - row = 0 - for pos in current_roi.__iter__(): + for row, pos in enumerate(current_roi): with QSignalBlocker(self.roiPropertiesSpinBoxes[roi_iter_order[row]]): self.roiPropertiesSpinBoxes[roi_iter_order[row]].setValue(pos) - row = row + 1 self.set_roi_spinbox_ranges() self.presenter.redraw_spectrum(self.current_roi) self.roiPropertiesLabels["Width"].setText(str(current_roi.width)) @@ -455,7 +452,7 @@ def adjust_roi(self) -> None: new_points = [self.roiPropertiesSpinBoxes[prop].value() for prop in roi_iter_order] new_roi = SensibleROI().from_list(new_points) self.presenter.model.set_roi(self.current_roi, new_roi) - self.spectrum.adjust_roi(new_roi, self.current_roi) + self.spectrum_widget.adjust_roi(new_roi, self.current_roi) def set_roi_spinbox_ranges(self): self.roiPropertiesSpinBoxes["Left"].setMaximum(self.roiPropertiesSpinBoxes["Right"].value() - 1) From 3c4cf8585bac6ff5c3624e83395b27116c2a15df Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Fri, 16 Feb 2024 12:31:52 +0000 Subject: [PATCH 15/19] Roi tab switch fixes --- .../gui/windows/spectrum_viewer/view.py | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 19e1d51ce46..ec57ce1536c 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -62,6 +62,8 @@ def __init__(self, main_window: 'MainWindowView'): self.selected_row: int = 0 self.current_roi: str = "" self.selected_row_data: Optional[list] = None + self.roiPropertiesSpinBoxes: dict[str, QSpinBox] = {} + self.roiPropertiesLabels: dict[str, QLabel] = {} self.presenter = SpectrumViewerWindowPresenter(self, main_window) @@ -116,8 +118,6 @@ def __init__(self, main_window: 'MainWindowView'): self.roiPropertiesTableWidget.setColumnWidth(1, 50) self.roiPropertiesTableWidget.setColumnWidth(2, 50) - self.roiPropertiesSpinBoxes = {} - self.roiPropertiesLabels = {} for prop in self.roi_table_properties: spin_box = QSpinBox() if prop == "Top" or prop == "Bottom": @@ -134,7 +134,7 @@ def __init__(self, main_window: 'MainWindowView'): self.roiPropertiesTableWidget.verticalHeader().hide() self.roiPropertiesTableWidget.setShowGrid(False) - roiPropertiesTableText = ["x1, x2", "y1, y2", "Width, Height"] + roiPropertiesTableText = ["x1, x2", "y1, y2", "Size"] self.roiPropertiesTableTextDict = {} for text in roiPropertiesTableText: item = QTableWidgetItem(text) @@ -147,14 +147,14 @@ def __init__(self, main_window: 'MainWindowView'): self.roiPropertiesTableWidget.setItem(1, 0, self.roiPropertiesTableTextDict["y1, y2"]) self.roiPropertiesTableWidget.setCellWidget(1, 1, self.roiPropertiesSpinBoxes["Top"]) self.roiPropertiesTableWidget.setCellWidget(1, 2, self.roiPropertiesSpinBoxes["Bottom"]) - self.roiPropertiesTableWidget.setItem(2, 0, self.roiPropertiesTableTextDict["Width, Height"]) + self.roiPropertiesTableWidget.setItem(2, 0, self.roiPropertiesTableTextDict["Size"]) self.roiPropertiesTableWidget.setCellWidget(2, 1, self.roiPropertiesLabels["Width"]) self.roiPropertiesTableWidget.setCellWidget(2, 2, self.roiPropertiesLabels["Height"]) self.spectrum_widget.roi_changed.connect(self.set_roi_properties) _ = self.roi_table_model # Initialise model - self.current_roi = self.roi_table_model.roi_names()[0] + self.current_roi = self.last_clicked_roi = self.roi_table_model.roi_names()[0] self.set_roi_properties() def on_row_change(item, _) -> None: @@ -215,7 +215,10 @@ def on_visibility_change(self) -> None: """ if self.presenter.export_mode == ExportMode.ROI_MODE: self.current_roi = self.last_clicked_roi - self.set_roi_properties() + if self.roi_table_model.rowCount() == 0: + self.disable_roi_properties() + if not self.roi_table_model.rowCount() == 0: + self.set_roi_properties() for roi_name, _, roi_visible in self.roi_table_model: if roi_visible is False: self.set_roi_alpha(0, roi_name) @@ -329,6 +332,10 @@ def set_new_roi(self) -> None: Set a new ROI on the image """ self.presenter.do_add_roi() + for _, spinbox in self.roiPropertiesSpinBoxes.items(): + if not spinbox.isEnabled(): + spinbox.setEnabled(True) + self.set_roi_properties() def update_roi_color_in_table(self, roi_name: str, new_color: tuple): """ @@ -402,6 +409,7 @@ def remove_roi(self) -> None: if self.roi_table_model.rowCount() == 0: self.removeBtn.setEnabled(False) + self.disable_roi_properties() def clear_all_rois(self) -> None: """ @@ -411,6 +419,7 @@ def clear_all_rois(self) -> None: self.spectrum_widget.spectrum_data_dict = {} self.spectrum_widget.spectrum.clearPlots() self.removeBtn.setEnabled(False) + self.disable_roi_properties() @property def transmission_error_mode(self) -> str: @@ -436,6 +445,8 @@ def set_binning_visibility(self) -> None: self.bin_step_spinBox.setHidden(hide_binning) def set_roi_properties(self) -> None: + if not any(list(self.roiPropertiesSpinBoxes.values())): + [spinbox.setEnabled(True) for spinbox in self.roiPropertiesSpinBoxes.values()] current_roi = self.presenter.model.get_roi(self.current_roi) self.roiPropertiesGroupBox.setTitle(f"Roi Properties: {self.current_roi}") roi_iter_order = ["Left", "Top", "Right", "Bottom"] @@ -459,3 +470,14 @@ def set_roi_spinbox_ranges(self): self.roiPropertiesSpinBoxes["Right"].setMinimum(self.roiPropertiesSpinBoxes["Left"].value() + 1) self.roiPropertiesSpinBoxes["Top"].setMaximum(self.roiPropertiesSpinBoxes["Bottom"].value() - 1) self.roiPropertiesSpinBoxes["Bottom"].setMinimum(self.roiPropertiesSpinBoxes["Top"].value() + 1) + + def disable_roi_properties(self): + self.roiPropertiesGroupBox.setTitle(f"Roi Properties: None selected") + self.last_clicked_roi = None + for _, spinbox in self.roiPropertiesSpinBoxes.items(): + with QSignalBlocker(spinbox): + spinbox.setMinimum(0) + spinbox.setValue(0) + spinbox.setDisabled(True) + for _, label in self.roiPropertiesLabels.items(): + label.setText("0") From 425bc2f8f8865fb19b423a65c92d4c44aa5a1d22 Mon Sep 17 00:00:00 2001 From: MikeSullivan7 <30868085+MikeSullivan7@users.noreply.github.com> Date: Fri, 16 Feb 2024 12:36:08 +0000 Subject: [PATCH 16/19] f-string fix --- mantidimaging/gui/windows/spectrum_viewer/view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index ec57ce1536c..2159e0d408d 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -472,7 +472,7 @@ def set_roi_spinbox_ranges(self): self.roiPropertiesSpinBoxes["Bottom"].setMinimum(self.roiPropertiesSpinBoxes["Top"].value() + 1) def disable_roi_properties(self): - self.roiPropertiesGroupBox.setTitle(f"Roi Properties: None selected") + self.roiPropertiesGroupBox.setTitle("Roi Properties: None selected") self.last_clicked_roi = None for _, spinbox in self.roiPropertiesSpinBoxes.items(): with QSignalBlocker(spinbox): From e6b38bc0743b107608a321eab959c44d7723d72e Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Fri, 16 Feb 2024 16:39:18 +0000 Subject: [PATCH 17/19] ROI sample change fix --- mantidimaging/gui/windows/spectrum_viewer/presenter.py | 2 ++ mantidimaging/gui/windows/spectrum_viewer/view.py | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/presenter.py b/mantidimaging/gui/windows/spectrum_viewer/presenter.py index dba92173c39..f46395ed742 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/presenter.py +++ b/mantidimaging/gui/windows/spectrum_viewer/presenter.py @@ -118,6 +118,8 @@ def show_new_sample(self) -> None: self.view.set_image(self.model.get_averaged_image()) self.view.spectrum_widget.spectrum_plot_widget.add_range(*self.model.tof_range) self.view.auto_range_image() + if self.view.get_roi_properties_spinboxes(): + self.view.set_roi_properties() def handle_range_slide_moved(self, tof_range) -> None: self.model.tof_range = tof_range diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 2159e0d408d..95e54652605 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -234,6 +234,8 @@ def on_visibility_change(self) -> None: self.presenter.redraw_spectrum(ROI_RITS) self.last_clicked_roi = self.current_roi self.current_roi = ROI_RITS + for _, spinbox in self.roiPropertiesSpinBoxes.items(): + spinbox.setEnabled(True) self.set_roi_properties() else: self.set_roi_alpha(0, ROI_RITS) @@ -445,7 +447,7 @@ def set_binning_visibility(self) -> None: self.bin_step_spinBox.setHidden(hide_binning) def set_roi_properties(self) -> None: - if not any(list(self.roiPropertiesSpinBoxes.values())): + if not any([spinbox.setEnabled(False) for spinbox in self.roiPropertiesSpinBoxes.values()]): [spinbox.setEnabled(True) for spinbox in self.roiPropertiesSpinBoxes.values()] current_roi = self.presenter.model.get_roi(self.current_roi) self.roiPropertiesGroupBox.setTitle(f"Roi Properties: {self.current_roi}") @@ -473,7 +475,7 @@ def set_roi_spinbox_ranges(self): def disable_roi_properties(self): self.roiPropertiesGroupBox.setTitle("Roi Properties: None selected") - self.last_clicked_roi = None + self.last_clicked_roi = "roi" for _, spinbox in self.roiPropertiesSpinBoxes.items(): with QSignalBlocker(spinbox): spinbox.setMinimum(0) @@ -481,3 +483,6 @@ def disable_roi_properties(self): spinbox.setDisabled(True) for _, label in self.roiPropertiesLabels.items(): label.setText("0") + + def get_roi_properties_spinboxes(self): + return self.roiPropertiesSpinBoxes From e3e65d4c3c82d8d64842c16283ff9fff04a422e9 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Fri, 16 Feb 2024 17:07:08 +0000 Subject: [PATCH 18/19] Even more fixes --- mantidimaging/gui/windows/spectrum_viewer/view.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 95e54652605..942e5c1fb78 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -447,8 +447,10 @@ def set_binning_visibility(self) -> None: self.bin_step_spinBox.setHidden(hide_binning) def set_roi_properties(self) -> None: - if not any([spinbox.setEnabled(False) for spinbox in self.roiPropertiesSpinBoxes.values()]): - [spinbox.setEnabled(True) for spinbox in self.roiPropertiesSpinBoxes.values()] + for spinbox in self.roiPropertiesSpinBoxes.values(): + spinbox.setEnabled(True) + if self.presenter.export_mode == ExportMode.IMAGE_MODE: + self.current_roi = ROI_RITS current_roi = self.presenter.model.get_roi(self.current_roi) self.roiPropertiesGroupBox.setTitle(f"Roi Properties: {self.current_roi}") roi_iter_order = ["Left", "Top", "Right", "Bottom"] From a34a968caef6e0f9233f76272389fe39bf4853b1 Mon Sep 17 00:00:00 2001 From: Mike Sullivan Date: Tue, 20 Feb 2024 12:23:37 +0000 Subject: [PATCH 19/19] selected ROI updates when sample changed --- .../gui/windows/spectrum_viewer/presenter.py | 1 + mantidimaging/gui/windows/spectrum_viewer/view.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/mantidimaging/gui/windows/spectrum_viewer/presenter.py b/mantidimaging/gui/windows/spectrum_viewer/presenter.py index f46395ed742..789e072621c 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/presenter.py +++ b/mantidimaging/gui/windows/spectrum_viewer/presenter.py @@ -80,6 +80,7 @@ def handle_sample_change(self, uuid: Optional['UUID']) -> None: self.add_rits_roi() self.view.set_normalise_error(self.model.normalise_issue()) self.show_new_sample() + self.view.on_visibility_change() def handle_normalise_stack_change(self, normalise_uuid: Optional['UUID']) -> None: if normalise_uuid == self.current_norm_stack_uuid: diff --git a/mantidimaging/gui/windows/spectrum_viewer/view.py b/mantidimaging/gui/windows/spectrum_viewer/view.py index 942e5c1fb78..2e49be81b37 100644 --- a/mantidimaging/gui/windows/spectrum_viewer/view.py +++ b/mantidimaging/gui/windows/spectrum_viewer/view.py @@ -232,7 +232,8 @@ def on_visibility_change(self) -> None: if self.presenter.export_mode == ExportMode.IMAGE_MODE: self.set_roi_alpha(255, ROI_RITS) self.presenter.redraw_spectrum(ROI_RITS) - self.last_clicked_roi = self.current_roi + if self.current_roi != ROI_RITS: + self.last_clicked_roi = self.current_roi self.current_roi = ROI_RITS for _, spinbox in self.roiPropertiesSpinBoxes.items(): spinbox.setEnabled(True) @@ -447,11 +448,12 @@ def set_binning_visibility(self) -> None: self.bin_step_spinBox.setHidden(hide_binning) def set_roi_properties(self) -> None: - for spinbox in self.roiPropertiesSpinBoxes.values(): - spinbox.setEnabled(True) if self.presenter.export_mode == ExportMode.IMAGE_MODE: self.current_roi = ROI_RITS - current_roi = self.presenter.model.get_roi(self.current_roi) + if self.current_roi not in self.presenter.model.get_list_of_roi_names() or not self.roiPropertiesSpinBoxes: + return + else: + current_roi = self.presenter.model.get_roi(self.current_roi) self.roiPropertiesGroupBox.setTitle(f"Roi Properties: {self.current_roi}") roi_iter_order = ["Left", "Top", "Right", "Bottom"] for row, pos in enumerate(current_roi): @@ -461,6 +463,8 @@ def set_roi_properties(self) -> None: self.presenter.redraw_spectrum(self.current_roi) self.roiPropertiesLabels["Width"].setText(str(current_roi.width)) self.roiPropertiesLabels["Height"].setText(str(current_roi.height)) + for spinbox in self.roiPropertiesSpinBoxes.values(): + spinbox.setEnabled(True) def adjust_roi(self) -> None: roi_iter_order = ["Left", "Top", "Right", "Bottom"]