diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index e57514b3b0750f06dbcc794cdfd578ea1efc4e4c..f837b1d12f4124437e577566acf5991b4a7f6504 100644 --- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -65,6 +65,10 @@ public: virtual void showAlgorithmDialog(const std::string &algorithm); virtual std::string requestNotebookPath(); + // Settings + virtual void saveSettings(const std::map<std::string, QVariant> &options); + virtual void loadSettings(std::map<std::string, QVariant> &options); + // Plotting virtual void plotWorkspaces(const std::set<std::string> &workspaces); diff --git a/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 2723cd05a2779d7712ba4611ec522047e81dda1a..b637e714e781c24ca11a64e409994ca8c432fef5 100644 --- a/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -8,667 +8,641 @@ #include <qinputdialog.h> #include <qmessagebox.h> +namespace { +const QString ReflSettingsGroup = "Mantid/CustomInterfaces/ISISReflectometry"; +} + +namespace MantidQt { +namespace CustomInterfaces { +using namespace Mantid::API; + +DECLARE_SUBWINDOW(QtReflMainView) + +//---------------------------------------------------------------------------------------------- +/** Constructor +*/ +QtReflMainView::QtReflMainView(QWidget *parent) + : UserSubWindow(parent), m_openMap(new QSignalMapper(this)), + m_calculator(new MantidWidgets::SlitCalculator(this)) {} + +//---------------------------------------------------------------------------------------------- +/** Destructor +*/ +QtReflMainView::~QtReflMainView() {} + +/** +Initialise the Interface +*/ +void QtReflMainView::initLayout() { + ui.setupUi(this); + + ui.buttonProcess->setDefaultAction(ui.actionProcess); + ui.buttonTransfer->setDefaultAction(ui.actionTransfer); + + // Create a whats this button + ui.rowToolBar->addAction(QWhatsThis::createAction(this)); + + // Expand the process runs column at the expense of the search column + ui.splitterTables->setStretchFactor(0, 0); + ui.splitterTables->setStretchFactor(1, 1); + + // Allow rows and columns to be reordered + ui.viewTable->verticalHeader()->setMovable(true); + ui.viewTable->horizontalHeader()->setMovable(true); + + // Custom context menu for table + connect(ui.viewTable, SIGNAL(customContextMenuRequested(const QPoint &)), + this, SLOT(showContextMenu(const QPoint &))); + connect(ui.tableSearchResults, + SIGNAL(customContextMenuRequested(const QPoint &)), this, + SLOT(showSearchContextMenu(const QPoint &))); + + // Finally, create a presenter to do the thinking for us + m_presenter = + boost::shared_ptr<IReflPresenter>(new ReflMainViewPresenter(this)); +} + +/** +This slot loads a table workspace model and changes to a LoadedMainView +presenter +@param name : the string name of the workspace to be grabbed +*/ +void QtReflMainView::setModel(QString name) { + m_toOpen = name.toStdString(); + m_presenter->notify(IReflPresenter::OpenTableFlag); +} + +/** +Set a new model in the tableview +@param model : the model to be attached to the tableview +*/ +void QtReflMainView::showTable(QReflTableModel_sptr model) { + m_model = model; + // So we can notify the presenter when the user updates the table + connect(m_model.get(), + SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, + SLOT(tableUpdated(const QModelIndex &, const QModelIndex &))); + ui.viewTable->setModel(m_model.get()); + ui.viewTable->resizeColumnsToContents(); +} + +/** +Set a new model for search results +@param model : the model to be attached to the search results +*/ +void QtReflMainView::showSearch(ReflSearchModel_sptr model) { + m_searchModel = model; + ui.tableSearchResults->setModel(m_searchModel.get()); + ui.tableSearchResults->resizeColumnsToContents(); +} + +/** +Set the list of tables the user is offered to open +@param tables : the names of the tables in the ADS +*/ +void QtReflMainView::setTableList(const std::set<std::string> &tables) { + ui.menuOpenTable->clear(); + + for (auto it = tables.begin(); it != tables.end(); ++it) { + QAction *openTable = + ui.menuOpenTable->addAction(QString::fromStdString(*it)); + openTable->setIcon(QIcon("://worksheet.png")); + + // Map this action to the table name + m_openMap->setMapping(openTable, QString::fromStdString(*it)); + + connect(openTable, SIGNAL(triggered()), m_openMap, SLOT(map())); + connect(m_openMap, SIGNAL(mapped(QString)), this, SLOT(setModel(QString))); + } +} + +/** +This slot notifies the presenter that the "save" button has been pressed +*/ +void QtReflMainView::on_actionSaveTable_triggered() { + m_presenter->notify(IReflPresenter::SaveFlag); +} + +/** +This slot notifies the presenter that the "save as" button has been pressed +*/ +void QtReflMainView::on_actionSaveTableAs_triggered() { + m_presenter->notify(IReflPresenter::SaveAsFlag); +} + +/** +This slot notifies the presenter that the "append row" button has been pressed +*/ +void QtReflMainView::on_actionAppendRow_triggered() { + m_presenter->notify(IReflPresenter::AppendRowFlag); +} + +/** +This slot notifies the presenter that the "prepend row" button has been pressed +*/ +void QtReflMainView::on_actionPrependRow_triggered() { + m_presenter->notify(IReflPresenter::PrependRowFlag); +} + +/** +This slot notifies the presenter that the "delete" button has been pressed +*/ +void QtReflMainView::on_actionDeleteRow_triggered() { + m_presenter->notify(IReflPresenter::DeleteRowFlag); +} + +/** +This slot notifies the presenter that the "process" button has been pressed +*/ +void QtReflMainView::on_actionProcess_triggered() { + m_presenter->notify(IReflPresenter::ProcessFlag); +} + +/** +This slot notifies the presenter that the "group rows" button has been pressed +*/ +void QtReflMainView::on_actionGroupRows_triggered() { + m_presenter->notify(IReflPresenter::GroupRowsFlag); +} + +/** +This slot notifies the presenter that the "clear selected" button has been +pressed +*/ +void QtReflMainView::on_actionClearSelected_triggered() { + m_presenter->notify(IReflPresenter::ClearSelectedFlag); +} + +/** +This slot notifies the presenter that the "copy selection" button has been +pressed +*/ +void QtReflMainView::on_actionCopySelected_triggered() { + m_presenter->notify(IReflPresenter::CopySelectedFlag); +} + +/** +This slot notifies the presenter that the "cut selection" button has been +pressed +*/ +void QtReflMainView::on_actionCutSelected_triggered() { + m_presenter->notify(IReflPresenter::CutSelectedFlag); +} + +/** +This slot notifies the presenter that the "paste selection" button has been +pressed +*/ +void QtReflMainView::on_actionPasteSelected_triggered() { + m_presenter->notify(IReflPresenter::PasteSelectedFlag); +} + +/** +This slot notifies the presenter that the "new table" button has been pressed +*/ +void QtReflMainView::on_actionNewTable_triggered() { + m_presenter->notify(IReflPresenter::NewTableFlag); +} + +/** +This slot notifies the presenter that the "expand selection" button has been +pressed +*/ +void QtReflMainView::on_actionExpandSelection_triggered() { + m_presenter->notify(IReflPresenter::ExpandSelectionFlag); +} + +/** +This slot notifies the presenter that the "options..." button has been pressed +*/ +void QtReflMainView::on_actionOptionsDialog_triggered() { + m_presenter->notify(IReflPresenter::OptionsDialogFlag); +} + +/** +This slot notifies the presenter that the "search" button has been pressed +*/ +void QtReflMainView::on_actionSearch_triggered() { + m_presenter->notify(IReflPresenter::SearchFlag); +} + +/** +This slot notifies the presenter that the "transfer" button has been pressed +*/ +void QtReflMainView::on_actionTransfer_triggered() { + m_presenter->notify(IReflPresenter::TransferFlag); +} + +/** +This slot notifies the presenter that the "export table" button has been pressed +*/ +void QtReflMainView::on_actionExportTable_triggered() { + m_presenter->notify(IReflPresenter::ExportTableFlag); +} + +/** +This slot notifies the presenter that the "import table" button has been pressed +*/ +void QtReflMainView::on_actionImportTable_triggered() { + m_presenter->notify(IReflPresenter::ImportTableFlag); +} + +/** This slot is used to syncrhonise the two instrument selection widgets */ +void QtReflMainView::on_comboProcessInstrument_currentIndexChanged(int index) { + ui.comboSearchInstrument->setCurrentIndex(index); + m_calculator->setCurrentInstrumentName( + ui.comboProcessInstrument->currentText().toStdString()); + m_calculator->processInstrumentHasBeenChanged(); +} + +/** This slot is used to syncrhonise the two instrument selection widgets */ +void QtReflMainView::on_comboSearchInstrument_currentIndexChanged(int index) { + ui.comboProcessInstrument->setCurrentIndex(index); + m_calculator->setCurrentInstrumentName( + ui.comboProcessInstrument->currentText().toStdString()); + m_calculator->processInstrumentHasBeenChanged(); +} + +/** +This slot opens the documentation when the "help" button has been pressed +*/ +void QtReflMainView::on_actionHelp_triggered() { + MantidQt::API::HelpWindow::showPage( + this, + QString( + "qthelp://org.mantidproject/doc/interfaces/ISIS_Reflectometry.html")); +} + +/** +This slot notifies the presenter that the "plot selected rows" button has been +pressed +*/ +void QtReflMainView::on_actionPlotRow_triggered() { + m_presenter->notify(IReflPresenter::PlotRowFlag); +} + +/** +This slot notifies the presenter that the "plot selected groups" button has been +pressed +*/ +void QtReflMainView::on_actionPlotGroup_triggered() { + m_presenter->notify(IReflPresenter::PlotGroupFlag); +} + +/** +This slot shows the slit calculator +*/ +void QtReflMainView::on_actionSlitCalculator_triggered() { + m_calculator->setCurrentInstrumentName( + ui.comboProcessInstrument->currentText().toStdString()); + m_calculator->show(); +} + +/** +This slot notifies the presenter that the table has been updated/changed by the +user +*/ +void QtReflMainView::tableUpdated(const QModelIndex &topLeft, + const QModelIndex &bottomRight) { + Q_UNUSED(topLeft); + Q_UNUSED(bottomRight); + m_presenter->notify(IReflPresenter::TableUpdatedFlag); +} + +/** +This slot is triggered when the user right clicks on the table +@param pos : The position of the right click within the table +*/ +void QtReflMainView::showContextMenu(const QPoint &pos) { + // If the user didn't right-click on anything, don't show a context menu. + if (!ui.viewTable->indexAt(pos).isValid()) + return; + + // parent widget takes ownership of QMenu + QMenu *menu = new QMenu(this); + menu->addAction(ui.actionProcess); + menu->addAction(ui.actionExpandSelection); + menu->addSeparator(); + menu->addAction(ui.actionPlotRow); + menu->addAction(ui.actionPlotGroup); + menu->addSeparator(); + menu->addAction(ui.actionPrependRow); + menu->addAction(ui.actionAppendRow); + menu->addSeparator(); + menu->addAction(ui.actionGroupRows); + menu->addAction(ui.actionCopySelected); + menu->addAction(ui.actionCutSelected); + menu->addAction(ui.actionPasteSelected); + menu->addAction(ui.actionClearSelected); + menu->addSeparator(); + menu->addAction(ui.actionDeleteRow); + + menu->popup(ui.viewTable->viewport()->mapToGlobal(pos)); +} + +/** +This slot is triggered when the user right clicks on the search results table +@param pos : The position of the right click within the table +*/ +void QtReflMainView::showSearchContextMenu(const QPoint &pos) { + if (!ui.tableSearchResults->indexAt(pos).isValid()) + return; + + // parent widget takes ownership of QMenu + QMenu *menu = new QMenu(this); + menu->addAction(ui.actionTransfer); + menu->popup(ui.tableSearchResults->viewport()->mapToGlobal(pos)); +} + +/** +Show an information dialog +@param prompt : The prompt to appear on the dialog +@param title : The text for the title bar of the dialog +*/ +void QtReflMainView::giveUserInfo(std::string prompt, std::string title) { + QMessageBox::information(this, QString(title.c_str()), + QString(prompt.c_str()), QMessageBox::Ok, + QMessageBox::Ok); +} + +/** +Show an critical error dialog +@param prompt : The prompt to appear on the dialog +@param title : The text for the title bar of the dialog +*/ +void QtReflMainView::giveUserCritical(std::string prompt, std::string title) { + QMessageBox::critical(this, QString(title.c_str()), QString(prompt.c_str()), + QMessageBox::Ok, QMessageBox::Ok); +} + +/** +Show a warning dialog +@param prompt : The prompt to appear on the dialog +@param title : The text for the title bar of the dialog +*/ +void QtReflMainView::giveUserWarning(std::string prompt, std::string title) { + QMessageBox::warning(this, QString(title.c_str()), QString(prompt.c_str()), + QMessageBox::Ok, QMessageBox::Ok); +} + +/** +Ask the user a Yes/No question +@param prompt : The prompt to appear on the dialog +@param title : The text for the title bar of the dialog +@returns a boolean true if Yes, false if No +*/ +bool QtReflMainView::askUserYesNo(std::string prompt, std::string title) { + auto response = QMessageBox::question( + this, QString(title.c_str()), QString(prompt.c_str()), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if (response == QMessageBox::Yes) { + return true; + } + return false; +} + +/** +Ask the user to enter a string. +@param prompt : The prompt to appear on the dialog +@param title : The text for the title bar of the dialog +@param defaultValue : The default value entered. +@returns The user's string if submitted, or an empty string +*/ +std::string QtReflMainView::askUserString(const std::string &prompt, + const std::string &title, + const std::string &defaultValue) { + bool ok; + QString text = QInputDialog::getText( + QString::fromStdString(title), QString::fromStdString(prompt), + QLineEdit::Normal, QString::fromStdString(defaultValue), &ok); + if (ok) + return text.toStdString(); + return ""; +} + +/** +Show the user the dialog for an algorithm +*/ +void QtReflMainView::showAlgorithmDialog(const std::string &algorithm) { + std::stringstream pythonSrc; + pythonSrc << "try:\n"; + pythonSrc << " " << algorithm << "Dialog()\n"; + pythonSrc << "except:\n"; + pythonSrc << " pass\n"; + runPythonCode(QString::fromStdString(pythonSrc.str())); +} + +/** +Show the user file dialog to choose save location of notebook +*/ +std::string QtReflMainView::requestNotebookPath() { + QString qfilename = QFileDialog::getSaveFileName( + 0, "Save notebook file", QDir::currentPath(), + "IPython Notebook files (*.ipynb);;All files (*.*)", + new QString("IPython Notebook files (*.ipynb)")); + return qfilename.toStdString(); +} + +/** + Save settings + @param options : map of user options to save + */ +void QtReflMainView::saveSettings( + const std::map<std::string, QVariant> &options) { + QSettings settings; + settings.beginGroup(ReflSettingsGroup); + for (auto it = options.begin(); it != options.end(); ++it) + settings.setValue(QString::fromStdString(it->first), it->second); + settings.endGroup(); +} + +/** + Load settings + @param options : map of user options to load into + */ +void QtReflMainView::loadSettings(std::map<std::string, QVariant> &options) { + QSettings settings; + settings.beginGroup(ReflSettingsGroup); + QStringList keys = settings.childKeys(); + for (auto it = keys.begin(); it != keys.end(); ++it) + options[it->toStdString()] = settings.value(*it); + settings.endGroup(); +} + +/** +Plot a workspace +*/ +void QtReflMainView::plotWorkspaces(const std::set<std::string> &workspaces) { + if (workspaces.empty()) + return; + + std::stringstream pythonSrc; + pythonSrc << "base_graph = None\n"; + for (auto ws = workspaces.begin(); ws != workspaces.end(); ++ws) + pythonSrc << "base_graph = plotSpectrum(\"" << *ws + << "\", 0, True, window = base_graph)\n"; + + pythonSrc << "base_graph.activeLayer().logLogAxes()\n"; + + runPythonCode(QString::fromStdString(pythonSrc.str())); +} + +/** +Set the range of the progress bar +@param min : The minimum value of the bar +@param max : The maxmimum value of the bar +*/ +void QtReflMainView::setProgressRange(int min, int max) { + ui.progressBar->setRange(min, max); +} + +/** +Set the status of the progress bar +@param progress : The current value of the bar +*/ +void QtReflMainView::setProgress(int progress) { + ui.progressBar->setValue(progress); +} + +/** + Get status of checkbox which determines whether an ipython notebook is produced + @return true if a notebook should be output on process, false otherwise + */ +bool QtReflMainView::getEnableNotebook() { + return ui.checkEnableNotebook->isChecked(); +} + +/** +Set which rows are selected +@param rows : The set of rows to select +*/ +void QtReflMainView::setSelection(const std::set<int> &rows) { + ui.viewTable->clearSelection(); + auto selectionModel = ui.viewTable->selectionModel(); + + for (auto row = rows.begin(); row != rows.end(); ++row) + selectionModel->select(ui.viewTable->model()->index((*row), 0), + QItemSelectionModel::Select | + QItemSelectionModel::Rows); +} + +/** +Set the list of available instruments to search and process for +@param instruments : The list of instruments available +@param defaultInstrument : The instrument to have selected by default +*/ +void QtReflMainView::setInstrumentList( + const std::vector<std::string> &instruments, + const std::string &defaultInstrument) { + ui.comboSearchInstrument->clear(); + ui.comboProcessInstrument->clear(); + + for (auto it = instruments.begin(); it != instruments.end(); ++it) { + QString instrument = QString::fromStdString(*it); + ui.comboSearchInstrument->addItem(instrument); + ui.comboProcessInstrument->addItem(instrument); + } + + int index = ui.comboSearchInstrument->findData( + QString::fromStdString(defaultInstrument), Qt::DisplayRole); + ui.comboSearchInstrument->setCurrentIndex(index); + ui.comboProcessInstrument->setCurrentIndex(index); +} + +/** +Set the strategy used for generating hints for the autocompletion in the options +column. +@param hintStrategy The hinting strategy to use +*/ +void QtReflMainView::setOptionsHintStrategy(HintStrategy *hintStrategy) { + ui.viewTable->setItemDelegateForColumn( + ReflMainViewPresenter::COL_OPTIONS, + new HintingLineEditFactory(hintStrategy)); +} + +/** +Sets the contents of the system's clipboard +@param text The contents of the clipboard +*/ +void QtReflMainView::setClipboard(const std::string &text) { + QApplication::clipboard()->setText(QString::fromStdString(text)); +} + +/** +Get the selected instrument for searching +@returns the selected instrument to search for +*/ +std::string QtReflMainView::getSearchInstrument() const { + return ui.comboSearchInstrument->currentText().toStdString(); +} + +/** +Get the selected instrument for processing +@returns the selected instrument to process with +*/ +std::string QtReflMainView::getProcessInstrument() const { + return ui.comboProcessInstrument->currentText().toStdString(); +} + +/** +Get the indices of the highlighted rows +@returns a set of ints containing the highlighted row numbers +*/ +std::set<int> QtReflMainView::getSelectedRows() const { + std::set<int> rows; + auto selectionModel = ui.viewTable->selectionModel(); + if (selectionModel) { + auto selectedRows = selectionModel->selectedRows(); + for (auto it = selectedRows.begin(); it != selectedRows.end(); ++it) + rows.insert(it->row()); + } + return rows; +} + +/** +Get the indices of the highlighted search result rows +@returns a set of ints containing the selected row numbers +*/ +std::set<int> QtReflMainView::getSelectedSearchRows() const { + std::set<int> rows; + auto selectionModel = ui.tableSearchResults->selectionModel(); + if (selectionModel) { + auto selectedRows = selectionModel->selectedRows(); + for (auto it = selectedRows.begin(); it != selectedRows.end(); ++it) + rows.insert(it->row()); + } + return rows; +} + +/** +Get the name of the workspace that the user wishes to open as a table +@returns The name of the workspace to open +*/ +std::string QtReflMainView::getWorkspaceToOpen() const { return m_toOpen; } + +/** +Get a pointer to the presenter that's currently controlling this view. +@returns A pointer to the presenter +*/ +boost::shared_ptr<IReflPresenter> QtReflMainView::getPresenter() const { + return m_presenter; +} + +/** +Gets the contents of the system's clipboard +@returns The contents of the clipboard +*/ +std::string QtReflMainView::getClipboard() const { + return QApplication::clipboard()->text().toStdString(); +} + +/** +Get the string the user wants to search for. +@returns The search string +*/ +std::string QtReflMainView::getSearchString() const { + return ui.textSearch->text().toStdString(); +} -namespace -{ - const QString ReflSettingsGroup = "Mantid/CustomInterfaces/ISISReflectometry"; -} - -namespace MantidQt -{ - namespace CustomInterfaces - { - using namespace Mantid::API; - - DECLARE_SUBWINDOW(QtReflMainView) - - //---------------------------------------------------------------------------------------------- - /** Constructor - */ - QtReflMainView::QtReflMainView(QWidget *parent) : UserSubWindow(parent), m_openMap(new QSignalMapper(this)), m_calculator(new MantidWidgets::SlitCalculator(this)) - { - } - - //---------------------------------------------------------------------------------------------- - /** Destructor - */ - QtReflMainView::~QtReflMainView() - { - } - - /** - Initialise the Interface - */ - void QtReflMainView::initLayout() - { - ui.setupUi(this); - - ui.buttonProcess->setDefaultAction(ui.actionProcess); - ui.buttonTransfer->setDefaultAction(ui.actionTransfer); - - //Create a whats this button - ui.rowToolBar->addAction(QWhatsThis::createAction(this)); - - //Expand the process runs column at the expense of the search column - ui.splitterTables->setStretchFactor(0, 0); - ui.splitterTables->setStretchFactor(1, 1); - - //Allow rows and columns to be reordered - ui.viewTable->verticalHeader()->setMovable(true); - ui.viewTable->horizontalHeader()->setMovable(true); - - //Custom context menu for table - connect(ui.viewTable, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))); - connect(ui.tableSearchResults, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showSearchContextMenu(const QPoint&))); - - //Finally, create a presenter to do the thinking for us - m_presenter = boost::shared_ptr<IReflPresenter>(new ReflMainViewPresenter(this)); - } - - /** - This slot loads a table workspace model and changes to a LoadedMainView presenter - @param name : the string name of the workspace to be grabbed - */ - void QtReflMainView::setModel(QString name) - { - m_toOpen = name.toStdString(); - m_presenter->notify(IReflPresenter::OpenTableFlag); - } - - /** - Set a new model in the tableview - @param model : the model to be attached to the tableview - */ - void QtReflMainView::showTable(QReflTableModel_sptr model) - { - m_model = model; - //So we can notify the presenter when the user updates the table - connect(m_model.get(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(tableUpdated(const QModelIndex&, const QModelIndex&))); - ui.viewTable->setModel(m_model.get()); - ui.viewTable->resizeColumnsToContents(); - } - - /** - Set a new model for search results - @param model : the model to be attached to the search results - */ - void QtReflMainView::showSearch(ReflSearchModel_sptr model) - { - m_searchModel = model; - ui.tableSearchResults->setModel(m_searchModel.get()); - ui.tableSearchResults->resizeColumnsToContents(); - } - - /** - Set the list of tables the user is offered to open - @param tables : the names of the tables in the ADS - */ - void QtReflMainView::setTableList(const std::set<std::string>& tables) - { - ui.menuOpenTable->clear(); - - for(auto it = tables.begin(); it != tables.end(); ++it) - { - QAction* openTable = ui.menuOpenTable->addAction(QString::fromStdString(*it)); - openTable->setIcon(QIcon("://worksheet.png")); - - //Map this action to the table name - m_openMap->setMapping(openTable, QString::fromStdString(*it)); - - connect(openTable, SIGNAL(triggered()), m_openMap, SLOT(map())); - connect(m_openMap, SIGNAL(mapped(QString)), this, SLOT(setModel(QString))); - } - } - - /** - This slot notifies the presenter that the "save" button has been pressed - */ - void QtReflMainView::on_actionSaveTable_triggered() - { - m_presenter->notify(IReflPresenter::SaveFlag); - } - - /** - This slot notifies the presenter that the "save as" button has been pressed - */ - void QtReflMainView::on_actionSaveTableAs_triggered() - { - m_presenter->notify(IReflPresenter::SaveAsFlag); - } - - /** - This slot notifies the presenter that the "append row" button has been pressed - */ - void QtReflMainView::on_actionAppendRow_triggered() - { - m_presenter->notify(IReflPresenter::AppendRowFlag); - } - - /** - This slot notifies the presenter that the "prepend row" button has been pressed - */ - void QtReflMainView::on_actionPrependRow_triggered() - { - m_presenter->notify(IReflPresenter::PrependRowFlag); - } - - /** - This slot notifies the presenter that the "delete" button has been pressed - */ - void QtReflMainView::on_actionDeleteRow_triggered() - { - m_presenter->notify(IReflPresenter::DeleteRowFlag); - } - - /** - This slot notifies the presenter that the "process" button has been pressed - */ - void QtReflMainView::on_actionProcess_triggered() - { - m_presenter->notify(IReflPresenter::ProcessFlag); - } - - /** - This slot notifies the presenter that the "group rows" button has been pressed - */ - void QtReflMainView::on_actionGroupRows_triggered() - { - m_presenter->notify(IReflPresenter::GroupRowsFlag); - } - - /** - This slot notifies the presenter that the "clear selected" button has been pressed - */ - void QtReflMainView::on_actionClearSelected_triggered() - { - m_presenter->notify(IReflPresenter::ClearSelectedFlag); - } - - /** - This slot notifies the presenter that the "copy selection" button has been pressed - */ - void QtReflMainView::on_actionCopySelected_triggered() - { - m_presenter->notify(IReflPresenter::CopySelectedFlag); - } - - /** - This slot notifies the presenter that the "cut selection" button has been pressed - */ - void QtReflMainView::on_actionCutSelected_triggered() - { - m_presenter->notify(IReflPresenter::CutSelectedFlag); - } - - /** - This slot notifies the presenter that the "paste selection" button has been pressed - */ - void QtReflMainView::on_actionPasteSelected_triggered() - { - m_presenter->notify(IReflPresenter::PasteSelectedFlag); - } - - /** - This slot notifies the presenter that the "new table" button has been pressed - */ - void QtReflMainView::on_actionNewTable_triggered() - { - m_presenter->notify(IReflPresenter::NewTableFlag); - } - - /** - This slot notifies the presenter that the "expand selection" button has been pressed - */ - void QtReflMainView::on_actionExpandSelection_triggered() - { - m_presenter->notify(IReflPresenter::ExpandSelectionFlag); - } - - /** - This slot notifies the presenter that the "options..." button has been pressed - */ - void QtReflMainView::on_actionOptionsDialog_triggered() - { - m_presenter->notify(IReflPresenter::OptionsDialogFlag); - } - - /** - This slot notifies the presenter that the "search" button has been pressed - */ - void QtReflMainView::on_actionSearch_triggered() - { - m_presenter->notify(IReflPresenter::SearchFlag); - } - - /** - This slot notifies the presenter that the "transfer" button has been pressed - */ - void QtReflMainView::on_actionTransfer_triggered() - { - m_presenter->notify(IReflPresenter::TransferFlag); - } - - /** - This slot notifies the presenter that the "export table" button has been pressed - */ - void QtReflMainView::on_actionExportTable_triggered() - { - m_presenter->notify(IReflPresenter::ExportTableFlag); - } - - /** - This slot notifies the presenter that the "import table" button has been pressed - */ - void QtReflMainView::on_actionImportTable_triggered() - { - m_presenter->notify(IReflPresenter::ImportTableFlag); - } - - /** This slot is used to syncrhonise the two instrument selection widgets */ - void QtReflMainView::on_comboProcessInstrument_currentIndexChanged(int index) - { - ui.comboSearchInstrument->setCurrentIndex(index); - m_calculator->setCurrentInstrumentName(ui.comboProcessInstrument->currentText().toStdString()); - m_calculator->emitInstrumentChangedSignal(); - } - - /** This slot is used to syncrhonise the two instrument selection widgets */ - void QtReflMainView::on_comboSearchInstrument_currentIndexChanged(int index) - { - ui.comboProcessInstrument->setCurrentIndex(index); - m_calculator->setCurrentInstrumentName(ui.comboProcessInstrument->currentText().toStdString()); - m_calculator->emitInstrumentChangedSignal(); - } - - /** - This slot opens the documentation when the "help" button has been pressed - */ - void QtReflMainView::on_actionHelp_triggered() - { - MantidQt::API::HelpWindow::showPage(this, QString("qthelp://org.mantidproject/doc/interfaces/ISIS_Reflectometry.html")); - } - - /** - This slot notifies the presenter that the "plot selected rows" button has been pressed - */ - void QtReflMainView::on_actionPlotRow_triggered() - { - m_presenter->notify(IReflPresenter::PlotRowFlag); - } - - /** - This slot notifies the presenter that the "plot selected groups" button has been pressed - */ - void QtReflMainView::on_actionPlotGroup_triggered() - { - m_presenter->notify(IReflPresenter::PlotGroupFlag); - } - - /** - This slot shows the slit calculator - */ - void QtReflMainView::on_actionSlitCalculator_triggered() - { - m_calculator->setCurrentInstrumentName(ui.comboProcessInstrument->currentText().toStdString()); - m_calculator->show(); - } - - /** - This slot notifies the presenter that the table has been updated/changed by the user - */ - void QtReflMainView::tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight) - { - Q_UNUSED(topLeft); - Q_UNUSED(bottomRight); - m_presenter->notify(IReflPresenter::TableUpdatedFlag); - } - - /** - This slot is triggered when the user right clicks on the table - @param pos : The position of the right click within the table - */ - void QtReflMainView::showContextMenu(const QPoint& pos) - { - //If the user didn't right-click on anything, don't show a context menu. - if(!ui.viewTable->indexAt(pos).isValid()) - return; - - //parent widget takes ownership of QMenu - QMenu* menu = new QMenu(this); - menu->addAction(ui.actionProcess); - menu->addAction(ui.actionExpandSelection); - menu->addSeparator(); - menu->addAction(ui.actionPlotRow); - menu->addAction(ui.actionPlotGroup); - menu->addSeparator(); - menu->addAction(ui.actionPrependRow); - menu->addAction(ui.actionAppendRow); - menu->addSeparator(); - menu->addAction(ui.actionGroupRows); - menu->addAction(ui.actionCopySelected); - menu->addAction(ui.actionCutSelected); - menu->addAction(ui.actionPasteSelected); - menu->addAction(ui.actionClearSelected); - menu->addSeparator(); - menu->addAction(ui.actionDeleteRow); - - menu->popup(ui.viewTable->viewport()->mapToGlobal(pos)); - } - - /** - This slot is triggered when the user right clicks on the search results table - @param pos : The position of the right click within the table - */ - void QtReflMainView::showSearchContextMenu(const QPoint& pos) - { - if(!ui.tableSearchResults->indexAt(pos).isValid()) - return; - - //parent widget takes ownership of QMenu - QMenu* menu = new QMenu(this); - menu->addAction(ui.actionTransfer); - menu->popup(ui.tableSearchResults->viewport()->mapToGlobal(pos)); - } - - /** - Show an information dialog - @param prompt : The prompt to appear on the dialog - @param title : The text for the title bar of the dialog - */ - void QtReflMainView::giveUserInfo(std::string prompt, std::string title) - { - QMessageBox::information(this,QString(title.c_str()),QString(prompt.c_str()),QMessageBox::Ok, QMessageBox::Ok); - } - - /** - Show an critical error dialog - @param prompt : The prompt to appear on the dialog - @param title : The text for the title bar of the dialog - */ - void QtReflMainView::giveUserCritical(std::string prompt, std::string title) - { - QMessageBox::critical(this,QString(title.c_str()),QString(prompt.c_str()),QMessageBox::Ok, QMessageBox::Ok); - } - - /** - Show a warning dialog - @param prompt : The prompt to appear on the dialog - @param title : The text for the title bar of the dialog - */ - void QtReflMainView::giveUserWarning(std::string prompt, std::string title) - { - QMessageBox::warning(this,QString(title.c_str()),QString(prompt.c_str()),QMessageBox::Ok, QMessageBox::Ok); - } - - /** - Ask the user a Yes/No question - @param prompt : The prompt to appear on the dialog - @param title : The text for the title bar of the dialog - @returns a boolean true if Yes, false if No - */ - bool QtReflMainView::askUserYesNo(std::string prompt, std::string title) - { - auto response = QMessageBox::question(this,QString(title.c_str()),QString(prompt.c_str()),QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); - if (response == QMessageBox::Yes) - { - return true; - } - return false; - } - - /** - Ask the user to enter a string. - @param prompt : The prompt to appear on the dialog - @param title : The text for the title bar of the dialog - @param defaultValue : The default value entered. - @returns The user's string if submitted, or an empty string - */ - std::string QtReflMainView::askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue) - { - bool ok; - QString text = QInputDialog::getText(QString::fromStdString(title), QString::fromStdString(prompt), QLineEdit::Normal, QString::fromStdString(defaultValue), &ok); - if(ok) - return text.toStdString(); - return ""; - } - - /** - Show the user the dialog for an algorithm - */ - void QtReflMainView::showAlgorithmDialog(const std::string& algorithm) - { - std::stringstream pythonSrc; - pythonSrc << "try:\n"; - pythonSrc << " " << algorithm << "Dialog()\n"; - pythonSrc << "except:\n"; - pythonSrc << " pass\n"; - runPythonCode(QString::fromStdString(pythonSrc.str())); - } - - /** - Show the user file dialog to choose save location of notebook - */ - std::string QtReflMainView::requestNotebookPath() - { - QString qfilename = QFileDialog::getSaveFileName(0, "Save notebook file", QDir::currentPath(), - "IPython Notebook files (*.ipynb);;All files (*.*)", - new QString("IPython Notebook files (*.ipynb)")); - return qfilename.toStdString(); - } - - /** - Save settings - @param options : map of user options to save - */ - void QtReflMainView::saveSettings(const std::map<std::string,QVariant>& options) - { - QSettings settings; - settings.beginGroup(ReflSettingsGroup); - for(auto it = options.begin(); it != options.end(); ++it) - settings.setValue(QString::fromStdString(it->first), it->second); - settings.endGroup(); - } - - /** - Load settings - @param options : map of user options to load into - */ - void QtReflMainView::loadSettings(std::map<std::string,QVariant>& options) - { - QSettings settings; - settings.beginGroup(ReflSettingsGroup); - QStringList keys = settings.childKeys(); - for(auto it = keys.begin(); it != keys.end(); ++it) - options[it->toStdString()] = settings.value(*it); - settings.endGroup(); - } - - /** - Plot a workspace - */ - void QtReflMainView::plotWorkspaces(const std::set<std::string>& workspaces) - { - if(workspaces.empty()) - return; - - std::stringstream pythonSrc; - pythonSrc << "base_graph = None\n"; - for(auto ws = workspaces.begin(); ws != workspaces.end(); ++ws) - pythonSrc << "base_graph = plotSpectrum(\"" << *ws << "\", 0, True, window = base_graph)\n"; - - pythonSrc << "base_graph.activeLayer().logLogAxes()\n"; - - runPythonCode(QString::fromStdString(pythonSrc.str())); - } - - /** - Set the range of the progress bar - @param min : The minimum value of the bar - @param max : The maxmimum value of the bar - */ - void QtReflMainView::setProgressRange(int min, int max) - { - ui.progressBar->setRange(min, max); - } - - /** - Set the status of the progress bar - @param progress : The current value of the bar - */ - void QtReflMainView::setProgress(int progress) - { - ui.progressBar->setValue(progress); - } - - /** - Get status of checkbox which determines whether an ipython notebook is produced - @return true if a notebook should be output on process, false otherwise - */ - bool QtReflMainView::getEnableNotebook() - { - return ui.checkEnableNotebook->isChecked(); - } - - /** - Set which rows are selected - @param rows : The set of rows to select - */ - void QtReflMainView::setSelection(const std::set<int>& rows) - { - ui.viewTable->clearSelection(); - auto selectionModel = ui.viewTable->selectionModel(); - - for(auto row = rows.begin(); row != rows.end(); ++row) - selectionModel->select(ui.viewTable->model()->index((*row), 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); - } - - /** - Set the list of available instruments to search and process for - @param instruments : The list of instruments available - @param defaultInstrument : The instrument to have selected by default - */ - void QtReflMainView::setInstrumentList(const std::vector<std::string>& instruments, const std::string& defaultInstrument) - { - ui.comboSearchInstrument->clear(); - ui.comboProcessInstrument->clear(); - - for(auto it = instruments.begin(); it != instruments.end(); ++it) - { - QString instrument = QString::fromStdString(*it); - ui.comboSearchInstrument->addItem(instrument); - ui.comboProcessInstrument->addItem(instrument); - } - - int index = ui.comboSearchInstrument->findData(QString::fromStdString(defaultInstrument), Qt::DisplayRole); - ui.comboSearchInstrument->setCurrentIndex(index); - ui.comboProcessInstrument->setCurrentIndex(index); - } - - /** - Set the strategy used for generating hints for the autocompletion in the options column. - @param hintStrategy The hinting strategy to use - */ - void QtReflMainView::setOptionsHintStrategy(HintStrategy* hintStrategy) - { - ui.viewTable->setItemDelegateForColumn(ReflMainViewPresenter::COL_OPTIONS, new HintingLineEditFactory(hintStrategy)); - } - - /** - Sets the contents of the system's clipboard - @param text The contents of the clipboard - */ - void QtReflMainView::setClipboard(const std::string& text) - { - QApplication::clipboard()->setText(QString::fromStdString(text)); - } - - /** - Get the selected instrument for searching - @returns the selected instrument to search for - */ - std::string QtReflMainView::getSearchInstrument() const - { - return ui.comboSearchInstrument->currentText().toStdString(); - } - - /** - Get the selected instrument for processing - @returns the selected instrument to process with - */ - std::string QtReflMainView::getProcessInstrument() const - { - return ui.comboProcessInstrument->currentText().toStdString(); - } - - /** - Get the indices of the highlighted rows - @returns a set of ints containing the highlighted row numbers - */ - std::set<int> QtReflMainView::getSelectedRows() const - { - std::set<int> rows; - auto selectionModel = ui.viewTable->selectionModel(); - if(selectionModel) - { - auto selectedRows = selectionModel->selectedRows(); - for(auto it = selectedRows.begin(); it != selectedRows.end(); ++it) - rows.insert(it->row()); - } - return rows; - } - - /** - Get the indices of the highlighted search result rows - @returns a set of ints containing the selected row numbers - */ - std::set<int> QtReflMainView::getSelectedSearchRows() const - { - std::set<int> rows; - auto selectionModel = ui.tableSearchResults->selectionModel(); - if(selectionModel) - { - auto selectedRows = selectionModel->selectedRows(); - for(auto it = selectedRows.begin(); it != selectedRows.end(); ++it) - rows.insert(it->row()); - } - return rows; - } - - /** - Get the name of the workspace that the user wishes to open as a table - @returns The name of the workspace to open - */ - std::string QtReflMainView::getWorkspaceToOpen() const - { - return m_toOpen; - } - - /** - Get a pointer to the presenter that's currently controlling this view. - @returns A pointer to the presenter - */ - boost::shared_ptr<IReflPresenter> QtReflMainView::getPresenter() const - { - return m_presenter; - } - - /** - Gets the contents of the system's clipboard - @returns The contents of the clipboard - */ - std::string QtReflMainView::getClipboard() const - { - return QApplication::clipboard()->text().toStdString(); - } - - /** - Get the string the user wants to search for. - @returns The search string - */ - std::string QtReflMainView::getSearchString() const - { - return ui.textSearch->text().toStdString(); - } - - } // namespace CustomInterfaces +} // namespace CustomInterfaces } // namespace Mantid diff --git a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/SlitCalculator.h b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/SlitCalculator.h index f88271b88c5cc957ba55b5add0fc6073772d8bf0..0c1f14771693db891e85da6da7b87fe8dd224356 100644 --- a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/SlitCalculator.h +++ b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/SlitCalculator.h @@ -44,7 +44,7 @@ public: Mantid::Geometry::Instrument_sptr getInstrument(); void setCurrentInstrumentName(std::string instrumentName); std::string getCurrentInstrumentName(); - void emitInstrumentChangedSignal(); + void processInstrumentHasBeenChanged(); protected: Ui::SlitCalculator ui; @@ -54,8 +54,6 @@ private: std::string currentInstrumentName; void setupSlitCalculatorWithInstrumentValues( Mantid::Geometry::Instrument_const_sptr); -signals: - void instrumentChanged(); private slots: void on_recalculate_triggered(); }; diff --git a/MantidQt/MantidWidgets/src/SlitCalculator.cpp b/MantidQt/MantidWidgets/src/SlitCalculator.cpp index 7a456a5ec653b37ba6886ab59128920a81182a6d..d02dcb65ef6dba7247327f6926bcd69908b50187 100644 --- a/MantidQt/MantidWidgets/src/SlitCalculator.cpp +++ b/MantidQt/MantidWidgets/src/SlitCalculator.cpp @@ -3,7 +3,6 @@ #include "MantidAPI/Progress.h" #include "MantidGeometry/Instrument/InstrumentDefinitionParser.h" - #include <math.h> namespace MantidQt { @@ -11,14 +10,14 @@ namespace MantidWidgets { SlitCalculator::SlitCalculator(QWidget *parent) { Q_UNUSED(parent); ui.setupUi(this); - if (currentInstrumentName == ""){ - currentInstrumentName = "INTER"; - setInstrument(currentInstrumentName); + if (currentInstrumentName == "") { + currentInstrumentName = "INTER"; + setInstrument(currentInstrumentName); } on_recalculate_triggered(); } -void SlitCalculator::emitInstrumentChangedSignal(){ - on_recalculate_triggered(); +void SlitCalculator::processInstrumentHasBeenChanged() { + on_recalculate_triggered(); } SlitCalculator::~SlitCalculator() {} void SlitCalculator::setInstrument(std::string instrumentName) { @@ -55,25 +54,24 @@ void SlitCalculator::setupSlitCalculatorWithInstrumentValues( auto slit1Component = instrument->getComponentByName("slit1"); auto slit2Component = instrument->getComponentByName("slit2"); auto sampleComponent = instrument->getComponentByName("some-surface-holder"); - // convert between metres and millimetres + // convert between metres and millimetres const double s1s2 = 1e3 * slit1Component->getDistance(*slit2Component); ui.spinSlit1Slit2->setValue(s1s2); const double s2sa = 1e3 * slit2Component->getDistance(*sampleComponent); ui.spinSlit2Sample->setValue(s2sa); - } Mantid::Geometry::Instrument_sptr SlitCalculator::getInstrument() { return this->instrument; } -void SlitCalculator::setCurrentInstrumentName(std::string instrumentName){ - this->currentInstrumentName = instrumentName; +void SlitCalculator::setCurrentInstrumentName(std::string instrumentName) { + this->currentInstrumentName = instrumentName; } -std::string SlitCalculator::getCurrentInstrumentName(){ - return this->currentInstrumentName; +std::string SlitCalculator::getCurrentInstrumentName() { + return this->currentInstrumentName; } void SlitCalculator::on_recalculate_triggered() { const auto currentInstrument = getInstrument(); - if (currentInstrument->getName() != currentInstrumentName){ + if (currentInstrument->getName() != currentInstrumentName) { setInstrument(currentInstrumentName); } // Gather input