diff --git a/qt/applications/workbench/workbench/app/mainwindow.py b/qt/applications/workbench/workbench/app/mainwindow.py index 430e2de93d635895609108585b2b6a968853c4a0..655cfb5716a5e18f10d7467d7dc973ef7cd13be4 100644 --- a/qt/applications/workbench/workbench/app/mainwindow.py +++ b/qt/applications/workbench/workbench/app/mainwindow.py @@ -372,18 +372,24 @@ class MainWindow(QMainWindow): def launch_custom_python_gui(self, filename): self.interface_executor.execute(open(filename).read(), filename) - def launch_custom_cpp_gui(self, interface_name): + def launch_custom_cpp_gui(self, interface_name, submenu = None): """Create a new interface window if one does not already exist, else show existing window""" object_name = 'custom-cpp-interface-' + interface_name window = find_window(object_name, QMainWindow) if window is None: - interface = self.interface_manager.createSubWindow(interface_name,self) + interface = self.interface_manager.createSubWindow(interface_name) interface.setObjectName(object_name) interface.setAttribute(Qt.WA_DeleteOnClose, True) + # make indirect interfaces children of workbench + if submenu == "Indirect": + interface.setParent(self, interface.windowFlags()) interface.show() else: - window.raise_() + if (window.windowState() == Qt.WindowState.WindowMinimized): + window.showNormal() + else: + window.raise_() def populate_interfaces_menu(self): """Populate then Interfaces menu with all Python and C++ interfaces""" @@ -404,8 +410,8 @@ class MainWindow(QMainWindow): action.triggered.connect(lambda checked_py, script=script: self.launch_custom_python_gui(script)) else: action = submenu.addAction(name) - action.triggered.connect(lambda checked_cpp, name=name: - self.launch_custom_cpp_gui(name)) + action.triggered.connect(lambda checked_cpp, name=name, key=key: + self.launch_custom_cpp_gui(name, key)) def _discover_python_interfaces(self, interface_dir): """Return a dictionary mapping a category to a set of named Python interfaces""" diff --git a/qt/python/mantidqt/utils/writetosignal.py b/qt/python/mantidqt/utils/writetosignal.py index 26d39fbf5d02c518804c161a21b2114659c9aebf..2a85db8201fb07bd2bd4e6c77d870ea4144eb510 100644 --- a/qt/python/mantidqt/utils/writetosignal.py +++ b/qt/python/mantidqt/utils/writetosignal.py @@ -45,6 +45,11 @@ class WriteToSignal(QObject): self.sig_write_received.emit("Error: Unable to write to the console of the process.\n" "This error is not related to your script's execution.\n" "Original error: {}\n\n".format(str(e))) - + except UnicodeEncodeError: + """ + Scripts containing unicode characters could fail to run if mantid is not started from the + terminal on unix systems. The script runs fine if this exception is caught and discarded. + """ + pass # always write to the message log self.sig_write_received.emit(txt) diff --git a/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py b/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py index 53695267584133f85f9d2cb872b9054de2728401..46a4e82df002fb8d5729a013fb0242cb87e9f59a 100644 --- a/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py +++ b/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py @@ -84,27 +84,32 @@ class MatrixWorkspaceTableViewModel(QAbstractTableModel): raise ValueError("Unknown model type {0}".format(self.type)) def _makeVerticalHeader(self, section, role): + def _numeric_axis_value_unit(axis): + # binned/point data + if axis.length() == self.ws.getNumberHistograms() + 1: + value = 0.5 * (float(axis.label(section)) + float(axis.label(section + 1))) + else: + value = float(axis.label(section)) + return value, axis.getUnit().symbol().utf8() + axis_index = 1 # check that the vertical axis actually exists in the workspace if self.ws.axes() > axis_index: + axis = self.ws.getAxis(axis_index) if role == Qt.DisplayRole: - if not self.ws.getAxis(axis_index).isNumeric(): + if not axis.isNumeric(): return self.VERTICAL_HEADER_DISPLAY_STRING.format( - section, self.ws.getAxis(axis_index).label(section)) + section, axis.label(section)) else: - bin_center = (float(self.ws.getAxis(axis_index).label(section)) + - float(self.ws.getAxis(axis_index).label(section+1)))/2.0 - unit = self.ws.getAxis(axis_index).getUnit().symbol().utf8() - return self.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format(section, bin_center, unit) + display_value, unit = _numeric_axis_value_unit(axis) + return self.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format(section, display_value, unit) else: - if not self.ws.getAxis(axis_index).isNumeric(): + if not axis.isNumeric(): spectrum_number = self.ws.getSpectrum(section).getSpectrumNo() return self.VERTICAL_HEADER_TOOLTIP_STRING.format(section, spectrum_number) else: - bin_center = (float(self.ws.getAxis(axis_index).label(section)) + - float(self.ws.getAxis(axis_index).label(section+1)))/2.0 - unit = self.ws.getAxis(axis_index).getUnit().symbol().utf8() - return self.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format(section, bin_center, unit) + display_value, unit = _numeric_axis_value_unit(axis) + return self.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format(section, display_value, unit) else: raise NotImplementedError("What do we do here? Handle if the vertical axis does NOT exist") diff --git a/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py b/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py index 8c1c8e30706783a3affe9f42b1fc25a0d899b256..59efbbac08ca9dbd514e4ef6c5093924504a1268 100644 --- a/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py +++ b/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py @@ -386,13 +386,13 @@ class MatrixWorkspaceDisplayTableViewModelTest(unittest.TestCase): MockSpectrum.SPECTRUM_NO) self.assertEqual(expected_output, output) - def test_headerData_vertical_header_display_for_numeric_axis(self): + def test_headerData_vertical_header_display_for_numeric_axis_with_point_data(self): dummy_unit = 'unit' - bin_center = 0.5 ws = MockWorkspace() mock_axis = Mock() mock_axis.isNumeric.return_value = True - mock_axis.label = MagicMock(side_effect=lambda x: x) + expected_value = 0. + mock_axis.label = MagicMock(side_effect=[str(expected_value)]) mock_axis.getUnit().symbol().utf8.return_value = dummy_unit ws.getAxis.return_value = mock_axis @@ -403,17 +403,63 @@ class MatrixWorkspaceDisplayTableViewModelTest(unittest.TestCase): expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format( mock_section, - bin_center, + expected_value, dummy_unit) self.assertEqual(expected_output, output) - def test_headerData_vertical_header_tooltip_for_numeric_axis(self): + def test_headerData_vertical_header_display_for_numeric_axis_with_binned_data(self): dummy_unit = 'unit' - bin_center = 0.5 ws = MockWorkspace() mock_axis = Mock() mock_axis.isNumeric.return_value = True - mock_axis.label = MagicMock(side_effect=lambda x: x) + # single spectrum with length 2 axis + ws.getNumberHistograms.return_value = 1 + mock_axis.length.return_value = 2 + mock_axis.label = MagicMock(side_effect=["0", "1"]) + mock_axis.getUnit().symbol().utf8.return_value = dummy_unit + ws.getAxis.return_value = mock_axis + + model_type = MatrixWorkspaceTableViewModelType.y + model = MatrixWorkspaceTableViewModel(ws, model_type) + mock_section = 0 + output = model.headerData(mock_section, Qt.Vertical, Qt.DisplayRole) + + expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format( + mock_section, + 0.5, + dummy_unit) + self.assertEqual(expected_output, output) + + def test_headerData_vertical_header_tooltip_for_numeric_axis_with_point_data(self): + dummy_unit = 'unit' + ws = MockWorkspace() + mock_axis = Mock() + mock_axis.isNumeric.return_value = True + ws.getNumberHistograms.return_value = 1 + mock_axis.length.return_value = 1 + mock_axis.label = MagicMock(side_effect=["0"]) + mock_axis.getUnit().symbol().utf8.return_value = dummy_unit + ws.getAxis.return_value = mock_axis + + model_type = MatrixWorkspaceTableViewModelType.y + model = MatrixWorkspaceTableViewModel(ws, model_type) + mock_section = 0 + output = model.headerData(mock_section, Qt.Vertical, Qt.ToolTipRole) + + expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format( + mock_section, + 0, + dummy_unit) + self.assertEqual(expected_output, output) + + def test_headerData_vertical_header_tooltip_for_numeric_axis_with_binned_data(self): + dummy_unit = 'unit' + ws = MockWorkspace() + mock_axis = Mock() + mock_axis.isNumeric.return_value = True + ws.getNumberHistograms.return_value = 1 + mock_axis.length.return_value = 2 + mock_axis.label = MagicMock(side_effect=["0", "1"]) mock_axis.getUnit().symbol().utf8.return_value = dummy_unit ws.getAxis.return_value = mock_axis @@ -424,7 +470,7 @@ class MatrixWorkspaceDisplayTableViewModelTest(unittest.TestCase): expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format( mock_section, - bin_center, + 0.5, dummy_unit) self.assertEqual(expected_output, output)