From e3936b8dd0b95b4206e9ef9ad26cb64f882172c7 Mon Sep 17 00:00:00 2001
From: Matthew Andrew <matthew.andrew@tessella.com>
Date: Thu, 26 Sep 2019 17:59:59 +0100
Subject: [PATCH] Updated IndirectFitDataView Re #22055

---
 .../Indirect/CMakeLists.txt                   |   8 +-
 qt/scientific_interfaces/Indirect/ConvFit.ui  |   6 +-
 .../Indirect/ConvFitDataPresenter.cpp         |   2 +-
 .../Indirect/ConvFitDataPresenter.h           |   2 +-
 .../Indirect/IIndirectFitDataView.h           |   6 +
 .../Indirect/IIndirectFitDataViewLegacy.h     |  69 +++++++
 .../Indirect/IndirectFitDataPresenter.cpp     |   6 +-
 .../Indirect/IndirectFitDataPresenter.h       |  10 +-
 .../Indirect/IndirectFitDataView.cpp          |  24 +++
 .../Indirect/IndirectFitDataView.h            |   4 +
 .../Indirect/IndirectFitDataView.ui           |  63 +++++++
 .../Indirect/IndirectFitDataViewLegacy.cpp    | 175 ++++++++++++++++++
 .../Indirect/IndirectFitDataViewLegacy.h      |  73 ++++++++
 .../Indirect/IndirectFitDataViewLegacy.ui     | 129 +++++++++++++
 qt/scientific_interfaces/Indirect/IqtFit.ui   |   6 +-
 qt/scientific_interfaces/Indirect/JumpFit.ui  |   6 +-
 .../Indirect/JumpFitDataPresenter.cpp         |   2 +-
 .../Indirect/JumpFitDataPresenter.h           |   2 +-
 qt/scientific_interfaces/Indirect/MSDFit.ui   |   6 +-
 .../Indirect/test/ConvFitDataPresenterTest.h  |   4 +-
 .../test/IndirectFitDataPresenterTest.h       |   4 +-
 .../Indirect/test/JumpFitDataPresenterTest.h  |   4 +-
 22 files changed, 577 insertions(+), 34 deletions(-)
 create mode 100644 qt/scientific_interfaces/Indirect/IIndirectFitDataViewLegacy.h
 create mode 100644 qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.cpp
 create mode 100644 qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h
 create mode 100644 qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.ui

