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)