Krita Source Code Documentation
Loading...
Searching...
No Matches
quick_settings_docker.py
Go to the documentation of this file.
1# By Wolthera(originally)
2
3# SPDX-License-Identifier: CC0-1.0
4
5'''A Python based docker for quickly choosing the brushsize like
6similar dockers in other drawing programs.
7
8@package quick_settings_docker
9
10'''
11
12# Importing the relevant dependencies:
13try:
14 from PyQt6.QtCore import pyqtSlot, Qt, QPointF
15 from PyQt6.QtGui import (QStandardItem, QStandardItemModel, QPainter, QPalette,
16 QPixmap, QImage, QBrush, QPen, QIcon)
17 from PyQt6.QtWidgets import QWidget, QTabWidget, QListView, QVBoxLayout
18except:
19 from PyQt5.QtCore import pyqtSlot, Qt, QPointF
20 from PyQt5.QtGui import (QStandardItem, QStandardItemModel, QPainter, QPalette,
21 QPixmap, QImage, QBrush, QPen, QIcon)
22 from PyQt5.QtWidgets import QWidget, QTabWidget, QListView, QVBoxLayout
23from krita import DockWidget
24from builtins import i18n, Application
25
26
27class QuickSettingsDocker(DockWidget):
28 # Init the docker
29
30 def __init__(self):
31 super(QuickSettingsDocker, self).__init__()
32 # make base-widget and layout
33 widget = QWidget()
34 layout = QVBoxLayout()
35 widget.setLayout(layout)
36 self.setWindowTitle(i18n("Quick Settings Docker"))
37 tabWidget = QTabWidget()
38
39 self.brushSizeTableView = QListView()
40 self.brushSizeTableView.setViewMode(QListView.ViewMode.IconMode)
41 self.brushSizeTableView.setMovement(QListView.Movement.Static)
42 self.brushSizeTableView.setResizeMode(QListView.ResizeMode.Adjust)
43 self.brushSizeTableView.setUniformItemSizes(True)
44 self.brushSizeTableView.setSelectionMode(QListView.SelectionMode.SingleSelection)
45
46 self.brushOpacityTableView = QListView()
47 self.brushOpacityTableView.setViewMode(QListView.ViewMode.IconMode)
48 self.brushOpacityTableView.setMovement(QListView.Movement.Static)
49 self.brushOpacityTableView.setResizeMode(QListView.ResizeMode.Adjust)
50 self.brushOpacityTableView.setUniformItemSizes(True)
51 self.brushOpacityTableView.setSelectionMode(QListView.SelectionMode.SingleSelection)
52
53 self.brushFlowTableView = QListView()
54 self.brushFlowTableView.setViewMode(QListView.ViewMode.IconMode)
55 self.brushFlowTableView.setMovement(QListView.Movement.Static)
56 self.brushFlowTableView.setResizeMode(QListView.ResizeMode.Adjust)
57 self.brushFlowTableView.setUniformItemSizes(True)
58 self.brushFlowTableView.setSelectionMode(QListView.SelectionMode.SingleSelection)
59
60 tabWidget.addTab(self.brushSizeTableView, i18n("Size"))
61 tabWidget.addTab(self.brushOpacityTableView, i18n("Opacity"))
62 tabWidget.addTab(self.brushFlowTableView, i18n("Flow"))
63 layout.addWidget(tabWidget)
64 self.setWidget(widget) # Add the widget to the docker.
65
66 # amount of columns in each row for all the tables.
67
68 # We want a grid with possible options to select. To do this,
69 # we'll make a ListView widget and use a standarditemmodel for
70 # the entries. The entries are filled out based on the sizes
71 # and opacity lists.
72
73 # Sizes and opacity lists. The former is half-way copied from
74 # ptsai, the latter is based on personal experience of useful
75 # opacities.
76 self.sizesList = [
77 0.7, 1.0, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16,
78 20, 25, 30, 35, 40, 50, 60, 70, 80, 100, 120, 160, 200, 250, 300,
79 350, 400, 450, 500]
80 self.opacityList = [
81 0.1, 0.5, 1, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100]
82 self.brushSizeModel = QStandardItemModel()
83 self.brushOpacityModel = QStandardItemModel()
84 self.brushFlowModel = QStandardItemModel()
85 self.fillSizesModel()
86 self.fillOpacityModel()
87
88 # Now we're done filling out our tables, we connect the views
89 # to the functions that'll change the settings.
93
94 def fillSizesModel(self):
95 # First we empty the old model. We might wanna use this
96 # function in the future to fill it with the brushmask of the
97 # selected brush, but there's currently no API for recognising
98 # changes in the current brush nor is there a way to get its
99 # brushmask.
100 self.brushSizeModel.clear()
101 for s in range(len(self.sizesList)):
102 # we're gonna iterate over our list, and make a new item
103 # for each entry. We need to disable a bunch of stuff to
104 # make sure people won't do funny things to our entries.
105 item = QStandardItem()
106 item.setCheckable(False)
107 item.setEditable(False)
108 item.setDragEnabled(False)
109 item.setText(str(self.sizesList[s])+" px")
110 # And from here on we'll make an icon.
111 brushImage = QPixmap(64, 64)
112 img = QImage(64, 64, QImage.Format.Format_RGBA8888)
113 circlePainter = QPainter()
114 img.fill(Qt.GlobalColor.transparent)
115 circlePainter.begin(img)
116 brush = QBrush(Qt.BrushStyle.SolidPattern)
117 brush.setColor(
118 self.brushSizeTableView.palette().color(QPalette.ColorRole.Text))
119 circlePainter.setBrush(brush)
120 circlePainter.setPen(QPen(QBrush(Qt.GlobalColor.transparent), 0))
121 brushSize = max(min(self.sizesList[s], 64), 1)
122 brushSize = brushSize * 0.5
123 circlePainter.drawEllipse(QPointF(32, 32), brushSize, brushSize)
124 circlePainter.end()
125 brushImage = QPixmap.fromImage(img)
126 # now we're done with drawing the icon, so we set it on the item.
127 item.setIcon(QIcon(brushImage))
128 self.brushSizeModel.appendRow(item)
129 self.brushSizeTableView.setModel(self.brushSizeModel)
130
132 self.brushOpacityModel.clear()
133 self.brushFlowModel.clear()
134 for s in range(len(self.opacityList)):
135 # we're gonna iterate over our list, and make a new item
136 # for each entry.
137 item = QStandardItem()
138 item.setCheckable(False)
139 item.setEditable(False)
140 item.setDragEnabled(False)
141 item.setText(str(self.opacityList[s])+" %")
142 brushImage = QPixmap(64, 64)
143 img = QImage(64, 64, QImage.Format.Format_RGBA8888)
144 circlePainter = QPainter()
145 img.fill(Qt.GlobalColor.transparent)
146 circlePainter.begin(img)
147 brush = QBrush(Qt.BrushStyle.SolidPattern)
148 brush.setColor(
149 self.brushSizeTableView.palette().color(QPalette.ColorRole.Text))
150 circlePainter.setBrush(brush)
151 circlePainter.setPen(QPen(QBrush(Qt.GlobalColor.transparent), 0))
152 circlePainter.setOpacity(float(self.opacityList[s]) / 100.0)
153 circlePainter.drawEllipse(QPointF(32, 32), 32, 32)
154 circlePainter.end()
155 brushImage = QPixmap.fromImage(img)
156 item.setIcon(QIcon(brushImage))
157 # the flow and opacity models will use virtually the same
158 # items, but Qt would like us to make sure we understand
159 # these are not really the same items, so hence the clone.
160 itemFlow = item.clone()
161 self.brushOpacityModel.appendRow(item)
162 self.brushFlowModel.appendRow(itemFlow)
163 self.brushOpacityTableView.setModel(self.brushOpacityModel)
164 self.brushFlowTableView.setModel(self.brushFlowModel)
165
166 def canvasChanged(self, canvas):
167 pass
168
169 @pyqtSlot('QModelIndex')
170 def setBrushSize(self, index):
171 i = index.row()
172 brushSize = self.sizesList[i]
173 window = Application.activeWindow()
174 if window and window.views():
175 window.views()[0].setBrushSize(brushSize)
176
177 @pyqtSlot('QModelIndex')
178 def setBrushOpacity(self, index):
179 i = index.row()
180 brushOpacity = float(self.opacityList[i]) / 100.0
181 window = Application.activeWindow()
182 if window and window.views():
183 window.views()[0].setPaintingOpacity(brushOpacity)
184
185 @pyqtSlot('QModelIndex')
186 def setBrushFlow(self, index):
187 i = index.row()
188 brushOpacity = float(self.opacityList[i]) / 100.0
189 window = Application.activeWindow()
190 if window and window.views():
191 window.views()[0].setPaintingFlow(brushOpacity)
rgba palette[MAX_PALETTE]
Definition palette.c:35