diff --git a/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt b/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt --- a/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt +++ b/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt @@ -81,14 +81,15 @@ install_pykrita_plugin(exportlayers) #install_pykrita_plugin(highpass) install_pykrita_plugin(tenbrushes) +install_pykrita_plugin(tenscripts) install( FILES tenbrushes/tenbrushes.action + tenscripts/tenscripts.action DESTINATION ${DATA_INSTALL_DIR}/krita/actions) install_pykrita_plugin(palette_docker) install_pykrita_plugin(quick_settings_docker) install_pykrita_plugin(lastdocumentsdocker) -install_pykrita_plugin(scriptdocker) # if(PYTHON_VERSION_MAJOR VERSION_EQUAL 3) # install_pykrita_plugin(cmake_utils) diff --git a/plugins/extensions/pykrita/plugin/plugins/scriptdocker/__init__.py b/plugins/extensions/pykrita/plugin/plugins/scriptdocker/__init__.py deleted file mode 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scriptdocker/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ - # let's make a module -from .scriptdocker import * diff --git a/plugins/extensions/pykrita/plugin/plugins/scriptdocker/kritapykrita_scriptdocker.desktop b/plugins/extensions/pykrita/plugin/plugins/scriptdocker/kritapykrita_scriptdocker.desktop deleted file mode 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scriptdocker/kritapykrita_scriptdocker.desktop +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Type=Service -ServiceTypes=Krita/PythonPlugin -X-KDE-Library=scriptdocker -X-Python-2-Compatible=false -Name=Script Docker -Comment=A Python-based docker for create actions and point to Python scripts diff --git a/plugins/extensions/pykrita/plugin/plugins/scriptdocker/scriptdocker.py b/plugins/extensions/pykrita/plugin/plugins/scriptdocker/scriptdocker.py deleted file mode 100644 --- a/plugins/extensions/pykrita/plugin/plugins/scriptdocker/scriptdocker.py +++ /dev/null @@ -1,55 +0,0 @@ -from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QListView, QFormLayout, - QHBoxLayout, QPushButton, QLineEdit, QListWidget) -from PyQt5.QtCore import QObject -import krita - - -class ScriptDocker(krita.DockWidget): - - def __init__(self): - super(ScriptDocker, self).__init__() - - self.baseWidget = QWidget() - self.layout = QVBoxLayout() - self.scriptsLayout = QFormLayout() - self.addButton = QPushButton("Add Script") - self.actions = [] - - self.layout.addLayout(self.scriptsLayout) - self.layout.addWidget(self.addButton) - self.baseWidget.setLayout(self.layout) - self.setWidget(self.baseWidget) - - self.setWindowTitle("Script Docker") - self.addButton.clicked.connect(self.addNewRow) - - def canvasChanged(self, canvas): - pass - - def addNewRow(self): - directorySelectorLayout = QHBoxLayout() - directoryTextField = QLineEdit() - directoryDialogButton = QPushButton("...") - - directoryDialogButton.clicked.connect(self.test) - - directorySelectorLayout.addWidget(directoryTextField) - directorySelectorLayout.addWidget(directoryDialogButton) - - self.scriptsLayout.addRow("Script {0}".format(self.scriptsLayout.rowCount() + 1), directorySelectorLayout) - - def test(self): - obj = self.sender() - print('button', obj) - - def loadActions(self): - pass - - def readSettings(self): - pass - - def writeSettings(self): - pass - - -Application.addDockWidgetFactory(krita.DockWidgetFactory("scriptdocker", krita.DockWidgetFactoryBase.DockRight, ScriptDocker)) diff --git a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py --- a/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py +++ b/plugins/extensions/pykrita/plugin/plugins/scripter/ui_scripter/actions/runaction/runaction.py @@ -46,6 +46,7 @@ sys.stderr = output script = self.editor.document().toPlainText() document = self.scripter.documentcontroller.activeDocument + try: if document: spec = importlib.util.spec_from_file_location("users_script", document.filePath) @@ -62,5 +63,5 @@ sys.stderr = stderr # scroll to bottom of output - max = self.output.verticalScrollBar().maximum() - self.output.verticalScrollBar().setValue(max) + bottom = self.output.verticalScrollBar().maximum() + self.output.verticalScrollBar().setValue(bottom) diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/__init__.py b/plugins/extensions/pykrita/plugin/plugins/tenscripts/__init__.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/__init__.py @@ -0,0 +1,2 @@ + # let's make a module +from .tenscripts import * diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/kritapykrita_tenscripts.desktop b/plugins/extensions/pykrita/plugin/plugins/tenscripts/kritapykrita_tenscripts.desktop new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/kritapykrita_tenscripts.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Service +ServiceTypes=Krita/PythonPlugin +X-KDE-Library=tenscripts +X-Python-2-Compatible=false +Name=Ten Scripts +Comment=A Python-based plugin for create ten actions and assign then to Python scripts diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.action b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.action new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.action @@ -0,0 +1,126 @@ + + + + Ten Scripts + + + Execute Script 1 + + + + 10000 + 0 + ctrl+shift+1 + false + + + + + Execute Script 2 + + + + 10000 + 0 + ctrl+shift+2 + false + + + + + Execute Script 3 + + + + 10000 + 0 + ctrl+shift+3 + false + + + + + Execute Script 4 + + + + 10000 + 0 + ctrl+shift+4 + false + + + + + Execute Script 5 + + + + 10000 + 0 + ctrl+shift+5 + false + + + + + Execute Script 6 + + + + 10000 + 0 + ctrl+shift+6 + false + + + + + Execute Script 7 + + + + 10000 + 0 + ctrl+shift+7 + false + + + + + Execute Script 8 + + + + 10000 + 0 + ctrl+shift+8 + false + + + + + Execute Script 9 + + + + 10000 + 0 + ctrl+shift+9 + false + + + + + Execute Script 10 + + + + 10000 + 0 + ctrl+shift+0 + false + + + + diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py @@ -0,0 +1,73 @@ +from PyQt5.QtWidgets import QMessageBox +import krita +from tenscripts import uitenscripts +import importlib + + +class TenScriptsExtension(krita.Extension): + + def __init__(self, parent): + super(TenScriptsExtension, self).__init__(parent) + + self.actions = [] + self.scripts = [] + + def setup(self): + action = Application.createAction("ten_scripts", "Ten Scripts") + action.setToolTip("Assign ten scripts to ten shortcuts.") + action.triggered.connect(self.initialize) + + self.readSettings() + self.loadActions() + + def initialize(self): + self.uitenscripts = uitenscripts.UITenScripts() + self.uitenscripts.initialize(self) + + def readSettings(self): + self.scripts = Application.readSetting("tenscripts", "scripts", "").split(',') + + def writeSettings(self): + saved_scripts = self.uitenscripts.saved_scripts() + + for index, script in enumerate(saved_scripts): + self.actions[index].script = script + + Application.writeSetting("tenscripts", "scripts", ','.join(map(str, saved_scripts))) + + def loadActions(self): + for index, item in enumerate(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']): + action = Application.createAction("execute_script_" + item, "Execute Script " + item) + action.script = None + action.setMenu("None") + action.triggered.connect(self._executeScript) + + if index < len(self.scripts): + action.script = self.scripts[index] + + self.actions.append(action) + + def _executeScript(self): + script = self.sender().script + if script: + try: + spec = importlib.util.spec_from_file_location("users_script", script) + users_module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(users_module) + + if hasattr(users_module, 'main') and callable(users_module.main): + users_module.main() + + self.showMessage('script {0} executed'.format(self.sender().script)) + except Exception as e: + self.showMessage(str(e)) + else: + self.showMessage("You don't assign a script to that action") + + def showMessage(self, message): + self.msgBox = QMessageBox(Application.activeWindow().qwindow()) + self.msgBox.setText(message) + self.msgBox.exec_() + + +Scripter.addExtension(TenScriptsExtension(Application)) diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py @@ -0,0 +1,17 @@ +from PyQt5.QtWidgets import QDialog + + +class TenScriptsDialog(QDialog): + + def __init__(self, uitenscripts, parent=None): + super(TenScriptsDialog, self).__init__(parent) + + self.uitenscripts = uitenscripts + + def accept(self): + self.uitenscripts.tenscripts.writeSettings() + + super(TenScriptsDialog, self).accept() + + def closeEvent(self, event): + event.accept() diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/uitenscripts.py b/plugins/extensions/pykrita/plugin/plugins/tenscripts/uitenscripts.py new file mode 100644 --- /dev/null +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/uitenscripts.py @@ -0,0 +1,98 @@ +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton, + QLineEdit, QScrollArea, QGridLayout, QFileDialog, + QLabel, QDialogButtonBox) +from tenscripts import tenscriptsdialog +import krita + + +class UITenScripts(object): + + def __init__(self): + self.kritaInstance = krita.Krita.instance() + self.mainDialog = tenscriptsdialog.TenScriptsDialog(self, self.kritaInstance.activeWindow().qwindow()) + + self.buttonBox = QDialogButtonBox(self.mainDialog) + self.layout = QVBoxLayout(self.mainDialog) + self.baseWidget = QWidget() + self.baseArea = QWidget() + self.scrollArea = QScrollArea() + self.scriptsLayout = QGridLayout() + + self.buttonBox.accepted.connect(self.mainDialog.accept) + self.buttonBox.rejected.connect(self.mainDialog.reject) + + self.buttonBox.setOrientation(Qt.Horizontal) + self.buttonBox.setStandardButtons(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.scrollArea.setWidgetResizable(True) + + def initialize(self, tenscripts): + self.tenscripts = tenscripts + + self._loadGridLayout() + self._fillScripts() + + self.baseArea.setLayout(self.scriptsLayout) + self.scrollArea.setWidget(self.baseArea) + + self.layout.addWidget(self.scrollArea) + self.layout.addWidget(self.buttonBox) + + self.mainDialog.show() + self.mainDialog.activateWindow() + self.mainDialog.exec_() + + def addNewRow(self, key): + rowPosition = self.scriptsLayout.rowCount() + rowLayout = QHBoxLayout() + label = QLabel() + directoryTextField = QLineEdit() + directoryDialogButton = QPushButton("...") + + directoryTextField.setReadOnly(True) + label.setText("Ctrl+Shift+{0}".format(key)) + directoryTextField.setToolTip("Selected Path") + directoryDialogButton.setToolTip("Select the script") + directoryDialogButton.clicked.connect(self._selectScript) + + self.scriptsLayout.addWidget(label, rowPosition, 0, Qt.AlignLeft|Qt.AlignTop) + self.scriptsLayout.addWidget(directoryTextField, rowPosition, 1, Qt.AlignLeft|Qt.AlignTop) + self.scriptsLayout.addWidget(directoryDialogButton, rowPosition, 2, Qt.AlignLeft|Qt.AlignTop) + + def saved_scripts(self): + _saved_scripts = [] + index = 0 + + for row in range(self.scriptsLayout.rowCount()-1): + textField = self.scriptsLayout.itemAt(index + 1).widget() + if textField.text(): + _saved_scripts.append(textField.text()) + index += 3 + + return _saved_scripts + + def _selectScript(self): + dialog = QFileDialog(self.mainDialog) + dialog.setNameFilter('Python files (*.py)') + + if dialog.exec(): + selectedFile = dialog.selectedFiles()[0] + obj = self.mainDialog.sender() + textField = self.scriptsLayout.itemAt(self.scriptsLayout.indexOf(obj)-1).widget() + textField.setText(selectedFile) + + def _loadGridLayout(self): + for item in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']: + self.addNewRow(item) + + def _fillScripts(self): + scripts = self.tenscripts.scripts + index = 0 + + for row in range(self.scriptsLayout.rowCount()-1): + if row >= len(scripts): + return + + textField = self.scriptsLayout.itemAt(index + 1).widget() + textField.setText(scripts[row]) + index += 3