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