diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/actionloader.py b/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/actionloader.py deleted file mode 100644 index 670cc3936b..0000000000 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/actionloader.py +++ /dev/null @@ -1,10 +0,0 @@ -class ActionLoader(object): - - @property - def importPath(self): - return 'scripter.ui_scripter.actions' - - def addComponents(self, components): - for action in components: - if action['parent']: - action['parent'].addAction(action['component']) diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/menuloader.py b/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/menuloader.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/widgetloader.py b/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/widgetloader.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/scripter.py b/plugins/extensions/pykrita/plugin/plugins/scripter/scripter.py index aad884f4e6..dd7a074cec 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/scripter.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/scripter.py @@ -1,22 +1,22 @@ from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from krita import * from scripter import uicontroller class ScripterViewExtension(ViewExtension): def __init__(self, parent): super().__init__(parent) - self.uicontroller = uicontroller.UIController(QDialog()) def setup(self): print("Scripter setup") action = Krita.instance().createAction("Scripter") action.triggered.connect(self.initialize) def initialize(self): + self.uicontroller = uicontroller.UIController(QDialog()) self.uicontroller.initialize(self) Krita.instance().addViewExtension(ScripterViewExtension(Krita.instance())) 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 index e69de29bb2..f2c3be7c21 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/__init__.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/__init__.py @@ -0,0 +1,3 @@ +action_classes = ['openaction.openaction.OpenAction', + 'runaction.runaction.RunAction', + 'settingsaction.settingsaction.SettingsAction'] diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/__init__.py similarity index 100% copy from plugins/extensions/pykrita/plugin/plugins/scripter/loaders/__init__.py copy to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/__init__.py 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 new file mode 100644 index 0000000000..31205ca44f --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/openaction/openaction.py @@ -0,0 +1,19 @@ +from PyQt5.QtWidgets import QAction + + +class OpenAction(QAction): + + def __init__(self, scripter, parent=None): + super(OpenAction, self).__init__(parent) + self.scripter = scripter + + self.triggered.connect(self.open) + + self.setText('Open') + + @property + def parent(self): + return 'File' + + def open(self): + print('opening file') diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/__init__.py similarity index 100% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/__init__.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/__init__.py diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/docwrapper.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/docwrapper.py similarity index 100% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/docwrapper.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/docwrapper.py diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py similarity index 89% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py index bf5dcf859e..ffc6c683f1 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py @@ -1,41 +1,42 @@ from PyQt5.QtWidgets import QAction, QMessageBox from PyQt5.QtGui import QIcon import sys -from ..editor import docwrapper +from . import docwrapper class RunAction(QAction): def __init__(self, scripter, parent=None): super(RunAction, self).__init__(parent) self.scripter = scripter self.editor = self.scripter.uicontroller.editor self.output = self.scripter.uicontroller.output self.triggered.connect(self.run) self.setText('Run') - self.setIcon(QIcon('/home/eliakincosta/Pictures/play.svg')) + # path to the icon + #self.setIcon(QIcon('/home/eliakincosta/Pictures/play.svg')) @property def parent(self): return 'toolBar' def run(self): stdout = sys.stdout stderr = sys.stderr output = docwrapper.DocWrapper(self.output.document()) output.write("======================================\n") sys.stdout = output sys.stderr = output script = self.editor.document().toPlainText() try: bc = compile(script, "", "exec") except Exception as e: QMessageBox.critical(self.editor, "Error compiling script", str(e)) return exec(bc) sys.stdout = stdout sys.stderr = stderr diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/loaders/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/__init__.py similarity index 100% rename from plugins/extensions/pykrita/plugin/plugins/scripter/loaders/__init__.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/__init__.py diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/fontscombobox.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/fontscombobox.py similarity index 100% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/fontscombobox.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/fontscombobox.py diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/settingsaction.py similarity index 94% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/settingsaction.py index 53d15523b5..3e73b506ba 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/settingsaction.py @@ -1,25 +1,25 @@ from PyQt5.QtWidgets import QAction from PyQt5.QtCore import Qt -from ..widgets import settingsdialog +from . import settingsdialog class SettingsAction(QAction): def __init__(self, scripter, parent=None): super(SettingsAction, self).__init__(parent) self.scripter = scripter self.triggered.connect(self.openSettings) self.setText('Settings') @property def parent(self): return 'File' def openSettings(self): self.settingsDialog = settingsdialog.SettingsDialog(self.scripter) self.settingsDialog.setWindowModality(Qt.WindowModal) self.settingsDialog.setFixedSize(400, 250) self.settingsDialog.show() self.settingsDialog.exec() diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/settingsdialog.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/settingsdialog.py similarity index 89% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/settingsdialog.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/settingsdialog.py index e5399a1b5e..2b6b8b1db5 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/settingsdialog.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/settingsdialog.py @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- from PyQt5.QtWidgets import * -from ..widgets import syntaxstylescombobox, fontscombobox +from . import syntaxstylescombobox, fontscombobox class SettingsDialog(QDialog): def __init__(self, scripter, parent=None): super(SettingsDialog, self).__init__(parent) self.scripter = scripter self.mainLayout = QFormLayout(self) self.mainLayout.addRow('Syntax Highlither', syntaxstylescombobox.SyntaxStylesComboBox(self.scripter.uicontroller.highlight)) self.mainLayout.addRow('Fonts', fontscombobox.FontsComboBox(self.scripter.uicontroller.editor)) diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/syntaxstylescombobox.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/syntaxstylescombobox.py similarity index 100% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/syntaxstylescombobox.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/settingsaction/syntaxstylescombobox.py diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/linenumberarea.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/linenumberarea.py similarity index 100% rename from plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/widgets/linenumberarea.py rename to plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/linenumberarea.py diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/pythoneditor.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/pythoneditor.py index c4ab1be690..621927017d 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/pythoneditor.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/editor/pythoneditor.py @@ -1,112 +1,112 @@ # -*- coding: utf-8 -*- from PyQt5.QtCore import * from PyQt5.QtWidgets import * -from scripter.ui_scripter.widgets import linenumberarea +from scripter.ui_scripter.editor import linenumberarea from PyQt5.QtGui import * class CodeEditor(QPlainTextEdit): def __init__(self, parent=None): super(CodeEditor, self).__init__(parent) self.setLineWrapMode(self.NoWrap) self.lineNumberArea = linenumberarea.LineNumberArea(self) self.blockCountChanged.connect(self.updateLineNumberAreaWidth) self.updateRequest.connect(self.updateLineNumberArea) self.cursorPositionChanged.connect(self.highlightCurrentLine) self.updateLineNumberAreaWidth() self.highlightCurrentLine() self.font = "Monospace" def lineNumberAreaWidth(self): """The lineNumberAreaWidth is the quatity of decimal places in blockCount""" digits = 1 max_ = max(1, self.blockCount()) while (max_ >= 10): max_ /= 10 digits += 1 space = 3 + self.fontMetrics().width('9') * digits return space def resizeEvent(self, event): super(CodeEditor, self).resizeEvent(event) qRect = self.contentsRect(); self.lineNumberArea.setGeometry(QRect(qRect.left(), qRect.top(), self.lineNumberAreaWidth(), qRect.height())); def updateLineNumberAreaWidth(self): self.setViewportMargins(self.lineNumberAreaWidth(), 0, 0, 0) def updateLineNumberArea(self, rect, dy): """ This slot is invoked when the editors viewport has been scrolled """ if dy: self.lineNumberArea.scroll(0, dy) else: self.lineNumberArea.update(0, rect.y(), self.lineNumberArea.width(), rect.height()) if rect.contains(self.viewport().rect()): self.updateLineNumberAreaWidth() def lineNumberAreaPaintEvent(self, event): """This method draws the current lineNumberArea for while""" painter = QPainter(self.lineNumberArea) painter.fillRect(event.rect(), QColor(Qt.lightGray).darker(300)) block = self.firstVisibleBlock() blockNumber = block.blockNumber() top = int(self.blockBoundingGeometry(block).translated(self.contentOffset()).top()) bottom = top + int(self.blockBoundingRect(block).height()) while block.isValid() and top <= event.rect().bottom(): if block.isVisible() and bottom >= event.rect().top(): number = str(blockNumber + 1) painter.setPen(QColor(Qt.lightGray)) painter.drawText(0, top, self.lineNumberArea.width(), self.fontMetrics().height(), Qt.AlignRight, number) block = block.next() top = bottom bottom = top + int(self.blockBoundingRect(block).height()) blockNumber += 1 def highlightCurrentLine(self): """Highlight current line under cursor""" currentSelection = QTextEdit.ExtraSelection() lineColor = QColor(Qt.gray).darker(250) currentSelection.format.setBackground(lineColor) currentSelection.format.setProperty(QTextFormat.FullWidthSelection, True) currentSelection.cursor = self.textCursor() currentSelection.cursor.clearSelection() self.setExtraSelections([currentSelection]) def wheelEvent(self, e): """When the CTRL is pressed during the wheelEvent, zoomIn and zoomOut slots are invoked""" if e.modifiers() == Qt.ControlModifier: delta = e.angleDelta().y() if delta < 0: self.zoomOut() elif delta > 0: self.zoomIn() else: super(CodeEditor, self).wheelEvent(e) @property def font(self): return self._font @font.setter def font(self, font): self._font = font self.setFont(QFont(font, 10)) diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py b/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py index f0c85cef7a..672e1f2f74 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/uicontroller.py @@ -1,81 +1,83 @@ from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from scripter.ui_scripter.syntax import syntax, syntaxstyles -from scripter.ui_scripter import actions from scripter.ui_scripter.editor import pythoneditor -from scripter.loaders import actionloader, menuloader, widgetloader import os import importlib -import inspect + class UIController(object): + def __init__(self, mainWidget): self.mainWidget = mainWidget self.actionToolbar = QToolBar('toolBar', self.mainWidget) self.menu_bar = QMenuBar(self.mainWidget) self.actionToolbar.setObjectName('toolBar') self.menu_bar.setObjectName('menuBar') - self.components = [] + self.actions = [] self.mainWidget.setWindowModality(Qt.NonModal) self.editor = pythoneditor.CodeEditor() self.output = QPlainTextEdit() self.highlight = syntax.PythonHighlighter(self.editor.document(), syntaxstyles.DefaultSyntaxStyle()) def initialize(self, scripter): self.scripter = scripter self.loadMenus() - self.loadComponents(actionloader.ActionLoader()) + self.loadActions() vbox = QVBoxLayout(self.mainWidget) vbox.addWidget(self.menu_bar) vbox.addWidget(self.editor) vbox.addWidget(self.actionToolbar) vbox.addWidget(self.output) self.mainWidget.resize(400, 500) self.mainWidget.setWindowTitle("Scripter") self.mainWidget.setSizeGripEnabled(True) self.mainWidget.show() self.mainWidget.activateWindow() def loadMenus(self): self.addMenu('File', 'File') self.addMenu('Edit', 'Edit') def addMenu(self, menuName, parentName): parent = self.menu_bar.findChild(QObject, parentName) self.newMenu = None if parent: self.newMenu = parent.addMenu(menuName) else: self.newMenu = self.menu_bar.addMenu(menuName) self.newMenu.setObjectName(menuName) return self.newMenu - def loadComponents(self, loader): - component_module = importlib.import_module(loader.importPath) + def loadActions(self): + module_path = 'scripter.ui_scripter.actions' + actions_module = importlib.import_module(module_path) + print(actions_module) + modules = [] - modules = [loader.importPath + '.' + str(module).split('.')[0] - for module in os.listdir(component_module.__path__[0]) - if module.endswith('.py') and (not '__init__' in module)] + for class_path in actions_module.action_classes: + _module, _klass = class_path.rsplit('.', maxsplit=1) + print(_module, _klass) + modules.append(dict(module='{0}.{1}'.format(module_path, _module), + klass=_klass)) for module in modules: - m = importlib.import_module(module) - clsmembers = [klass for klass in inspect.getmembers(m, inspect.isclass) if klass[1].__module__ == module] - print(self.mainWidget.children()) - for klass in clsmembers: - obj = klass[1](self.scripter) - parent = self.mainWidget.findChild(QObject, obj.parent) - print('parent:', parent) - self.components.append(dict(component=obj, parent=parent)) - - loader.addComponents(self.components) + m = importlib.import_module(module['module']) + action_class = getattr(m, module['klass']) + obj = action_class(self.scripter) + parent = self.mainWidget.findChild(QObject, obj.parent) + self.actions.append(dict(action=obj, parent=parent)) + + for action in self.actions: + action['parent'].addAction(action['action'])