Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_grid_paintop_settings.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009, 2010 Lukáš Tvrdý (lukast.dev@gmail.com)
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
11
13#include "KisGridOpOptionData.h"
14
15#include <KisColorOptionData.h>
17
22
25 resourcesInterface),
26 m_d(new Private),
27 m_modifyOffsetWithShortcut(false)
28{
29}
30
32{
34 option.read(this);
35 option.diameter = value;
36 option.write(this);
37}
38
40{
42 option.read(this);
43 return option.diameter;
44}
45
47{
48 Q_UNUSED(value);
49}
50
52{
53 return 0.0;
54}
55
59
66
67bool KisGridPaintOpSettings::mousePressEvent(const KisPaintInformation& info, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode)
68{
69 Q_UNUSED(currentNode);
70
72 option.read(this);
73 bool eventIgnored = true;
74 qreal newHorizontalOffset = std::fmod(info.pos().x() + option.grid_width/2.0, (float)option.grid_width);
75 qreal newVerticalOffset = std::fmod(info.pos().y() + option.grid_height/2.0, (float)option.grid_height);
76
77 // If pressing ctrl+alt change the offset according to mouse position
78 if (modifiers == (Qt::ControlModifier | Qt::AltModifier) || m_modifyOffsetWithShortcut) {
80 newHorizontalOffset = (newHorizontalOffset / (float)option.grid_width);
81 newVerticalOffset = (newVerticalOffset / (float)option.grid_height);
82
83 if (newHorizontalOffset > 0.5) {
84 newHorizontalOffset = newHorizontalOffset - 1;
85 }
86 if (newVerticalOffset > 0.5) {
87 newVerticalOffset = newVerticalOffset -1;
88 }
89 option.horizontal_offset = newHorizontalOffset * option.grid_width;
90 option.vertical_offset = newVerticalOffset * option.grid_height;
91 option.write(this);
92 eventIgnored = false;
93 }
94 return eventIgnored;
95}
96
98{
100 bool ignoreEvent = true;
101 return ignoreEvent;
102}
104{
106 KisGridOpOptionData option;
107 option.read(this);
108 KisGridShapeOptionData shapeOption;
109 shapeOption.read(this);
110 if (mode.isVisible) {
111 qreal sizex = option.diameter * option.grid_scale;
112 qreal sizey = option.diameter * option.grid_scale;
113 QRectF rc(0, 0, sizex, sizey);
114 rc.translate(-rc.center());
115 path.addRect(rc);
116
117 path = outlineFetcher()->fetchOutline(info, this, path, mode, alignForZoom);
118
119 if (mode.showTiltDecoration) {
120 QPainterPath tiltLine = makeTiltIndicator(info, QPointF(0.0, 0.0), sizex * 0.5, 3.0);
121 path.addPath(outlineFetcher()->fetchOutline(info, this, tiltLine, mode, alignForZoom, 1.0, 0.0, true, 0, 0));
122 }
123 }
125 qreal gridWidth = option.diameter * option.grid_scale ;
126 qreal gridHeight = option.diameter * option.grid_scale ;
127
128 qreal cellWidth = option.grid_width * option.grid_scale ;
129 qreal cellHeight = option.grid_height * option.grid_scale;
130
131 qreal horizontalOffset = option.horizontal_offset;
132 qreal verticalOffset = option.vertical_offset;
133
134 int divide;
135 if (option.grid_pressure_division) {
136 divide = option.grid_division_level * info.pressure();
137 }
138 else {
139 divide = option.grid_division_level;
140 }
141
142 divide = qRound(option.grid_scale * divide);
143
144 //Adjust the start position of the drawn grid to the top left of the brush instead of in the center
145 qreal posX = info.pos().x() - (gridWidth/2) + (cellWidth/2) - horizontalOffset;
146 qreal posY = info.pos().y() - (gridHeight/2) + (cellHeight/2) - verticalOffset;
147
148 //Lock the grid alignment
149 posX = posX - std::fmod(posX, cellWidth) + horizontalOffset;
150 posY = posY - std::fmod(posY, cellHeight) + verticalOffset;
151 const QRectF dabRect(posX , posY , cellWidth, cellHeight);
152
153 divide = qMax(1, divide);
154 const qreal yStep = cellHeight / (qreal)divide;
155 const qreal xStep = cellWidth / (qreal)divide;
156
157 QRectF tile;
158 QPainterPath cellPath;
159 for (int y = 0; y < (gridHeight)/yStep; y++) {
160 for (int x = 0; x < (gridWidth)/xStep; x++) {
161 tile = QRectF(dabRect.x() + x * xStep, dabRect.y() + y * yStep, xStep, yStep);
162 switch (shapeOption.shape) {
163 case 0: {
164 cellPath.addEllipse(tile);
165 break;
166 }
167 case 1: {
168 cellPath.addRect(tile);
169 break;
170 }
171 case 2: {
172 cellPath.moveTo(tile.topRight());
173 cellPath.lineTo(tile.bottomLeft());
174 break;
175 }
176 case 3: {
177 cellPath.moveTo(tile.topRight());
178 cellPath.lineTo(tile.bottomLeft());
179 break;
180 }
181 case 4: {
182 cellPath.moveTo(tile.topRight());
183 cellPath.lineTo(tile.bottomLeft());
184 break;
185 }
186 default: {
187 break;
188 }
189 }
190 }
191 }
192 KisOptimizedBrushOutline cellPath2 = outlineFetcher()->fetchOutline(info, this, cellPath, mode, alignForZoom);
193 path.addPath(cellPath2);
194 }
195 return path;
196}
197
198
200#include "kis_paintop_preset.h"
202
204{
206 listWeakToStrong(m_d->uniformProperties);
207
208 if (props.isEmpty()) {
209 {
210 KisIntSliderBasedPaintOpPropertyCallback *prop = new KisIntSliderBasedPaintOpPropertyCallback(KisIntSliderBasedPaintOpPropertyCallback::Int,
211 KoID("grid_divisionlevel", i18n("Division Level")),
212 settings,
213 0);
214
215 prop->setRange(1, 25);
216 prop->setSingleStep(1);
217
218 prop->setReadCallback(
219 [](KisUniformPaintOpProperty *prop) {
220 KisGridOpOptionData option;
221 option.read(prop->settings().data());
222
223 prop->setValue(int(option.grid_division_level));
224 });
225 prop->setWriteCallback(
226 [](KisUniformPaintOpProperty *prop) {
227 KisGridOpOptionData option;
228 option.read(prop->settings().data());
229 option.grid_division_level = prop->value().toInt();
230 option.write(prop->settings().data());
231 });
232
233 QObject::connect(updateProxy, SIGNAL(sigSettingsChanged()), prop, SLOT(requestReadValue()));
234 prop->requestReadValue();
235 props << toQShared(prop);
236 }
237 }
238
239 return KisPaintOpSettings::uniformProperties(settings, updateProxy) + props;
240}
float value(const T *src, size_t ch)
KisOptimizedBrushOutline fetchOutline(const KisPaintInformation &info, const KisPaintOpSettingsSP settings, const KisOptimizedBrushOutline &originalOutline, const KisPaintOpSettings::OutlineMode &mode, qreal alignForZoom, qreal additionalScale=1.0, qreal additionalRotation=0.0, bool tilt=false, qreal tiltcenterx=1.0, qreal tiltcentery=1.0) const
qreal paintOpSize() const override
bool mousePressEvent(const KisPaintInformation &pos, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode) override
KisOptimizedBrushOutline brushOutline(const KisPaintInformation &info, const OutlineMode &mode, qreal alignForZoom) override
qreal paintOpAngle() const override
void setPaintOpSize(qreal value) override
const QScopedPointer< Private > m_d
void setPaintOpAngle(qreal value) override
KisGridPaintOpSettings(KisResourcesInterfaceSP resourcesInterface)
void addPath(const QPainterPath &path)
const KisCurrentOutlineFetcher * outlineFetcher() const
const QPointF & pos() const
qreal pressure() const
The pressure of the value (from 0.0 to 1.0)
Definition KoID.h:30
QSharedPointer< T > toQShared(T *ptr)
Container< QSharedPointer< T > > listWeakToStrong(const Container< QWeakPointer< T > > &container, bool allOrNothing=true)
KisCallbackBasedPaintopProperty< KisSliderBasedPaintOpProperty< int > > KisIntSliderBasedPaintOpPropertyCallback
void write(KisPropertiesConfiguration *setting) const
bool read(const KisPropertiesConfiguration *setting)
QList< KisUniformPaintOpPropertyWSP > uniformProperties
bool read(const KisPropertiesConfiguration *setting)
int shape
Ellipse, rectangle, line, pixel, anti-aliased pixel.
static QPainterPath makeTiltIndicator(KisPaintInformation const &info, QPointF const &start, qreal lengthScale, qreal angle)
QList< KisUniformPaintOpPropertyWSP > uniformProperties
bool read(const KisPropertiesConfiguration *setting)