diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/FitScriptGeneratorPresenter.h b/qt/widgets/common/inc/MantidQtWidgets/Common/FitScriptGeneratorPresenter.h index 17203c637ac382337d0eb478bd32a5c9af715010..f5d3e7bc87c303d361835ce9f390011089960074 100644 --- a/qt/widgets/common/inc/MantidQtWidgets/Common/FitScriptGeneratorPresenter.h +++ b/qt/widgets/common/inc/MantidQtWidgets/Common/FitScriptGeneratorPresenter.h @@ -84,9 +84,9 @@ private: WorkspaceIndex workspaceIndex, double startX, double endX); void updateStartX(std::string const &workspaceName, - WorkspaceIndex workspaceIndex, FitDomainIndex domainIndex); + WorkspaceIndex workspaceIndex, double startX); void updateEndX(std::string const &workspaceName, - WorkspaceIndex workspaceIndex, FitDomainIndex domainIndex); + WorkspaceIndex workspaceIndex, double endX); void updateParameterValue(std::string const &workspaceName, WorkspaceIndex workspaceIndex, @@ -110,14 +110,8 @@ private: void updateFunctionInViewFromModel(FitDomainIndex domainIndex); - template <void (FitScriptGeneratorPresenter::*func)( - std::string const &workspaceName, WorkspaceIndex workspaceIndex, - FitDomainIndex domainIndex)> - void updateXLimitForDomainInModel(); - template <void (FitScriptGeneratorPresenter::*func)( - std::string const &workspaceName, WorkspaceIndex workspaceIndex, - FitDomainIndex domainIndex)> - void updateXLimitForDomainInModel(FitDomainIndex domainIndex); + template <typename GetX, typename UpdateX> + void updateXLimitForDomain(GetX &&getX, UpdateX &&updateX); template <void (IFitScriptGeneratorModel::*func)( std::string const &workspaceName, WorkspaceIndex workspaceIndex, @@ -132,6 +126,10 @@ private: template <typename Function, typename... Args> void updateFunctionComponent(Function &&func, Args... arguments); + template <typename Function, typename... Args> + void invokeFunctionForDomain(FitDomainIndex domainIndex, Function &&func, + Args... arguments); + [[nodiscard]] std::vector<FitDomainIndex> getRowIndices() const; std::tuple<std::string, std::string> convertFunctionIndexOfParameterTie( diff --git a/qt/widgets/common/src/FitScriptGeneratorPresenter.cpp b/qt/widgets/common/src/FitScriptGeneratorPresenter.cpp index 6a3099a079cd0836d27ed19740c883e28ed98f38..c625c9a6409d1294990e8443b1b6a831fa222829 100644 --- a/qt/widgets/common/src/FitScriptGeneratorPresenter.cpp +++ b/qt/widgets/common/src/FitScriptGeneratorPresenter.cpp @@ -147,11 +147,13 @@ void FitScriptGeneratorPresenter::handleSelectionChanged() { } void FitScriptGeneratorPresenter::handleStartXChanged() { - updateXLimitForDomainInModel<&FitScriptGeneratorPresenter::updateStartX>(); + updateXLimitForDomain(&IFitScriptGeneratorView::startX, + &FitScriptGeneratorPresenter::updateStartX); } void FitScriptGeneratorPresenter::handleEndXChanged() { - updateXLimitForDomainInModel<&FitScriptGeneratorPresenter::updateEndX>(); + updateXLimitForDomain(&IFitScriptGeneratorView::endX, + &FitScriptGeneratorPresenter::updateEndX); } void FitScriptGeneratorPresenter::handleFunctionRemoved( @@ -246,11 +248,12 @@ void FitScriptGeneratorPresenter::setWorkspaces( void FitScriptGeneratorPresenter::addWorkspaces( std::vector<MatrixWorkspace_const_sptr> const &workspaces, std::vector<WorkspaceIndex> const &workspaceIndices) { - for (auto const &workspace : workspaces) + for (auto const &workspace : workspaces) { for (auto const &workspaceIndex : workspaceIndices) { auto const xData = workspace->x(workspaceIndex.value); addWorkspace(workspace, workspaceIndex, xData.front(), xData.back()); } + } checkForWarningMessages(); } @@ -286,9 +289,8 @@ void FitScriptGeneratorPresenter::addWorkspace(std::string const &workspaceName, void FitScriptGeneratorPresenter::updateStartX(std::string const &workspaceName, WorkspaceIndex workspaceIndex, - FitDomainIndex domainIndex) { - if (!m_model->updateStartX(workspaceName, workspaceIndex, - m_view->startX(domainIndex))) { + double startX) { + if (!m_model->updateStartX(workspaceName, workspaceIndex, startX)) { m_view->resetSelection(); m_view->displayWarning("The StartX provided must be within the x limits of " "its workspace, and less than the EndX."); @@ -297,9 +299,8 @@ void FitScriptGeneratorPresenter::updateStartX(std::string const &workspaceName, void FitScriptGeneratorPresenter::updateEndX(std::string const &workspaceName, WorkspaceIndex workspaceIndex, - FitDomainIndex domainIndex) { - if (!m_model->updateEndX(workspaceName, workspaceIndex, - m_view->endX(domainIndex))) { + double endX) { + if (!m_model->updateEndX(workspaceName, workspaceIndex, endX)) { m_view->resetSelection(); m_view->displayWarning("The EndX provided must be within the x limits of " "its workspace, and greater than the StartX."); @@ -360,23 +361,15 @@ void FitScriptGeneratorPresenter::updateFunctionInViewFromModel( setGlobalParameters(m_model->getGlobalParameters()); } -template <void (FitScriptGeneratorPresenter::*func)( - std::string const &workspaceName, WorkspaceIndex workspaceIndex, - FitDomainIndex domainIndex)> -void FitScriptGeneratorPresenter::updateXLimitForDomainInModel() { - if (m_view->hasLoadedData()) - updateXLimitForDomainInModel<func>(m_view->currentRow()); -} - -template <void (FitScriptGeneratorPresenter::*func)( - std::string const &workspaceName, WorkspaceIndex workspaceIndex, - FitDomainIndex domainIndex)> -void FitScriptGeneratorPresenter::updateXLimitForDomainInModel( - FitDomainIndex domainIndex) { - auto const workspaceName = m_view->workspaceName(domainIndex); - auto const workspaceIndex = m_view->workspaceIndex(domainIndex); - - (this->*func)(workspaceName, workspaceIndex, domainIndex); +template <typename GetX, typename UpdateX> +void FitScriptGeneratorPresenter::updateXLimitForDomain(GetX &&getX, + UpdateX &&updateX) { + if (m_view->hasLoadedData()) { + auto const domainIndex = m_view->currentRow(); + auto const newValue = + std::invoke(std::forward<GetX>(getX), m_view, domainIndex); + invokeFunctionForDomain(domainIndex, updateX, newValue); + } } template <void (IFitScriptGeneratorModel::*func)( @@ -409,14 +402,20 @@ template <typename Function, typename... Args> void FitScriptGeneratorPresenter::updateFunctionComponent(Function &&func, Args... arguments) { for (auto const &rowIndex : getRowIndices()) { - auto const workspaceName = m_view->workspaceName(rowIndex); - auto const workspaceIndex = m_view->workspaceIndex(rowIndex); - - std::invoke(std::forward<Function>(func), this, workspaceName, - workspaceIndex, arguments...); + invokeFunctionForDomain(rowIndex, func, arguments...); } } +template <typename Function, typename... Args> +void FitScriptGeneratorPresenter::invokeFunctionForDomain( + FitDomainIndex domainIndex, Function &&func, Args... arguments) { + auto const workspaceName = m_view->workspaceName(domainIndex); + auto const workspaceIndex = m_view->workspaceIndex(domainIndex); + + std::invoke(std::forward<Function>(func), this, workspaceName, workspaceIndex, + arguments...); +} + std::vector<FitDomainIndex> FitScriptGeneratorPresenter::getRowIndices() const { return m_view->applyFunctionChangesToAll() ? m_view->allRows() : m_view->selectedRows();