File indexing completed on 2024-06-23 04:28:02
0001 # SPDX-License-Identifier: CC0-1.0 0002 0003 from . import filtermanagerdialog 0004 from .components import (filtercombobox, filtermanagertreemodel) 0005 from PyQt5.QtCore import Qt 0006 from PyQt5.QtWidgets import (QFormLayout, QAbstractItemView, QDialogButtonBox, 0007 QVBoxLayout, QFrame, QTreeView) 0008 import krita 0009 0010 0011 class UIFilterManager(object): 0012 0013 def __init__(self): 0014 self.mainDialog = filtermanagerdialog.FilterManagerDialog() 0015 self.mainLayout = QVBoxLayout(self.mainDialog) 0016 self.formLayout = QFormLayout() 0017 self.buttonBox = QDialogButtonBox( 0018 QDialogButtonBox.Ok | QDialogButtonBox.Cancel) 0019 0020 self.kritaInstance = krita.Krita.instance() 0021 self._filters = sorted(self.kritaInstance.filters()) 0022 self._documents = self.kritaInstance.documents() 0023 self.treeModel = filtermanagertreemodel.FilterManagerTreeModel(self) 0024 0025 self.documentsTreeView = QTreeView() 0026 self.filterComboBox = filtercombobox.FilterComboBox(self) 0027 0028 self.buttonBox.accepted.connect(self.confirmButton) 0029 self.buttonBox.rejected.connect(self.mainDialog.close) 0030 0031 self.documentsTreeView.setSelectionMode( 0032 QAbstractItemView.SingleSelection) 0033 self.mainDialog.setWindowModality(Qt.NonModal) 0034 0035 def initialize(self): 0036 self.documentsTreeView.setModel(self.treeModel) 0037 self.documentsTreeView.setWindowTitle(i18n("Document Tree Model")) 0038 self.documentsTreeView.resizeColumnToContents(0) 0039 self.documentsTreeView.resizeColumnToContents(1) 0040 self.documentsTreeView.resizeColumnToContents(2) 0041 0042 self.formLayout.addRow(i18nc("Python filters", "Filters:"), self.filterComboBox) 0043 0044 self.line = QFrame() 0045 self.line.setFrameShape(QFrame.HLine) 0046 self.line.setFrameShadow(QFrame.Sunken) 0047 0048 self.mainLayout.addWidget(self.documentsTreeView) 0049 self.mainLayout.addLayout(self.formLayout) 0050 self.mainLayout.addWidget(self.line) 0051 self.mainLayout.addWidget(self.buttonBox) 0052 0053 self.mainDialog.resize(500, 300) 0054 self.mainDialog.setWindowTitle(i18n("Filter Manager")) 0055 self.mainDialog.setSizeGripEnabled(True) 0056 self.mainDialog.show() 0057 self.mainDialog.activateWindow() 0058 0059 def confirmButton(self): 0060 documentsIndexes = [] 0061 0062 selectionModel = self.documentsTreeView.selectionModel() 0063 for index in selectionModel.selectedRows(): 0064 node = self.treeModel.data(index, Qt.UserRole + 1) 0065 documentIndex = self.treeModel.data(index, Qt.UserRole + 2) 0066 _type = self.treeModel.data(index, Qt.UserRole + 3) 0067 0068 if _type == 'Document': 0069 self.applyFilterOverDocument(self.documents[documentIndex]) 0070 else: 0071 self.applyFilterOverNode(node, self.documents[documentIndex]) 0072 0073 documentsIndexes.append(documentIndex) 0074 0075 self.refreshDocumentsProjections(set(documentsIndexes)) 0076 0077 def refreshDocumentsProjections(self, indexes): 0078 for index in indexes: 0079 document = self.documents[index] 0080 document.refreshProjection() 0081 0082 def applyFilterOverNode(self, node, document): 0083 _filter = self.kritaInstance.filter(self.filterComboBox.currentText()) 0084 _filter.apply(node, 0, 0, document.width(), document.height()) 0085 0086 def applyFilterOverDocument(self, document): 0087 """This method applies the selected filter just to topLevelNodes, 0088 then if topLevelNodes are GroupLayers, that filter will not be 0089 applied.""" 0090 0091 for node in document.topLevelNodes(): 0092 self.applyFilterOverNode(node, document) 0093 0094 @property 0095 def filters(self): 0096 return self._filters 0097 0098 @property 0099 def documents(self): 0100 return self._documents