From 53b8eaf83ee99acf1c18fe8195714ca09d99bbfc Mon Sep 17 00:00:00 2001
From: Martyn Gigg <martyn.gigg@gmail.com>
Date: Fri, 5 Jan 2018 16:07:24 +0000
Subject: [PATCH] Basic MultiFileEditor widget.

Refs #21251
---
 qt/python/mantidqt/widgets/codeeditor.py      | 29 +++++++++++++++++++
 .../mantidqt/widgets/src/_widgetscore.sip     |  9 +++++-
 .../mantidqt/widgets/test/test_codeeditor.py  | 23 ++++++++++++++-
 3 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/qt/python/mantidqt/widgets/codeeditor.py b/qt/python/mantidqt/widgets/codeeditor.py
index 988c2d207f1..f33dcc2d650 100644
--- a/qt/python/mantidqt/widgets/codeeditor.py
+++ b/qt/python/mantidqt/widgets/codeeditor.py
@@ -16,7 +16,36 @@
 #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 from __future__ import (absolute_import)
 
+# 3rd party imports
+from qtpy.QtWidgets import QTabWidget, QVBoxLayout, QWidget
+
 from mantidqt.utils.qt import import_qtlib
 
+EDITOR_LANGUAGE = "Python"
 
+# Import single-file editor from C++ wrapping
 CodeEditor = import_qtlib('_widgetscore', 'mantidqt.widgets', 'ScriptEditor')
+
+class MultiFileCodeEditor(QWidget):
+    """Provides a tabbed widget for editing multiple files"""
+
+    def __init__(self, parent):
+        super(MultiFileCodeEditor, self).__init__(parent)
+
+        # layout
+        self.editors = QTabWidget(self)
+        self.editors.setMovable(True)
+        layout = QVBoxLayout()
+        layout.addWidget(self.editors)
+        self.setLayout(layout)
+
+        # add a single editor by default
+        self.append_new_editor()
+
+    def append_new_editor(self):
+        title = "New"
+        self.editors.addTab(CodeEditor(EDITOR_LANGUAGE, self.editors), title)
+
+    @property
+    def editor_count(self):
+        return self.editors.count()
\ No newline at end of file
diff --git a/qt/python/mantidqt/widgets/src/_widgetscore.sip b/qt/python/mantidqt/widgets/src/_widgetscore.sip
index 72d08195d57..e2a1af5271d 100644
--- a/qt/python/mantidqt/widgets/src/_widgetscore.sip
+++ b/qt/python/mantidqt/widgets/src/_widgetscore.sip
@@ -55,7 +55,7 @@ public:
   void attachLoggingChannel();
 };
 
-class ScriptEditor {
+class ScriptEditor : QWidget {
 %TypeHeaderCode
 #include "MantidQtWidgets/Common/ScriptEditor.h"
 %End
@@ -63,6 +63,13 @@ class ScriptEditor {
 public:
   ScriptEditor(const QString & language,
                QWidget *parent /TransferThis/ = 0) throw(std::invalid_argument);
+
+  QString fileName() const;
+  bool isReadOnly() const;
+
+  void setFileName(const QString &filename);
+  void setReadOnly(bool ro);
+
 private:
   ScriptEditor(const ScriptEditor&);
 };
diff --git a/qt/python/mantidqt/widgets/test/test_codeeditor.py b/qt/python/mantidqt/widgets/test/test_codeeditor.py
index c1256334438..7967b0e4f95 100644
--- a/qt/python/mantidqt/widgets/test/test_codeeditor.py
+++ b/qt/python/mantidqt/widgets/test/test_codeeditor.py
@@ -25,6 +25,8 @@ import unittest
 from mantidqt.widgets.codeeditor import CodeEditor
 from mantidqt.utils.qt.testing import requires_qapp
 
+TEST_LANG = "Python"
+
 
 @requires_qapp
 class CodeEditorTest(unittest.TestCase):
@@ -32,7 +34,26 @@ class CodeEditorTest(unittest.TestCase):
     # Success tests
 
     def test_construction_accepts_Python_as_language(self):
-        widget = CodeEditor("Python")
+        widget = CodeEditor(TEST_LANG)
+
+    def test_default_construction_yields_empty_filename(self):
+        widget = CodeEditor(TEST_LANG)
+        self.assertEqual("", widget.fileName())
+
+    def test_set_filename_returns_expected_string(self):
+        widget = CodeEditor(TEST_LANG)
+        test_filename = "myscript.py"
+        widget.setFileName(test_filename)
+        self.assertEqual(test_filename, widget.fileName())
+
+    def test_default_construction_yields_editable_widget(self):
+        widget = CodeEditor(TEST_LANG)
+        self.assertFalse(widget.isReadOnly())
+
+    def test_setReadOnly_to_true_sets_readonly_status(self):
+        widget = CodeEditor(TEST_LANG)
+        widget.setReadOnly(True)
+        self.assertTrue(widget.isReadOnly())
 
     # Failure tests
 
-- 
GitLab