diff --git a/qt/scientific_interfaces/Indirect/CMakeLists.txt b/qt/scientific_interfaces/Indirect/CMakeLists.txt
index 62dadf8d9fa..ba746e532d5 100644
--- a/qt/scientific_interfaces/Indirect/CMakeLists.txt
+++ b/qt/scientific_interfaces/Indirect/CMakeLists.txt
@@ -34,7 +34,7 @@ set(
   IndirectFitAnalysisTab.cpp
   IndirectFitData.cpp
   IndirectFitDataPresenter.cpp
-  IndirectFitDataView.cpp
+  IndirectFitDataViewLegacy.cpp
   IndirectFitOutput.cpp
   IndirectFitOutputOptionsModel.cpp
   IndirectFitOutputOptionsPresenter.cpp
@@ -124,7 +124,7 @@ set(
   Elwin.h
   FunctionTemplateBrowser.h
   IAddWorkspaceDialog.h
-  IIndirectFitDataView.h
+  IIndirectFitDataViewLegacy.h
   IIndirectFitOutputOptionsView.h
   IIndirectFitPlotView.h
   IIndirectSettingsView.h
@@ -142,7 +142,7 @@ set(
   IndirectEditResultsDialog.h
   IndirectFitAnalysisTab.h
   IndirectFitDataPresenter.h
-  IndirectFitDataView.h
+  IndirectFitDataViewLegacy.h
   IndirectFitOutputOptionsPresenter.h
   IndirectFitOutputOptionsView.h
   IndirectFitPlotPresenter.h
@@ -204,7 +204,7 @@ set(
   IndirectDataReduction.ui
   IndirectDiffractionReduction.ui
   IndirectEditResultsDialog.ui
-  IndirectFitDataView.ui
+  IndirectFitDataViewLegacy.ui
   IndirectFitOutputOptions.ui
   IndirectFitPreviewPlot.ui
   IndirectInterfaceSettings.ui
diff --git a/qt/scientific_interfaces/Indirect/ConvFit.ui b/qt/scientific_interfaces/Indirect/ConvFit.ui
index 77296309eb6..b8cfd5756f8 100644
--- a/qt/scientific_interfaces/Indirect/ConvFit.ui
+++ b/qt/scientific_interfaces/Indirect/ConvFit.ui
@@ -22,7 +22,7 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true">
+     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy" name="fitDataView" native="true">
       <property name="minimumSize">
        <size>
         <width>0</width>
@@ -168,9 +168,9 @@
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataView</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy</class>
    <extends>QWidget</extends>
-   <header>IndirectFitDataView.h</header>
+   <header>IndirectFitDataViewLegacy.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
diff --git a/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.cpp b/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.cpp
index 44f2a41be91..16780556b75 100644
--- a/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.cpp
@@ -24,7 +24,7 @@ namespace CustomInterfaces {
 namespace IDA {
 
 ConvFitDataPresenter::ConvFitDataPresenter(ConvFitModel *model,
-                                           IIndirectFitDataView *view)
+                                           IIndirectFitDataViewLegacy *view)
     : IndirectFitDataPresenter(model, view,
                                std::make_unique<ConvFitDataTablePresenter>(
                                    model, view->getDataTable())),
diff --git a/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.h b/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.h
index 9fa0fdc83f4..88a01babd34 100644
--- a/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.h
+++ b/qt/scientific_interfaces/Indirect/ConvFitDataPresenter.h
@@ -20,7 +20,7 @@ class MANTIDQT_INDIRECT_DLL ConvFitDataPresenter
     : public IndirectFitDataPresenter {
   Q_OBJECT
 public:
-  ConvFitDataPresenter(ConvFitModel *model, IIndirectFitDataView *view);
+  ConvFitDataPresenter(ConvFitModel *model, IIndirectFitDataViewLegacy *view);
 
 private slots:
   void setModelResolution(const QString &name);
diff --git a/qt/scientific_interfaces/Indirect/IIndirectFitDataView.h b/qt/scientific_interfaces/Indirect/IIndirectFitDataView.h
index 37227ced7e5..3f760c4570a 100644
--- a/qt/scientific_interfaces/Indirect/IIndirectFitDataView.h
+++ b/qt/scientific_interfaces/Indirect/IIndirectFitDataView.h
@@ -51,8 +51,12 @@ public:
   virtual void readSettings(QSettings const &settings) = 0;
   virtual UserInputValidator &validate(UserInputValidator &validator) = 0;
 
+  virtual void setXRange(std::pair<double, double> const &range) = 0;
+
 public slots:
   virtual void displayWarning(std::string const &warning) = 0;
+  virtual void setStartX(double) = 0;
+  virtual void setEndX(double) = 0;
 
 signals:
   void sampleLoaded(QString const & /*_t1*/);
@@ -61,6 +65,8 @@ signals:
   void removeClicked();
   void multipleDataViewSelected();
   void singleDataViewSelected();
+  void startXChanged(double);
+  void endXChanged(double);
 };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/qt/scientific_interfaces/Indirect/IIndirectFitDataViewLegacy.h b/qt/scientific_interfaces/Indirect/IIndirectFitDataViewLegacy.h
new file mode 100644
index 00000000000..72a976d39de
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IIndirectFitDataViewLegacy.h
@@ -0,0 +1,69 @@
+// Mantid Repository : https://github.com/mantidproject/mantid
+//
+// Copyright &copy; 2018 ISIS Rutherford Appleton Laboratory UKRI,
+//     NScD Oak Ridge National Laboratory, European Spallation Source
+//     & Institut Laue - Langevin
+// SPDX - License - Identifier: GPL - 3.0 +
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_IIndirectFitDataViewLegacy_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_IIndirectFitDataViewLegacy_H_
+
+#include "DllConfig.h"
+#include "MantidQtWidgets/Common/UserInputValidator.h"
+
+#include <QObject>
+#include <QTabWidget>
+#include <QTableWidget>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+class MANTIDQT_INDIRECT_DLL IIndirectFitDataViewLegacy : public QTabWidget {
+  Q_OBJECT
+
+public:
+  IIndirectFitDataViewLegacy(QWidget *parent = nullptr) : QTabWidget(parent){};
+  virtual ~IIndirectFitDataViewLegacy(){};
+
+  virtual QTableWidget *getDataTable() const = 0;
+  virtual bool isMultipleDataTabSelected() const = 0;
+  virtual bool isResolutionHidden() const = 0;
+  virtual void setResolutionHidden(bool hide) = 0;
+  virtual void disableMultipleDataTab() = 0;
+
+  virtual std::string getSelectedSample() const = 0;
+  virtual std::string getSelectedResolution() const = 0;
+
+  virtual QStringList getSampleWSSuffices() const = 0;
+  virtual QStringList getSampleFBSuffices() const = 0;
+  virtual QStringList getResolutionWSSuffices() const = 0;
+  virtual QStringList getResolutionFBSuffices() const = 0;
+
+  virtual void setSampleWSSuffices(QStringList const &suffices) = 0;
+  virtual void setSampleFBSuffices(QStringList const &suffices) = 0;
+  virtual void setResolutionWSSuffices(QStringList const &suffices) = 0;
+  virtual void setResolutionFBSuffices(QStringList const &suffices) = 0;
+
+  virtual bool isSampleWorkspaceSelectorVisible() const = 0;
+  virtual void
+  setSampleWorkspaceSelectorIndex(QString const &workspaceName) = 0;
+
+  virtual void readSettings(QSettings const &settings) = 0;
+  virtual UserInputValidator &validate(UserInputValidator &validator) = 0;
+
+public slots:
+  virtual void displayWarning(std::string const &warning) = 0;
+
+signals:
+  void sampleLoaded(QString const & /*_t1*/);
+  void resolutionLoaded(QString const & /*_t1*/);
+  void addClicked();
+  void removeClicked();
+  void multipleDataViewSelected();
+  void singleDataViewSelected();
+};
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
+
+#endif
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.cpp
index b07ecbab714..0c97cbc3d94 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.cpp
@@ -12,13 +12,13 @@ namespace CustomInterfaces {
 namespace IDA {
 
 IndirectFitDataPresenter::IndirectFitDataPresenter(IndirectFittingModel *model,
-                                                   IIndirectFitDataView *view)
+                                                   IIndirectFitDataViewLegacy *view)
     : IndirectFitDataPresenter(model, view,
                                std::make_unique<IndirectDataTablePresenter>(
                                    model, view->getDataTable())) {}
 
 IndirectFitDataPresenter::IndirectFitDataPresenter(
-    IndirectFittingModel *model, IIndirectFitDataView *view,
+    IndirectFittingModel *model, IIndirectFitDataViewLegacy *view,
     std::unique_ptr<IndirectDataTablePresenter> tablePresenter)
     : m_model(model), m_view(view),
       m_tablePresenter(std::move(tablePresenter)) {
@@ -64,7 +64,7 @@ IndirectFitDataPresenter::IndirectFitDataPresenter(
 
 IndirectFitDataPresenter::~IndirectFitDataPresenter() { observeReplace(false); }
 
-IIndirectFitDataView const *IndirectFitDataPresenter::getView() const {
+IIndirectFitDataViewLegacy const *IndirectFitDataPresenter::getView() const {
   return m_view;
 }
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.h b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.h
index 712d7f48207..67537d6379a 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenter.h
@@ -8,7 +8,7 @@
 #define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_
 
 #include "IAddWorkspaceDialog.h"
-#include "IIndirectFitDataView.h"
+#include "IIndirectFitDataViewLegacy.h"
 #include "IndirectDataTablePresenter.h"
 #include "IndirectFittingModel.h"
 
@@ -28,9 +28,9 @@ class MANTIDQT_INDIRECT_DLL IndirectFitDataPresenter
   Q_OBJECT
 public:
   IndirectFitDataPresenter(IndirectFittingModel *model,
-                           IIndirectFitDataView *view);
+                           IIndirectFitDataViewLegacy *view);
   IndirectFitDataPresenter(
-      IndirectFittingModel *model, IIndirectFitDataView *view,
+      IndirectFittingModel *model, IIndirectFitDataViewLegacy *view,
       std::unique_ptr<IndirectDataTablePresenter> tablePresenter);
   ~IndirectFitDataPresenter();
 
@@ -80,7 +80,7 @@ signals:
   void updateAvailableFitTypes();
 
 protected:
-  IIndirectFitDataView const *getView() const;
+  IIndirectFitDataViewLegacy const *getView() const;
   void addData(IAddWorkspaceDialog const *dialog);
   virtual void addDataToModel(IAddWorkspaceDialog const *dialog);
   void setSingleModelData(const std::string &name);
@@ -105,7 +105,7 @@ private:
   IndirectFittingModel *m_model;
   PrivateFittingData m_singleData;
   PrivateFittingData m_multipleData;
-  IIndirectFitDataView *m_view;
+  IIndirectFitDataViewLegacy *m_view;
   std::unique_ptr<IndirectDataTablePresenter> m_tablePresenter;
 };
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataView.cpp b/qt/scientific_interfaces/Indirect/IndirectFitDataView.cpp
index f601c73b0ff..0554304bb07 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataView.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataView.cpp
@@ -25,6 +25,8 @@ IndirectFitDataView::IndirectFitDataView(QWidget *parent)
   m_dataForm->setupUi(this);
   m_dataForm->dsResolution->hide();
   m_dataForm->lbResolution->hide();
+  m_dataForm->dsbStartX->setRange(-1e100, 1e100);
+  m_dataForm->dsbEndX->setRange(-1e100, 1e100);
 
   connect(m_dataForm->dsSample, SIGNAL(dataReady(const QString &)), this,
           SIGNAL(sampleLoaded(const QString &)));
@@ -33,6 +35,10 @@ IndirectFitDataView::IndirectFitDataView(QWidget *parent)
   connect(m_dataForm->pbAdd, SIGNAL(clicked()), this, SIGNAL(addClicked()));
   connect(m_dataForm->pbRemove, SIGNAL(clicked()), this,
           SIGNAL(removeClicked()));
+  connect(m_dataForm->dsbStartX, SIGNAL(valueChanged(double)), this,
+          SIGNAL(startXChanged(double)));
+  connect(m_dataForm->dsbEndX, SIGNAL(valueChanged(double)), this,
+          SIGNAL(endXChanged(double)));
 
   connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitViewSelected(int)));
 
@@ -110,6 +116,24 @@ void IndirectFitDataView::setSampleWorkspaceSelectorIndex(
   m_dataForm->dsSample->setSelectorIndex(1);
 }
 
+void IndirectFitDataView::setXRange(std::pair<double, double> const &range) {
+  m_dataForm->dsbStartX->setRange(range.first, range.second);
+  m_dataForm->dsbEndX->setRange(range.first, range.second);
+  auto const dx = fabs(range.second - range.first) / 10.0;
+  m_dataForm->dsbStartX->setSingleStep(dx);
+  m_dataForm->dsbEndX->setSingleStep(dx);
+  m_dataForm->dsbStartX->setValue(range.first);
+  m_dataForm->dsbEndX->setValue(range.second);
+}
+
+void IndirectFitDataView::setStartX(double value) {
+  m_dataForm->dsbStartX->setValue(value);
+}
+
+void IndirectFitDataView::setEndX(double value) {
+  m_dataForm->dsbEndX->setValue(value);
+}
+
 UserInputValidator &
 IndirectFitDataView::validate(UserInputValidator &validator) {
   if (currentIndex() == 0)
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataView.h b/qt/scientific_interfaces/Indirect/IndirectFitDataView.h
index 9b1bf89884a..22f297fed90 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataView.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataView.h
@@ -51,11 +51,15 @@ public:
   void readSettings(const QSettings &settings) override;
   UserInputValidator &validate(UserInputValidator &validator) override;
 
+  void setXRange(std::pair<double, double> const &range) override;
+
 public slots:
   void displayWarning(const std::string &warning) override;
 
 protected slots:
   void emitViewSelected(int index);
+  void setStartX(double) override;
+  void setEndX(double) override;
 
 private:
   UserInputValidator &validateMultipleData(UserInputValidator &validator);
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataView.ui b/qt/scientific_interfaces/Indirect/IndirectFitDataView.ui
index 882a1463e4d..cf4166c465f 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataView.ui
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataView.ui
@@ -74,6 +74,69 @@
       <property name="showLoad" stdset="0">
        <bool>false</bool>
       </property>
+    </widget>
+  </item>
+  <item row="2" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0,0,0">
+      <item>
+        <widget class="QDoubleSpinBox" name="dsbStartX">
+          <property name="minimumSize">
+            <size>
+              <width>100</width>
+              <height>0</height>
+            </size>
+          </property>
+          <property name="decimals">
+            <number>6</number>
+          </property>
+        </widget>
+      </item>
+      <item>
+        <widget class="QLabel" name="label_2">
+          <property name="text">
+            <string>End X</string>
+          </property>
+        </widget>
+      </item>
+      <item>
+        <widget class="QDoubleSpinBox" name="dsbEndX">
+          <property name="minimumSize">
+            <size>
+              <width>100</width>
+              <height>0</height>
+            </size>
+          </property>
+          <property name="decimals">
+            <number>6</number>
+          </property>
+          <property name="minimum">
+            <double>-1000000000.000000000000000</double>
+          </property>
+          <property name="maximum">
+            <double>1000000000.000000000000000</double>
+          </property>
+        </widget>
+      </item>
+      <item>
+        <spacer name="horizontalSpacer_2">
+          <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+            <size>
+              <width>40</width>
+              <height>20</height>
+            </size>
+          </property>
+        </spacer>
+      </item>
+    </layout>
+  </item>
+  <item row="2" column="0">
+    <widget class="QLabel" name="label">
+      <property name="text">
+        <string>Start X</string>
+      </property>
      </widget>
     </item>
    </layout>
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.cpp
new file mode 100644
index 00000000000..8f801ad3c36
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.cpp
@@ -0,0 +1,175 @@
+// Mantid Repository : https://github.com/mantidproject/mantid
+//
+// Copyright &copy; 2018 ISIS Rutherford Appleton Laboratory UKRI,
+//     NScD Oak Ridge National Laboratory, European Spallation Source
+//     & Institut Laue - Langevin
+// SPDX - License - Identifier: GPL - 3.0 +
+#include "IndirectFitDataViewLegacy.h"
+
+using namespace Mantid::API;
+
+namespace {
+
+bool isWorkspaceLoaded(std::string const &workspaceName) {
+  return AnalysisDataService::Instance().doesExist(workspaceName);
+}
+
+} // namespace
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+IndirectFitDataViewLegacy::IndirectFitDataViewLegacy(QWidget *parent)
+    : IIndirectFitDataViewLegacy(parent), m_dataForm(new Ui::IndirectFitDataForm) {
+  m_dataForm->setupUi(this);
+  m_dataForm->dsResolution->hide();
+  m_dataForm->lbResolution->hide();
+
+  connect(m_dataForm->dsSample, SIGNAL(dataReady(const QString &)), this,
+          SIGNAL(sampleLoaded(const QString &)));
+  connect(m_dataForm->dsResolution, SIGNAL(dataReady(const QString &)), this,
+          SIGNAL(resolutionLoaded(const QString &)));
+  connect(m_dataForm->pbAdd, SIGNAL(clicked()), this, SIGNAL(addClicked()));
+  connect(m_dataForm->pbRemove, SIGNAL(clicked()), this,
+          SIGNAL(removeClicked()));
+
+  connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitViewSelected(int)));
+
+  m_dataForm->dsSample->isOptional(true);
+  m_dataForm->dsResolution->isOptional(true);
+}
+
+QTableWidget *IndirectFitDataViewLegacy::getDataTable() const {
+  return m_dataForm->tbFitData;
+}
+
+bool IndirectFitDataViewLegacy::isMultipleDataTabSelected() const {
+  return currentIndex() == 1;
+}
+
+bool IndirectFitDataViewLegacy::isResolutionHidden() const {
+  return m_dataForm->dsResolution->isHidden();
+}
+
+std::string IndirectFitDataViewLegacy::getSelectedSample() const {
+  return m_dataForm->dsSample->getCurrentDataName().toStdString();
+}
+
+std::string IndirectFitDataViewLegacy::getSelectedResolution() const {
+  return m_dataForm->dsResolution->getCurrentDataName().toStdString();
+}
+
+void IndirectFitDataViewLegacy::readSettings(const QSettings &settings) {
+  const auto group = settings.group();
+  m_dataForm->dsSample->readSettings(group);
+  m_dataForm->dsResolution->readSettings(group);
+}
+
+void IndirectFitDataViewLegacy::disableMultipleDataTab() { setTabEnabled(1, false); }
+
+QStringList IndirectFitDataViewLegacy::getSampleWSSuffices() const {
+  return m_dataForm->dsSample->getWSSuffixes();
+}
+
+QStringList IndirectFitDataViewLegacy::getSampleFBSuffices() const {
+  return m_dataForm->dsSample->getFBSuffixes();
+}
+
+QStringList IndirectFitDataViewLegacy::getResolutionWSSuffices() const {
+  return m_dataForm->dsResolution->getWSSuffixes();
+}
+
+QStringList IndirectFitDataViewLegacy::getResolutionFBSuffices() const {
+  return m_dataForm->dsResolution->getFBSuffixes();
+}
+
+void IndirectFitDataViewLegacy::setSampleWSSuffices(const QStringList &suffices) {
+  m_dataForm->dsSample->setWSSuffixes(suffices);
+}
+
+void IndirectFitDataViewLegacy::setSampleFBSuffices(const QStringList &suffices) {
+  m_dataForm->dsSample->setFBSuffixes(suffices);
+}
+
+void IndirectFitDataViewLegacy::setResolutionWSSuffices(const QStringList &suffices) {
+  m_dataForm->dsResolution->setWSSuffixes(suffices);
+}
+
+void IndirectFitDataViewLegacy::setResolutionFBSuffices(const QStringList &suffices) {
+  m_dataForm->dsResolution->setFBSuffixes(suffices);
+}
+
+bool IndirectFitDataViewLegacy::isSampleWorkspaceSelectorVisible() const {
+  return m_dataForm->dsSample->isWorkspaceSelectorVisible();
+}
+
+void IndirectFitDataViewLegacy::setSampleWorkspaceSelectorIndex(
+    const QString &workspaceName) {
+  m_dataForm->dsSample->setWorkspaceSelectorIndex(workspaceName);
+  m_dataForm->dsSample->setSelectorIndex(1);
+}
+
+UserInputValidator &
+IndirectFitDataViewLegacy::validate(UserInputValidator &validator) {
+  if (currentIndex() == 0)
+    return validateSingleData(validator);
+  return validateMultipleData(validator);
+}
+
+UserInputValidator &
+IndirectFitDataViewLegacy::validateMultipleData(UserInputValidator &validator) {
+  if (m_dataForm->tbFitData->rowCount() == 0)
+    validator.addErrorMessage("No input data has been provided.");
+  return validator;
+}
+
+UserInputValidator &
+IndirectFitDataViewLegacy::validateSingleData(UserInputValidator &validator) {
+  validator = validateSample(validator);
+  if (!isResolutionHidden())
+    validator = validateResolution(validator);
+  return validator;
+}
+
+UserInputValidator &
+IndirectFitDataViewLegacy::validateSample(UserInputValidator &validator) {
+  const auto sampleIsLoaded = isWorkspaceLoaded(getSelectedSample());
+  validator.checkDataSelectorIsValid("Sample Input", m_dataForm->dsSample);
+
+  if (!sampleIsLoaded)
+    emit sampleLoaded(QString::fromStdString(getSelectedSample()));
+  return validator;
+}
+
+UserInputValidator &
+IndirectFitDataViewLegacy::validateResolution(UserInputValidator &validator) {
+  const auto resolutionIsLoaded = isWorkspaceLoaded(getSelectedResolution());
+  validator.checkDataSelectorIsValid("Resolution Input",
+                                     m_dataForm->dsResolution);
+
+  if (!resolutionIsLoaded)
+    emit resolutionLoaded(QString::fromStdString(getSelectedResolution()));
+  return validator;
+}
+
+void IndirectFitDataViewLegacy::displayWarning(const std::string &warning) {
+  QMessageBox::warning(parentWidget(), "MantidPlot - Warning",
+                       QString::fromStdString(warning));
+}
+
+void IndirectFitDataViewLegacy::setResolutionHidden(bool hide) {
+  m_dataForm->lbResolution->setHidden(hide);
+  m_dataForm->dsResolution->setHidden(hide);
+}
+
+void IndirectFitDataViewLegacy::emitViewSelected(int index) {
+  if (index == 0)
+    emit singleDataViewSelected();
+  else
+    emit multipleDataViewSelected();
+}
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h
new file mode 100644
index 00000000000..0906007c4ad
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h
@@ -0,0 +1,73 @@
+// Mantid Repository : https://github.com/mantidproject/mantid
+//
+// Copyright &copy; 2015 ISIS Rutherford Appleton Laboratory UKRI,
+//     NScD Oak Ridge National Laboratory, European Spallation Source
+//     & Institut Laue - Langevin
+// SPDX - License - Identifier: GPL - 3.0 +
+#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_
+#define MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_
+
+#include "ui_IndirectFitDataView.h"
+
+#include "IIndirectFitDataViewLegacy.h"
+
+#include "DllConfig.h"
+#include "MantidQtWidgets/Common/UserInputValidator.h"
+
+#include <QTabWidget>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+class MANTIDQT_INDIRECT_DLL IndirectFitDataViewLegacy : public IIndirectFitDataViewLegacy {
+  Q_OBJECT
+public:
+  IndirectFitDataViewLegacy(QWidget *parent = nullptr);
+  ~IndirectFitDataViewLegacy() override = default;
+
+  QTableWidget *getDataTable() const override;
+  virtual bool isMultipleDataTabSelected() const override;
+  bool isResolutionHidden() const override;
+  void setResolutionHidden(bool hide) override;
+  void disableMultipleDataTab() override;
+
+  virtual std::string getSelectedSample() const override;
+  std::string getSelectedResolution() const override;
+
+  virtual QStringList getSampleWSSuffices() const override;
+  virtual QStringList getSampleFBSuffices() const override;
+  QStringList getResolutionWSSuffices() const override;
+  QStringList getResolutionFBSuffices() const override;
+
+  virtual void setSampleWSSuffices(const QStringList &suffices) override;
+  virtual void setSampleFBSuffices(const QStringList &suffices) override;
+  virtual void setResolutionWSSuffices(const QStringList &suffices) override;
+  virtual void setResolutionFBSuffices(const QStringList &suffices) override;
+
+  bool isSampleWorkspaceSelectorVisible() const override;
+  void setSampleWorkspaceSelectorIndex(const QString &workspaceName) override;
+
+  void readSettings(const QSettings &settings) override;
+  UserInputValidator &validate(UserInputValidator &validator) override;
+
+public slots:
+  void displayWarning(const std::string &warning) override;
+
+protected slots:
+  void emitViewSelected(int index);
+
+private:
+  UserInputValidator &validateMultipleData(UserInputValidator &validator);
+  UserInputValidator &validateSingleData(UserInputValidator &validator);
+  UserInputValidator &validateSample(UserInputValidator &validator);
+  UserInputValidator &validateResolution(UserInputValidator &validator);
+
+  std::unique_ptr<Ui::IndirectFitDataForm> m_dataForm;
+};
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
+
+#endif /* MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_ */
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.ui b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.ui
new file mode 100644
index 00000000000..882a1463e4d
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IndirectFitDataForm</class>
+ <widget class="QTabWidget" name="IndirectFitDataForm">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>654</width>
+    <height>222</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>1</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>TabWidget</string>
+  </property>
+  <property name="tabPosition">
+   <enum>QTabWidget::North</enum>
+  </property>
+  <property name="tabShape">
+   <enum>QTabWidget::Rounded</enum>
+  </property>
+  <property name="currentIndex">
+   <number>0</number>
+  </property>
+  <property name="elideMode">
+   <enum>Qt::ElideLeft</enum>
+  </property>
+  <widget class="QWidget" name="loSingleInput">
+   <attribute name="title">
+    <string>Single Input</string>
+   </attribute>
+   <layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
+    <item row="0" column="0">
+     <widget class="QLabel" name="lbSample">
+      <property name="text">
+       <string>Sample</string>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="0">
+     <widget class="QLabel" name="lbResolution">
+      <property name="text">
+       <string>Resolution</string>
+      </property>
+     </widget>
+    </item>
+    <item row="0" column="1">
+     <widget class="MantidQt::MantidWidgets::DataSelector" name="dsSample" native="true">
+      <property name="autoLoad" stdset="0">
+       <bool>true</bool>
+      </property>
+      <property name="ShowGroups" stdset="0">
+       <bool>false</bool>
+      </property>
+      <property name="showLoad" stdset="0">
+       <bool>false</bool>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="1">
+     <widget class="MantidQt::MantidWidgets::DataSelector" name="dsResolution" native="true">
+      <property name="autoLoad" stdset="0">
+       <bool>true</bool>
+      </property>
+      <property name="ShowGroups" stdset="0">
+       <bool>false</bool>
+      </property>
+      <property name="showLoad" stdset="0">
+       <bool>false</bool>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWidget" name="tab">
+   <attribute name="title">
+    <string>Multiple Input</string>
+   </attribute>
+   <layout class="QHBoxLayout" name="horizontalLayout">
+    <item>
+     <widget class="QTableWidget" name="tbFitData">
+      <property name="minimumSize">
+       <size>
+        <width>0</width>
+        <height>0</height>
+       </size>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QVBoxLayout" name="loDataControl">
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QPushButton" name="pbAdd">
+        <property name="text">
+         <string>Add Workspace</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pbRemove">
+        <property name="text">
+         <string>Remove</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>MantidQt::MantidWidgets::DataSelector</class>
+   <extends>QWidget</extends>
+   <header>MantidQtWidgets/Common/DataSelector.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.ui b/qt/scientific_interfaces/Indirect/IqtFit.ui
index 5308e89f9b2..a7d87b987bd 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.ui
+++ b/qt/scientific_interfaces/Indirect/IqtFit.ui
@@ -22,7 +22,7 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true"/>
+     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy" name="fitDataView" native="true"/>
      <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
@@ -144,9 +144,9 @@
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataView</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy</class>
    <extends>QWidget</extends>
-   <header>IndirectFitDataView.h</header>
+   <header>IndirectFitDataViewLegacy.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
diff --git a/qt/scientific_interfaces/Indirect/JumpFit.ui b/qt/scientific_interfaces/Indirect/JumpFit.ui
index 9814347add8..f5800bb8f56 100644
--- a/qt/scientific_interfaces/Indirect/JumpFit.ui
+++ b/qt/scientific_interfaces/Indirect/JumpFit.ui
@@ -22,7 +22,7 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true"/>
+     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy" name="fitDataView" native="true"/>
      <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
@@ -234,9 +234,9 @@
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataView</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy</class>
    <extends>QWidget</extends>
-   <header>IndirectFitDataView.h</header>
+   <header>IndirectFitDataViewLegacy.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
diff --git a/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.cpp b/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.cpp
index 04c3b968f08..269701355c8 100644
--- a/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.cpp
@@ -14,7 +14,7 @@ namespace CustomInterfaces {
 namespace IDA {
 
 JumpFitDataPresenter::JumpFitDataPresenter(
-    JumpFitModel *model, IIndirectFitDataView *view, QComboBox *cbParameterType,
+    JumpFitModel *model, IIndirectFitDataViewLegacy *view, QComboBox *cbParameterType,
     QComboBox *cbParameter, QLabel *lbParameterType, QLabel *lbParameter)
     : IndirectFitDataPresenter(model, view,
                                std::make_unique<JumpFitDataTablePresenter>(
diff --git a/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.h b/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.h
index 575a25a3549..6e2f9f815c6 100644
--- a/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.h
+++ b/qt/scientific_interfaces/Indirect/JumpFitDataPresenter.h
@@ -22,7 +22,7 @@ class MANTIDQT_INDIRECT_DLL JumpFitDataPresenter
     : public IndirectFitDataPresenter {
   Q_OBJECT
 public:
-  JumpFitDataPresenter(JumpFitModel *model, IIndirectFitDataView *view,
+  JumpFitDataPresenter(JumpFitModel *model, IIndirectFitDataViewLegacy *view,
                        QComboBox *cbParameterType, QComboBox *cbParameter,
                        QLabel *lbParameterType, QLabel *lbParameter);
 
diff --git a/qt/scientific_interfaces/Indirect/MSDFit.ui b/qt/scientific_interfaces/Indirect/MSDFit.ui
index 82fd2707124..123fc549928 100644
--- a/qt/scientific_interfaces/Indirect/MSDFit.ui
+++ b/qt/scientific_interfaces/Indirect/MSDFit.ui
@@ -22,7 +22,7 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true"/>
+     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy" name="fitDataView" native="true"/>
      <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout">
        <property name="spacing">
@@ -141,9 +141,9 @@
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataView</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy</class>
    <extends>QWidget</extends>
-   <header>IndirectFitDataView.h</header>
+   <header>IndirectFitDataViewLegacy.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
diff --git a/qt/scientific_interfaces/Indirect/test/ConvFitDataPresenterTest.h b/qt/scientific_interfaces/Indirect/test/ConvFitDataPresenterTest.h
index d92853c805b..0a866737ffc 100644
--- a/qt/scientific_interfaces/Indirect/test/ConvFitDataPresenterTest.h
+++ b/qt/scientific_interfaces/Indirect/test/ConvFitDataPresenterTest.h
@@ -12,7 +12,7 @@
 
 #include "ConvFitDataPresenter.h"
 #include "ConvFitModel.h"
-#include "IIndirectFitDataView.h"
+#include "IIndirectFitDataViewLegacy.h"
 
 #include "MantidAPI/FrameworkManager.h"
 #include "MantidKernel/WarningSuppressions.h"
@@ -39,7 +39,7 @@ std::unique_ptr<QTableWidget> createEmptyTableWidget(int columns, int rows) {
 GNU_DIAG_OFF_SUGGEST_OVERRIDE
 
 /// Mock object to mock the view
-class MockConvFitDataView : public IIndirectFitDataView {
+class MockConvFitDataView : public IIndirectFitDataViewLegacy {
 public:
   /// Signals
   void emitResolutionLoaded(QString const &workspaceName) {
diff --git a/qt/scientific_interfaces/Indirect/test/IndirectFitDataPresenterTest.h b/qt/scientific_interfaces/Indirect/test/IndirectFitDataPresenterTest.h
index f79d284d58b..8131aafb64e 100644
--- a/qt/scientific_interfaces/Indirect/test/IndirectFitDataPresenterTest.h
+++ b/qt/scientific_interfaces/Indirect/test/IndirectFitDataPresenterTest.h
@@ -10,7 +10,7 @@
 #include <cxxtest/TestSuite.h>
 #include <gmock/gmock.h>
 
-#include "IIndirectFitDataView.h"
+#include "IIndirectFitDataViewLegacy.h"
 #include "IndirectDataTablePresenter.h"
 #include "IndirectFitDataPresenter.h"
 #include "IndirectFittingModel.h"
@@ -57,7 +57,7 @@ private:
 GNU_DIAG_OFF_SUGGEST_OVERRIDE
 
 /// Mock object to mock the view
-class MockIIndirectFitDataView : public IIndirectFitDataView {
+class MockIIndirectFitDataView : public IIndirectFitDataViewLegacy {
 public:
   /// Signals
   void emitSampleLoaded(QString const &name) { emit sampleLoaded(name); }
diff --git a/qt/scientific_interfaces/Indirect/test/JumpFitDataPresenterTest.h b/qt/scientific_interfaces/Indirect/test/JumpFitDataPresenterTest.h
index c0811bba37a..e721b7a12f0 100644
--- a/qt/scientific_interfaces/Indirect/test/JumpFitDataPresenterTest.h
+++ b/qt/scientific_interfaces/Indirect/test/JumpFitDataPresenterTest.h
@@ -10,7 +10,7 @@
 #include <cxxtest/TestSuite.h>
 #include <gmock/gmock.h>
 
-#include "IIndirectFitDataView.h"
+#include "IIndirectFitDataViewLegacy.h"
 #include "JumpFitDataPresenter.h"
 #include "JumpFitModel.h"
 
@@ -70,7 +70,7 @@ std::unique_ptr<QTableWidget> createEmptyTableWidget(int columns, int rows) {
 GNU_DIAG_OFF_SUGGEST_OVERRIDE
 
 /// Mock object to mock the view
-class MockJumpFitDataView : public IIndirectFitDataView {
+class MockJumpFitDataView : public IIndirectFitDataViewLegacy {
 public:
   /// Public Methods
   MOCK_CONST_METHOD0(getDataTable, QTableWidget *());
-- 
GitLab