File indexing completed on 2024-06-16 04:17:41

0001 # By Wolthera(originally)
0002 
0003 # SPDX-License-Identifier: CC0-1.0
0004 
0005 '''A Python based docker for quickly choosing the brushsize like
0006 similar dockers in other drawing programs.
0007 
0008 @package quick_settings_docker
0009 
0010 '''
0011 
0012 # Importing the relevant dependencies:
0013 from PyQt5.QtCore import pyqtSlot, Qt, QPointF
0014 from PyQt5.QtGui import (QStandardItem, QStandardItemModel, QPainter, QPalette,
0015                          QPixmap, QImage, QBrush, QPen, QIcon)
0016 from PyQt5.QtWidgets import QWidget, QTabWidget, QListView, QVBoxLayout
0017 from krita import DockWidget
0018 
0019 
0020 class QuickSettingsDocker(DockWidget):
0021     # Init the docker
0022 
0023     def __init__(self):
0024         super(QuickSettingsDocker, self).__init__()
0025         # make base-widget and layout
0026         widget = QWidget()
0027         layout = QVBoxLayout()
0028         widget.setLayout(layout)
0029         self.setWindowTitle(i18n("Quick Settings Docker"))
0030         tabWidget = QTabWidget()
0031 
0032         self.brushSizeTableView = QListView()
0033         self.brushSizeTableView.setViewMode(QListView.IconMode)
0034         self.brushSizeTableView.setMovement(QListView.Static)
0035         self.brushSizeTableView.setResizeMode(QListView.Adjust)
0036         self.brushSizeTableView.setUniformItemSizes(True)
0037         self.brushSizeTableView.setSelectionMode(QListView.SingleSelection)
0038 
0039         self.brushOpacityTableView = QListView()
0040         self.brushOpacityTableView.setViewMode(QListView.IconMode)
0041         self.brushOpacityTableView.setMovement(QListView.Static)
0042         self.brushOpacityTableView.setResizeMode(QListView.Adjust)
0043         self.brushOpacityTableView.setUniformItemSizes(True)
0044         self.brushOpacityTableView.setSelectionMode(QListView.SingleSelection)
0045 
0046         self.brushFlowTableView = QListView()
0047         self.brushFlowTableView.setViewMode(QListView.IconMode)
0048         self.brushFlowTableView.setMovement(QListView.Static)
0049         self.brushFlowTableView.setResizeMode(QListView.Adjust)
0050         self.brushFlowTableView.setUniformItemSizes(True)
0051         self.brushFlowTableView.setSelectionMode(QListView.SingleSelection)
0052 
0053         tabWidget.addTab(self.brushSizeTableView, i18n("Size"))
0054         tabWidget.addTab(self.brushOpacityTableView, i18n("Opacity"))
0055         tabWidget.addTab(self.brushFlowTableView, i18n("Flow"))
0056         layout.addWidget(tabWidget)
0057         self.setWidget(widget)  # Add the widget to the docker.
0058 
0059         # amount of columns in each row for all the tables.
0060 
0061         # We want a grid with possible options to select.  To do this,
0062         # we'll make a ListView widget and use a standarditemmodel for
0063         # the entries. The entries are filled out based on the sizes
0064         # and opacity lists.
0065 
0066         # Sizes and opacity lists. The former is half-way copied from
0067         # ptsai, the latter is based on personal experience of useful
0068         # opacities.
0069         self.sizesList = [
0070             0.7, 1.0, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16,
0071             20, 25, 30, 35, 40, 50, 60, 70, 80, 100, 120, 160, 200, 250, 300,
0072             350, 400, 450, 500]
0073         self.opacityList = [
0074             0.1, 0.5, 1, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100]
0075         self.brushSizeModel = QStandardItemModel()
0076         self.brushOpacityModel = QStandardItemModel()
0077         self.brushFlowModel = QStandardItemModel()
0078         self.fillSizesModel()
0079         self.fillOpacityModel()
0080 
0081         # Now we're done filling out our tables, we connect the views
0082         # to the functions that'll change the settings.
0083         self.brushSizeTableView.clicked.connect(self.setBrushSize)
0084         self.brushOpacityTableView.clicked.connect(self.setBrushOpacity)
0085         self.brushFlowTableView.clicked.connect(self.setBrushFlow)
0086 
0087     def fillSizesModel(self):
0088         # First we empty the old model. We might wanna use this
0089         # function in the future to fill it with the brushmask of the
0090         # selected brush, but there's currently no API for recognising
0091         # changes in the current brush nor is there a way to get its
0092         # brushmask.
0093         self.brushSizeModel.clear()
0094         for s in range(len(self.sizesList)):
0095             # we're gonna iterate over our list, and make a new item
0096             # for each entry.  We need to disable a bunch of stuff to
0097             # make sure people won't do funny things to our entries.
0098             item = QStandardItem()
0099             item.setCheckable(False)
0100             item.setEditable(False)
0101             item.setDragEnabled(False)
0102             item.setText(str(self.sizesList[s])+" px")
0103             # And from here on we'll make an icon.
0104             brushImage = QPixmap(64, 64)
0105             img = QImage(64, 64, QImage.Format_RGBA8888)
0106             circlePainter = QPainter()
0107             img.fill(Qt.transparent)
0108             circlePainter.begin(img)
0109             brush = QBrush(Qt.SolidPattern)
0110             brush.setColor(
0111                 self.brushSizeTableView.palette().color(QPalette.Text))
0112             circlePainter.setBrush(brush)
0113             circlePainter.setPen(QPen(QBrush(Qt.transparent), 0))
0114             brushSize = max(min(self.sizesList[s], 64), 1)
0115             brushSize = brushSize * 0.5
0116             circlePainter.drawEllipse(QPointF(32, 32), brushSize, brushSize)
0117             circlePainter.end()
0118             brushImage = QPixmap.fromImage(img)
0119             # now we're done with drawing the icon, so we set it on the item.
0120             item.setIcon(QIcon(brushImage))
0121             self.brushSizeModel.appendRow(item)
0122         self.brushSizeTableView.setModel(self.brushSizeModel)
0123 
0124     def fillOpacityModel(self):
0125         self.brushOpacityModel.clear()
0126         self.brushFlowModel.clear()
0127         for s in range(len(self.opacityList)):
0128             # we're gonna iterate over our list, and make a new item
0129             # for each entry.
0130             item = QStandardItem()
0131             item.setCheckable(False)
0132             item.setEditable(False)
0133             item.setDragEnabled(False)
0134             item.setText(str(self.opacityList[s])+" %")
0135             brushImage = QPixmap(64, 64)
0136             img = QImage(64, 64, QImage.Format_RGBA8888)
0137             circlePainter = QPainter()
0138             img.fill(Qt.transparent)
0139             circlePainter.begin(img)
0140             brush = QBrush(Qt.SolidPattern)
0141             brush.setColor(
0142                 self.brushSizeTableView.palette().color(QPalette.Text))
0143             circlePainter.setBrush(brush)
0144             circlePainter.setPen(QPen(QBrush(Qt.transparent), 0))
0145             circlePainter.setOpacity(float(self.opacityList[s]) / 100.0)
0146             circlePainter.drawEllipse(QPointF(32, 32), 32, 32)
0147             circlePainter.end()
0148             brushImage = QPixmap.fromImage(img)
0149             item.setIcon(QIcon(brushImage))
0150             # the flow and opacity models will use virtually the same
0151             # items, but Qt would like us to make sure we understand
0152             # these are not really the same items, so hence the clone.
0153             itemFlow = item.clone()
0154             self.brushOpacityModel.appendRow(item)
0155             self.brushFlowModel.appendRow(itemFlow)
0156         self.brushOpacityTableView.setModel(self.brushOpacityModel)
0157         self.brushFlowTableView.setModel(self.brushFlowModel)
0158 
0159     def canvasChanged(self, canvas):
0160         pass
0161 
0162     @pyqtSlot('QModelIndex')
0163     def setBrushSize(self, index):
0164         i = index.row()
0165         brushSize = self.sizesList[i]
0166         window = Application.activeWindow()
0167         if window and window.views():
0168             window.views()[0].setBrushSize(brushSize)
0169 
0170     @pyqtSlot('QModelIndex')
0171     def setBrushOpacity(self, index):
0172         i = index.row()
0173         brushOpacity = float(self.opacityList[i]) / 100.0
0174         window = Application.activeWindow()
0175         if window and window.views():
0176             window.views()[0].setPaintingOpacity(brushOpacity)
0177 
0178     @pyqtSlot('QModelIndex')
0179     def setBrushFlow(self, index):
0180         i = index.row()
0181         brushOpacity = float(self.opacityList[i]) / 100.0
0182         window = Application.activeWindow()
0183         if window and window.views():
0184             window.views()[0].setPaintingFlow(brushOpacity)