diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/document_scripter/document.py b/plugins/extensions/pykrita/plugin/plugins/scripter/document_scripter/document.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/document_scripter/document.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/document_scripter/document.py @@ -20,5 +20,29 @@ _file.close() + def save(self): + with open(self._filePath, 'w') as pythonFile: + for line in self._document: + print(line, file=pythonFile) + + def compare(self, new_doc): + if len(self._document) != len(new_doc): + return False + + for line in range(len(new_doc)): + if new_doc[line] != self._document[line]: + return False + + return True + + @property def data(self): return self._document + + @data.setter + def data(self, data): + self._document = data + + @property + def filePath(self): + return self._filePath diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/documentcontroller.py b/plugins/extensions/pykrita/plugin/plugins/scripter/documentcontroller.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/documentcontroller.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/documentcontroller.py @@ -16,3 +16,18 @@ newDocument.open() self._activeDocument = newDocument return newDocument + + def saveDocument(self, data, filePath): + if not self._activeDocument: + self._activeDocument = document.Document(filePath) + + dataList = str(data).splitlines() + + if not self._activeDocument.compare(dataList): + self._activeDocument.data = dataList + self._activeDocument.save() + + return self._activeDocument + + def clearActiveDocument(self): + self._activeDocument = None diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/__init__.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/__init__.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/__init__.py @@ -1,3 +1,5 @@ -action_classes = ['openaction.openaction.OpenAction', +action_classes = ['newaction.newaction.NewAction', + 'openaction.openaction.OpenAction', + 'saveaction.saveaction.SaveAction', 'runaction.runaction.RunAction', 'settingsaction.settingsaction.SettingsAction'] diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/newaction/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/newaction/__init__.py new file mode 100644 diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/newaction/newaction.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/newaction/newaction.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/newaction/newaction.py @@ -0,0 +1,36 @@ +from PyQt5.QtWidgets import QAction, QMessageBox + + +class NewAction(QAction): + + def __init__(self, scripter, parent=None): + super(NewAction, self).__init__(parent) + self.scripter = scripter + + self.triggered.connect(self.new) + + self.setText('New') + self.setObjectName('new') + + @property + def parent(self): + return 'File' + + def new(self): + msgBox = QMessageBox(self.scripter.uicontroller.mainWidget) + + msgBox.setText("The document has been modified."); + msgBox.setInformativeText("Do you want to save your changes?"); + msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel); + msgBox.setDefaultButton(QMessageBox.Save); + + ret = msgBox.exec(); + + if ret == QMessageBox.Cancel: + return + if ret == QMessageBox.Save: + self.scripter.uicontroller.invokeAction('save') + + self.scripter.documentcontroller.clearActiveDocument() + self.scripter.uicontroller.setStatusBar() + self.scripter.uicontroller.clearEditor() diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/openaction.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/openaction.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/openaction.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/openaction.py @@ -1,5 +1,6 @@ from PyQt5.QtWidgets import QAction, QFileDialog, QMessageBox + class OpenAction(QAction): def __init__(self, scripter, parent=None): @@ -9,6 +10,7 @@ self.triggered.connect(self.open) self.setText('Open') + self.setObjectName('open') @property def parent(self): @@ -26,6 +28,7 @@ if fileExtension=='py': document = self.scripter.documentcontroller.openDocument(selectedFile) self.scripter.uicontroller.setDocumentEditor(document) + self.scripter.uicontroller.setStatusBar(document.filePath) except: QMessageBox.information(self.scripter.uicontroller.mainWidget, diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/saveaction/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/saveaction/__init__.py new file mode 100644 diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/saveaction/saveaction.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/saveaction/saveaction.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/saveaction/saveaction.py @@ -0,0 +1,38 @@ +from PyQt5.QtWidgets import QAction, QFileDialog + +class SaveAction(QAction): + + def __init__(self, scripter, parent=None): + super(SaveAction, self).__init__(parent) + self.scripter = scripter + self.editor = self.scripter.uicontroller.editor + + self.triggered.connect(self.save) + + self.setText('Save') + self.setObjectName('save') + + @property + def parent(self): + return 'File' + + def save(self): + text = self.editor.toPlainText() + fileName = '' + + if not self.scripter.documentcontroller.activeDocument: + fileName = QFileDialog.getSaveFileName(self.scripter.uicontroller.mainWidget, + 'Save Python File', '', + 'Python File (*.py)')[0] + if not fileName: + return + + fileExtension = fileName.rsplit('.', maxsplit=1)[1] + if not fileExtension=='py': + return + + document = self.scripter.documentcontroller.saveDocument(text, fileName) + if document: + self.scripter.uicontroller.setStatusBar(document.filePath) + else: + self.scripter.uicontroller.setStatusBar('untitled') diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/linenumberarea.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/linenumberarea.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/linenumberarea.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/linenumberarea.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- - - from PyQt5.QtWidgets import * from PyQt5.QtCore import * diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/statusbar.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/statusbar.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/statusbar.py @@ -0,0 +1,16 @@ +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * + + +class StatusBar(QWidget): + + def __init__(self, editor): + super(StatusBar, self).__init__(editor) + self.codeEditor = editor + + def sizeHint(self): + return QSize(self.codeEditor.width(), 0) + + def paintEvent(self, event): + """It Invokes the draw method(statusBarPaintEvent) in CodeEditor""" + self.codeEditor.statusBarPaintEvent(event) diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py b/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py @@ -22,6 +22,7 @@ self.mainWidget.setWindowModality(Qt.NonModal) self.editor = pythoneditor.CodeEditor() self.output = QPlainTextEdit() + self.statusBar = QLabel('untitled') self.highlight = syntax.PythonHighlighter(self.editor.document(), syntaxstyles.DefaultSyntaxStyle()) def initialize(self, scripter): @@ -35,6 +36,7 @@ vbox.addWidget(self.editor) vbox.addWidget(self.actionToolbar) vbox.addWidget(self.output) + vbox.addWidget(self.statusBar) self.mainWidget.resize(400, 500) self.mainWidget.setWindowTitle("Scripter") @@ -80,8 +82,21 @@ for action in self.actions: action['parent'].addAction(action['action']) + def invokeAction(self, actionName): + for action in self.actions: + if action['action'].objectName() == actionName: + method = getattr(action['action'], actionName) + if method: + return method() + def setDocumentEditor(self, document): self.editor.clear() - for line in document.data(): + for line in document.data: self.editor.appendPlainText(line) + + def setStatusBar(self, value='untitled'): + self.statusBar.setText(value) + + def clearEditor(self): + self.editor.clear()