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