diff --git a/MantidPlot/src/ApplicationWindow.cpp b/MantidPlot/src/ApplicationWindow.cpp index c88b63a137133ce7d89a44ad441e944b118c3fa8..f450eb7c16f4bcb5a76280e6675840a37e85d28f 100644 --- a/MantidPlot/src/ApplicationWindow.cpp +++ b/MantidPlot/src/ApplicationWindow.cpp @@ -15633,11 +15633,7 @@ void ApplicationWindow::showInterfaceCategoriesDialog() { } void ApplicationWindow::showUserDirectoryDialog() { - MantidQt::API::ManageUserDirectories *ad = - new MantidQt::API::ManageUserDirectories(this); - ad->setAttribute(Qt::WA_DeleteOnClose); - ad->show(); - ad->setFocus(); + ManageUserDirectories::openManageUserDirectories(); } void ApplicationWindow::addCustomAction(QAction *action, diff --git a/MantidPlot/src/Mantid/FirstTimeSetup.cpp b/MantidPlot/src/Mantid/FirstTimeSetup.cpp index dbcb8086685833ac0fd3ae2d0638ff2a115a6c5e..97bc1502c172bd4678ab2b88b9ebbc7e3240e434 100644 --- a/MantidPlot/src/Mantid/FirstTimeSetup.cpp +++ b/MantidPlot/src/Mantid/FirstTimeSetup.cpp @@ -161,12 +161,7 @@ void FirstTimeSetup::facilitySelected(const QString &facility) { } void FirstTimeSetup::openManageUserDirectories() { - MantidQt::API::ManageUserDirectories *ad = - new MantidQt::API::ManageUserDirectories(this); - ad->setAttribute(Qt::WA_DeleteOnClose); - ad->show(); - ad->setFocus(); - // cppcheck-suppress memleak + MantidQt::API::ManageUserDirectories::openManageUserDirectories(); } void FirstTimeSetup::openReleaseNotes() { diff --git a/docs/source/release/v4.2.0/mantidworkbench.rst b/docs/source/release/v4.2.0/mantidworkbench.rst index b33ac1b48908ddfa6596576c6eb477ca054f3212..c00c982ead477a1729ef3726020142b55e2611db 100644 --- a/docs/source/release/v4.2.0/mantidworkbench.rst +++ b/docs/source/release/v4.2.0/mantidworkbench.rst @@ -30,6 +30,7 @@ Improvements - If a spectrum has a label, this will now be used instead of the spectrum number in the legend when the spectrum is plotted. - The dialog for selecting spectra to plot now has the spectrum number input field selected by default. - There are now icons alongside the colormap names in the plot options dialog. +- The help button in the Manage User Directories widget has been restored. - Hex codes can now be inputted directly into the color selectors in figure options. - There is now a button on the plot window's toolbar to generate a script that will re-create the current figure. - It is now possible to fit table workspaces in the fit browser and in a script. diff --git a/qt/applications/workbench/workbench/app/mainwindow.py b/qt/applications/workbench/workbench/app/mainwindow.py index 86430eaa4438ba3a1ac4817772ec322ec617600c..6e6d54ce3e72858c8010b099dc3eb8dd612ed573 100644 --- a/qt/applications/workbench/workbench/app/mainwindow.py +++ b/qt/applications/workbench/workbench/app/mainwindow.py @@ -48,7 +48,7 @@ from qtpy.QtWidgets import (QApplication, QDesktopWidget, QFileDialog, QMainWindow, QSplashScreen) # noqa from mantidqt.algorithminputhistory import AlgorithmInputHistory # noqa from mantidqt.interfacemanager import InterfaceManager # noqa -from mantidqt.widgets.manageuserdirectories import ManageUserDirectories # noqa +from mantidqt.widgets import manageuserdirectories # noqa from mantidqt.widgets.codeeditor.execution import PythonCodeExecution # noqa from mantidqt.utils.qt import (add_actions, create_action, plugins, widget_updates_disabled) # noqa @@ -601,7 +601,7 @@ class MainWindow(QMainWindow): self.project.load() def open_manage_directories(self): - ManageUserDirectories(self).exec_() + manageuserdirectories.ManageUserDirectories.openManageUserDirectories() def open_settings_window(self): settings = SettingsPresenter(self) diff --git a/qt/python/mantidqt/_common.sip b/qt/python/mantidqt/_common.sip index bbbb98df55a47159a6a0f131798114f59fb0b495..77ce48f638c28ab399b146f0f0ad80fd69982fc7 100644 --- a/qt/python/mantidqt/_common.sip +++ b/qt/python/mantidqt/_common.sip @@ -384,8 +384,7 @@ class ManageUserDirectories : QDialog { %End public: ManageUserDirectories(QWidget *parent /TransferThis/ = nullptr); - static void openUserDirsDialog(QWidget *parent); - void setHelpButtonVisible(const bool &visible /TransferThis/ ); + static void openManageUserDirectories(); }; // --------------------------------- diff --git a/qt/python/mantidqt/widgets/manageuserdirectories.py b/qt/python/mantidqt/widgets/manageuserdirectories.py index 7b967ee654cef9140749dc51a3b04bfe5015fbb3..6105754ecb2d1ec9352474ba5dc916e3642050e4 100644 --- a/qt/python/mantidqt/widgets/manageuserdirectories.py +++ b/qt/python/mantidqt/widgets/manageuserdirectories.py @@ -11,19 +11,4 @@ from __future__ import (absolute_import, unicode_literals) from mantidqt.utils.qt import import_qt - -ManageUserDirectories_cpp = import_qt('.._common', 'mantidqt.widgets', 'ManageUserDirectories') - - -class ManageUserDirectories(ManageUserDirectories_cpp): - """ - Small wrapper class around the Manage User Directories Window that - hides the help button which can lead to a crash. - See https://github.com/mantidproject/mantid/issues/26404. - - This is a safe, temporary fix, for release 4.0.1. - """ - - def __init__(self, parent=None): - super(ManageUserDirectories, self).__init__(parent) - self.setHelpButtonVisible(False) +ManageUserDirectories = import_qt('.._common', 'mantidqt.widgets', 'ManageUserDirectories') diff --git a/qt/python/mantidqtpython/mantidqtpython_def.sip b/qt/python/mantidqtpython/mantidqtpython_def.sip index 7d39e4b7d9da26af17e7f6a488f3d61c5cf59c83..b72a2267e406ad08dbe39994bc412964a41245aa 100644 --- a/qt/python/mantidqtpython/mantidqtpython_def.sip +++ b/qt/python/mantidqtpython/mantidqtpython_def.sip @@ -150,7 +150,6 @@ class ManageUserDirectories : QDialog %End public: ManageUserDirectories(); - static void openUserDirsDialog(QWidget *parent); }; class InterfaceManager diff --git a/qt/scientific_interfaces/ISISSANS/SANSAddFiles.cpp b/qt/scientific_interfaces/ISISSANS/SANSAddFiles.cpp index 5f2f7f098a35bd42ac14b97825baeda8e1832cbc..4061ebb70ceb11857746628baaf2e3cf5762f410 100644 --- a/qt/scientific_interfaces/ISISSANS/SANSAddFiles.cpp +++ b/qt/scientific_interfaces/ISISSANS/SANSAddFiles.cpp @@ -364,7 +364,7 @@ void SANSAddFiles::runPythonAddFiles() { * output directory to be changed */ void SANSAddFiles::outPathSel() { - MantidQt::API::ManageUserDirectories::openUserDirsDialog(this); + MantidQt::API::ManageUserDirectories::openManageUserDirectories(); } /** This slot opens a file browser allowing a user select files, which is * copied into the new2Add_edit ready to be copied to the listbox (toAdd_List) diff --git a/qt/scientific_interfaces/ISISSANS/SANSRunWindow.cpp b/qt/scientific_interfaces/ISISSANS/SANSRunWindow.cpp index ab0385db9ed46fd715b5e7b164a712430df0eae9..073c56e35fe273c7af7c4305a8e506c0690e69fc 100644 --- a/qt/scientific_interfaces/ISISSANS/SANSRunWindow.cpp +++ b/qt/scientific_interfaces/ISISSANS/SANSRunWindow.cpp @@ -1974,7 +1974,7 @@ void SANSRunWindow::markError(QLabel *label) { * Select the base directory for the data */ void SANSRunWindow::selectDataDir() { - MantidQt::API::ManageUserDirectories::openUserDirsDialog(this); + MantidQt::API::ManageUserDirectories::openManageUserDirectories(); } /** @@ -3480,9 +3480,8 @@ void SANSRunWindow::checkList() { // split up the comma separated list ignoring spaces Poco::StringTokenizer in(input, ",", Poco::StringTokenizer::TOK_TRIM); try { - for (const auto &i : - in) { // try a lexical cast, we don't need its result only - // if there was an error + for (const auto &i : in) { // try a lexical cast, we don't need its result + // only if there was an error boost::lexical_cast<double>(i); } // there were no errors diff --git a/qt/scientific_interfaces/Indirect/IndirectInterface.cpp b/qt/scientific_interfaces/Indirect/IndirectInterface.cpp index 37e5fb748f5390cd65f83b552122a1684732f2b2..9f579b52f4a62eac9383b4ad52df9e422d62c777 100644 --- a/qt/scientific_interfaces/Indirect/IndirectInterface.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectInterface.cpp @@ -49,12 +49,7 @@ IndirectInterface::getInterfaceSettings() const { } void IndirectInterface::manageUserDirectories() { - if (!m_manageUserDirectories) { - m_manageUserDirectories = std::make_unique<ManageUserDirectories>(this); - m_manageUserDirectories->setAttribute(Qt::WA_DeleteOnClose, false); - } - m_manageUserDirectories->setModal(true); - m_manageUserDirectories->show(); + ManageUserDirectories::openManageUserDirectories(); } void IndirectInterface::showMessageBox(QString const &message) { diff --git a/qt/scientific_interfaces/Indirect/IndirectInterface.h b/qt/scientific_interfaces/Indirect/IndirectInterface.h index 20c0e337de1f7141cdc75e7af1348f86e9cd06bb..2fe8dc25d07187bdd5cb33562030b22c9d86f0fb 100644 --- a/qt/scientific_interfaces/Indirect/IndirectInterface.h +++ b/qt/scientific_interfaces/Indirect/IndirectInterface.h @@ -40,7 +40,6 @@ private: virtual void applySettings(std::map<std::string, QVariant> const &settings); std::unique_ptr<IndirectSettings> m_settings; - std::unique_ptr<API::ManageUserDirectories> m_manageUserDirectories; }; } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Muon/MuonAnalysis.cpp b/qt/scientific_interfaces/Muon/MuonAnalysis.cpp index 972caf1a7b59f081308f7df4dc7aca528e16929b..93aa84d60526254cdccadac25ea6719a46e732f6 100644 --- a/qt/scientific_interfaces/Muon/MuonAnalysis.cpp +++ b/qt/scientific_interfaces/Muon/MuonAnalysis.cpp @@ -3215,9 +3215,7 @@ void MuonAnalysis::nowDataAvailable() { } void MuonAnalysis::openDirectoryDialog() { - auto ad = new MantidQt::API::ManageUserDirectories(this); - ad->show(); - ad->setFocus(); + MantidQt::API::ManageUserDirectories::openManageUserDirectories(); } /** diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/ManageUserDirectories.h b/qt/widgets/common/inc/MantidQtWidgets/Common/ManageUserDirectories.h index 96bfe78302ba572bc1024a28aaf4d1b3c6f77c2d..08df76b19ed3a99c417cb46385a6e6e3053653f6 100644 --- a/qt/widgets/common/inc/MantidQtWidgets/Common/ManageUserDirectories.h +++ b/qt/widgets/common/inc/MantidQtWidgets/Common/ManageUserDirectories.h @@ -22,8 +22,8 @@ class EXPORT_OPT_MANTIDQT_COMMON ManageUserDirectories public: ManageUserDirectories(QWidget *parent = nullptr); ~ManageUserDirectories() override; - static void openUserDirsDialog(QWidget *parent); - void setHelpButtonVisible(const bool &visible); + static void openManageUserDirectories(); + void closeEvent(QCloseEvent *event) override; private: virtual void initLayout(); diff --git a/qt/widgets/common/src/ManageUserDirectories.cpp b/qt/widgets/common/src/ManageUserDirectories.cpp index aa4b869c0864d3d235db76352027dbee0eb5df6a..cc68c2b2002d724cdb3a094f57f5f62bf6bd8e42 100644 --- a/qt/widgets/common/src/ManageUserDirectories.cpp +++ b/qt/widgets/common/src/ManageUserDirectories.cpp @@ -14,6 +14,10 @@ using namespace MantidQt::API; +namespace { +std::unique_ptr<ManageUserDirectories> CURRENTLY_OPEN_MUD; +} + ManageUserDirectories::ManageUserDirectories(QWidget *parent) : MantidDialog(parent) { setAttribute(Qt::WA_DeleteOnClose); @@ -50,10 +54,6 @@ void ManageUserDirectories::initLayout() { SLOT(selectSaveDir())); } -void ManageUserDirectories::setHelpButtonVisible(const bool &visible) { - m_uiForm.pbHelp->setVisible(visible); -} - void ManageUserDirectories::loadProperties() { m_userPropFile = QString::fromStdString( @@ -281,11 +281,17 @@ void ManageUserDirectories::selectSaveDir() { m_uiForm.leDefaultSave->setText(path); } } -/** Opens a manage directories dialog and gives it focus - * @param parent :: the parent window, probably the window that called it - */ -void ManageUserDirectories::openUserDirsDialog(QWidget *parent) { - ManageUserDirectories *ad = new ManageUserDirectories(parent); - ad->show(); - ad->setFocus(); + +void ManageUserDirectories::openManageUserDirectories() { + if (CURRENTLY_OPEN_MUD) { + CURRENTLY_OPEN_MUD->raise(); + } else { + CURRENTLY_OPEN_MUD = std::make_unique<ManageUserDirectories>(); + CURRENTLY_OPEN_MUD->show(); + } +} + +void ManageUserDirectories::closeEvent(QCloseEvent *event) { + CURRENTLY_OPEN_MUD.reset(); + QWidget::closeEvent(event); } diff --git a/scripts/Interface/ui/sans_isis/run_selector_widget.py b/scripts/Interface/ui/sans_isis/run_selector_widget.py index cbccaac5aa06b0541a39fc1a7b65ba5192b82b3f..24016cded4085dd1f3bcf09152c2f09161607036 100644 --- a/scripts/Interface/ui/sans_isis/run_selector_widget.py +++ b/scripts/Interface/ui/sans_isis/run_selector_widget.py @@ -9,8 +9,8 @@ from __future__ import (absolute_import, division, print_function) from qtpy import QtGui, QtWidgets from qtpy.QtCore import Signal, QSettings, QFileInfo -from mantidqt.widgets import manageuserdirectories from mantidqt.utils.qt import load_ui +from mantidqt.widgets import manageuserdirectories Ui_RunSelectorWidget, _ = load_ui(__file__, "run_selector_widget.ui") @@ -58,7 +58,7 @@ class RunSelectorWidget(QtWidgets.QWidget, Ui_RunSelectorWidget): return "Files ( *" + " *".join(extensions) + ")" def show_directories_manager(self): - manageuserdirectories.ManageUserDirectories(self).exec_() + manageuserdirectories.ManageUserDirectories.openManageUserDirectories() def run_not_found(self): QtWidgets.QMessageBox.warning(self, "Run Not Found!", diff --git a/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py b/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py index b257030f30afd8daaeb844b9f51578cb79054e70..3e408ac874bacd1bdf3f59c1e7fe1c0c73f97fd0 100644 --- a/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py +++ b/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py @@ -891,7 +891,7 @@ class SANSDataProcessorGui(QMainWindow, return str(self.mask_file_input_line_edit.text()) def show_directory_manager(self): - manageuserdirectories.ManageUserDirectories(self).exec_() + manageuserdirectories.ManageUserDirectories.openManageUserDirectories() def _on_load_mask_file(self): load_file(self.mask_file_input_line_edit, "*.*", self.__generic_settings, diff --git a/scripts/Muon/GUI/Common/help_widget/help_widget_view.py b/scripts/Muon/GUI/Common/help_widget/help_widget_view.py index 3c57167060bb65e4897eac3f7c4ca68d80dc72a8..0185b580e52fca904b3454997b78dce2a3550b75 100644 --- a/scripts/Muon/GUI/Common/help_widget/help_widget_view.py +++ b/scripts/Muon/GUI/Common/help_widget/help_widget_view.py @@ -8,7 +8,7 @@ from __future__ import (absolute_import, division, print_function) from qtpy import QtWidgets import Muon.GUI.Common.message_box as message_box -from mantidqt.widgets.manageuserdirectories import ManageUserDirectories +from mantidqt.widgets import manageuserdirectories from mantidqt.interfacemanager import InterfaceManager @@ -60,7 +60,7 @@ class HelpWidgetView(QtWidgets.QWidget): self.help_button.clicked.connect(slot) def show_directory_manager(self): - ManageUserDirectories.openUserDirsDialog(self) + manageuserdirectories.ManageUserDirectories.openManageUserDirectories() def _on_help_button_clicked(self): InterfaceManager().showCustomInterfaceHelp(self.doc) diff --git a/scripts/Muon/GUI/Common/load_widget/load_view.py b/scripts/Muon/GUI/Common/load_widget/load_view.py index 2295ea9f81a2982d95f4279e3b21a310d1bd9053..27bd505ca566ad54c4a92f1e7ec71817694bc436 100644 --- a/scripts/Muon/GUI/Common/load_widget/load_view.py +++ b/scripts/Muon/GUI/Common/load_widget/load_view.py @@ -8,7 +8,7 @@ from __future__ import absolute_import from qtpy import QtWidgets, QtCore -from mantidqt.widgets.manageuserdirectories import ManageUserDirectories +from mantidqt.widgets import manageuserdirectories class LoadView(QtWidgets.QWidget): @@ -36,7 +36,7 @@ class LoadView(QtWidgets.QWidget): self.setLayout(self.grid) def show_directory_manager(self): - ManageUserDirectories.openUserDirsDialog(self) + manageuserdirectories.ManageUserDirectories.openManageUserDirectories() def disable_buttons(self): self.spinbox.setEnabled(False) diff --git a/scripts/test/Muon/help_widget_presenter_test.py b/scripts/test/Muon/help_widget_presenter_test.py index bd89a0c78d978071969c92416f3c3dce61be633d..2f6d112e656ceb21525b6775bb96a9e8e41a9083 100644 --- a/scripts/test/Muon/help_widget_presenter_test.py +++ b/scripts/test/Muon/help_widget_presenter_test.py @@ -8,12 +8,12 @@ import unittest from mantid.py3compat import mock from mantidqt.utils.qt.testing import start_qapplication +from mantidqt.widgets import manageuserdirectories from Muon.GUI.Common.help_widget.help_widget_presenter import HelpWidgetPresenter from Muon.GUI.Common.help_widget.help_widget_view import HelpWidgetView - @start_qapplication class HelpWidgetPresenterTest(unittest.TestCase): def setUp(self): @@ -25,11 +25,10 @@ class HelpWidgetPresenterTest(unittest.TestCase): def tearDown(self): self.view = None - @mock.patch('Muon.GUI.Common.help_widget.help_widget_view.ManageUserDirectories') - def test_that_manage_directories_button_clicked_opens_directory_manager(self, ManageUserDirectories_mock): + @mock.patch('Muon.GUI.Common.help_widget.help_widget_view.manageuserdirectories.ManageUserDirectories') + def test_that_manage_directories_button_clicked_opens_directory_manager(self, mud_mock): self.view.manage_user_dir_button.clicked.emit(True) - - ManageUserDirectories_mock.openUserDirsDialog.assert_called_once_with(self.view) + self.assertEqual(1, mud_mock.openManageUserDirectories.call_count) if __name__ == '__main__':