diff --git a/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt b/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt index 9a73026581..32add6472a 100644 --- a/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt +++ b/plugins/extensions/pykrita/plugin/plugins/CMakeLists.txt @@ -1,105 +1,106 @@ # Copyright (C) 2012, 2013 Shaheed Haque # Copyright (C) 2013 Alex Turbov # Copyright (C) 2014-2016 Boudewijn Rempt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. include(CMakeParseArguments) # # Simple helper function to install plugin and related files # having only a name of the plugin... # (just to reduce syntactic noise when a lot of plugins get installed) # function(install_pykrita_plugin name) set(_options) set(_one_value_args) set(_multi_value_args PATTERNS FILE) cmake_parse_arguments(install_pykrita_plugin "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN}) if(NOT name) message(FATAL_ERROR "Plugin filename is not given") endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py) install(FILES kritapykrita_${name}.desktop DESTINATION ${DATA_INSTALL_DIR}/krita/pykrita) foreach(_f ${name}.py ${name}.ui ${install_pykrita_plugin_FILE}) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_f}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${_f} DESTINATION ${DATA_INSTALL_DIR}/krita/pykrita) endif() endforeach() elseif(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${name}) install(FILES ${name}/kritapykrita_${name}.desktop DESTINATION ${DATA_INSTALL_DIR}/krita/pykrita) install( DIRECTORY ${name} DESTINATION ${DATA_INSTALL_DIR}/krita/pykrita FILES_MATCHING PATTERN "*.py" PATTERN "*.ui" PATTERN "__pycache__*" EXCLUDE ) # TODO Is there any way to form a long PATTERN options string # and use it in a single install() call? # NOTE Install specified patterns one-by-one... foreach(_pattern ${install_pykrita_plugin_PATTERNS}) install( DIRECTORY ${name} DESTINATION ${DATA_INSTALL_DIR}/krita/pykrita FILES_MATCHING PATTERN "${_pattern}" PATTERN "__pycache__*" EXCLUDE ) endforeach() else() message(FATAL_ERROR "Do not know what to do with ${name}") endif() endfunction() install_pykrita_plugin(hello) install_pykrita_plugin(assignprofiledialog) install_pykrita_plugin(scripter) install_pykrita_plugin(colorspace) install_pykrita_plugin(documenttools) install_pykrita_plugin(filtermanager) install_pykrita_plugin(exportlayers) #install_pykrita_plugin(highpass) install_pykrita_plugin(tenbrushes) 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(tenscripts) # if(PYTHON_VERSION_MAJOR VERSION_EQUAL 3) # install_pykrita_plugin(cmake_utils) # install_pykrita_plugin(js_utils PATTERNS "*.json") # install_pykrita_plugin(expand PATTERNS "*.expand" "templates/*.tpl") # endif() install( DIRECTORY libkritapykrita DESTINATION ${DATA_INSTALL_DIR}/krita/pykrita FILES_MATCHING PATTERN "*.py" PATTERN "__pycache__*" EXCLUDE ) diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py index 90fdc6c7f9..3284b65999 100644 --- a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscripts.py @@ -1,80 +1,57 @@ from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QListView, QFormLayout, QHBoxLayout, QPushButton, QLineEdit, QListWidget, QScrollArea, QGridLayout, QFileDialog, QKeySequenceEdit, QLabel, QAction, QDialogButtonBox) from PyQt5.QtCore import QObject, Qt import krita from tenscripts import uitenscripts 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 _executeScript(self): print('script executed') def readSettings(self): self.scripts = Application.readSetting("tenscripts", "scripts", "").split(',') def writeSettings(self): - self.actions = [] - shortcuts = [] - scripts = [] - index = 0 - - for row in range(self.scriptsLayout.rowCount()-1): - shortcutWidget = self.scriptsLayout.itemAt(index).widget() - textField = self.scriptsLayout.itemAt(index + 1).widget() - - if shortcutWidget.keySequence() and textField.text(): - action = Application.createAction("execute_script_" + str(row), "Execute Script " + str(row)) - action.setMenu("None") - action.triggered.connect(self._executeScript) - - if index < len(self.scripts) and self.selectedPresets[index] in allPresets: - action.preset = self.selectedPresets[index] - else: - action.preset = None - - self.actions.append(action) - action.setShortcut("CTRL+SHIFT+1") - action.script = textField.text() - - shortcuts.append(shortcutWidget.keySequence().toString()) - scripts.append(textField.text()) - self.actions.append(action) + saved_scripts = self.uitenscripts.saved_scripts() - index += 3 + for index, script in enumerate(saved_scripts): + self.actions[index].script = script - Application.writeSetting("tenscripts", "scripts", ','.join(map(str, scripts))) + 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', '0']): + 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.setMenu("None") action.script = None action.triggered.connect(self._executeScript) if index < len(self.scripts): action.script = self.scripts[index] - self.actions.append(action) + self.actions.append(action) + print(action.shortcut()) Scripter.addExtension(TenScriptsExtension(Application)) diff --git a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py index bdbe41f876..8bf230bf3c 100644 --- a/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/tenscriptsdialog.py @@ -1,17 +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.uitenbrushes.tenscripts.writeSettings() + 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 index 0abd75ae71..01143608bc 100644 --- a/plugins/extensions/pykrita/plugin/plugins/tenscripts/uitenscripts.py +++ b/plugins/extensions/pykrita/plugin/plugins/tenscripts/uitenscripts.py @@ -1,75 +1,87 @@ from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QPixmap, QIcon, QKeySequence from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QListView, QFormLayout, QHBoxLayout, QPushButton, QLineEdit, QListWidget, QScrollArea, QGridLayout, QFileDialog, QKeySequenceEdit, QLabel, QAction, 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.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)) + 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)