Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_auto_brush_widget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004, 2007, 2009 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
10#include "kis_image_config.h"
11#include <math.h>
12#include <kis_debug.h>
13#include <QSpinBox>
14#include <QImage>
15#include <QPixmap>
16#include <QResizeEvent>
17
19#include <kis_mask_generator.h>
20#include <kis_slider_spin_box.h>
21#include "kis_signals_blocker.h"
24#include <KisAngleSelector.h>
27#include <kis_cubic_curve.h>
30#include <KisAutoBrushModel.h>
31
32
43
44
45
47 KisAutoBrushModel *model,
48 QWidget *parent, const char* name)
49 : KisWdgAutoBrush(parent, name)
50 , m_fadeAspectLocker(new KisAspectRatioLocker())
51 , m_d(new Private(model))
52
53{
54 connectControl(comboBoxShape, m_d->model, "shape");
55 connectControl(comboBoxMaskType, m_d->model, "type");
56
57 inputRadius->setRange(0.01, maxBrushSize, 2);
58 inputRadius->setExponentRatio(3.0);
59 inputRadius->setSingleStep(1);
60 inputRadius->setValue(5);
61 inputRadius->setSuffix(i18n(" px"));
62 inputRadius->setBlockUpdateSignalOnDrag(true);
63 connectControl(inputRadius, m_d->model, "diameter");
64
65 inputRatio->setRange(0.01, 1.0, 2);
66 inputRatio->setSingleStep(0.01);
67 inputRatio->setValue(1.0);
68 inputRatio->setBlockUpdateSignalOnDrag(true);
69 connectControl(inputRatio, m_d->model, "ratio");
70
71 inputHFade->setRange(0.0, 1.0, 2);
72 inputHFade->setSingleStep(0.01);
73 inputHFade->setValue(0.5);
74
75 inputVFade->setRange(0.0, 1.0, 2);
76 inputVFade->setSingleStep(0.01);
77 inputVFade->setValue(0.5);
78
79 aspectButton->setKeepAspectRatio(true);
80
81 m_fadeAspectLocker->connectSpinBoxes(inputHFade, inputVFade, aspectButton);
82 m_fadeAspectLocker->setBlockUpdateSignalOnDrag(false);
83
85 [this] () {
86 m_d->model->sethorizontalFade(inputHFade->value());
87 m_d->model->setverticalFade(inputVFade->value());
88 });
89
90 m_d->model->LAGER_QT(horizontalFade).bind([this] (qreal value) {
91 KisSignalsBlocker b(inputHFade);
92 inputHFade->setValue(value);
93 m_fadeAspectLocker->updateAspect();
94 });
95
96 m_d->model->LAGER_QT(verticalFade).bind([this] (qreal value) {
97 KisSignalsBlocker b(inputVFade);
98 inputVFade->setValue(value);
99 m_fadeAspectLocker->updateAspect();
100 });
101
102 inputSpikes->setRange(2, 20);
103 inputSpikes->setValue(2);
104 inputSpikes->setBlockUpdateSignalOnDrag(true);
105 connectControl(inputSpikes, m_d->model, "spikes");
106
107 inputRandomness->setRange(0, 100);
108 inputRandomness->setValue(0);
109 inputRandomness->setBlockUpdateSignalOnDrag(true);
110 connectControl(inputRandomness, m_d->model, "randomness");
111
112 inputAngle->setDecimals(0);
113 connectControl(inputAngle, m_d->model, "angle");
114 connectControl(spacingWidget, m_d->model, "aggregatedSpacing");
115
116 density->setRange(0, 100, 0);
117 density->setSingleStep(1);
118 density->setValue(100);
119 KisSpinBoxI18nHelper::setText(density, i18nc("{n} is the number value, % is the percent sign", "{n}%"));
120 density->setBlockUpdateSignalOnDrag(true);
121 connectControl(density, m_d->model, "density");
122
124 connect(m_d->model, &KisAutoBrushModel::curveStringChanged, this, &KisAutoBrushWidget::slotCurvePropertyChanged);
125 m_d->model->LAGER_QT(curveString).nudge();
126
128 for (int i = 0; i < ids.size(); i++) {
129 comboBoxMaskType->insertItem(i, ids[i].name());
130 }
131
132 connect(m_d->model, &KisAutoBrushModel::typeChanged, this, &KisAutoBrushWidget::setStackedWidget);
133 setStackedWidget(m_d->model->type());
134
135 brushPreview->setIconSize(QSize(100, 100));
136
137 connectControl(btnAntialiasing, m_d->model, "antialiasEdges");
138
139 lager::watch(m_d->model->m_commonData, std::bind(&KisSignalCompressor::start, &m_d->previewCompressor));
140 lager::watch(m_d->model->m_autoBrushData, std::bind(&KisSignalCompressor::start, &m_d->previewCompressor));
141 lager::watch(m_d->model->m_commonBrushSizeData, std::bind(&KisSignalCompressor::start, &m_d->previewCompressor));
142
144
146}
147
151
153{
154 brushPreview->setMinimumHeight(brushPreview->width()); // dirty hack !
155 brushPreview->setMaximumHeight(brushPreview->width()); // dirty hack !
156}
157
159{
160 if (index == 1) {
161 stackedWidget->setCurrentIndex(1);
162 }
163 else {
164 stackedWidget->setCurrentIndex(0);
165 }
166}
167
169{
170 m_d->model->setcurveString(softnessCurve->curve().toString());
171}
172
174{
175 KisCubicCurve curve;
176
177 if (!value.isEmpty()) {
178 curve = KisCubicCurve(value);
179 } else {
180 curve.setPointPosition(0, QPointF(0.0, 1.0));
181 curve.setPointPosition(1, QPointF(1.0, 0.0));
182 }
183
184 KisSignalsBlocker b(softnessCurve);
185 softnessCurve->setCurve(curve);
186}
187
189{
190 KisAutoBrushFactory factory;
191
193 factory.createBrush(*m_d->model->m_commonData,
194 m_d->model->bakedOptionData(),
197
198 QImage pi(brush->image());
199
200 double coeff = 1.0;
201 int bPw = brushPreview->width() - 3;
202 if (pi.width() > bPw) {
203 coeff = bPw / (double)pi.width();
204 }
205 int bPh = brushPreview->height() - 3;
206 if (pi.height() > coeff * bPh) {
207 coeff = bPh / (double)pi.height();
208 }
209 if (coeff < 1.0) {
210 pi = pi.scaled((int)(coeff * pi.width()) , (int)(coeff * pi.height()), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
211 }
212
213 QPixmap p = QPixmap::fromImage(pi);
214 brushPreview->setIcon(QIcon(p));
215}
216
218{
219 KisAutoBrushFactory factory;
220
222 factory.createBrush(*m_d->model->m_commonData,
223 m_d->model->bakedOptionData(),
226
227 return brush;
228}
float value(const T *src, size_t ch)
const Params2D p
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KoResourceLoadResult createBrush(const QDomElement &brushDefinition, KisResourcesInterfaceSP resourcesInterface) override
QScopedPointer< KisAspectRatioLocker > m_fadeAspectLocker
const QScopedPointer< Private > m_d
void slotCurvePropertyChanged(const QString &value)
KisAutoBrushWidget(int maxBrushSize, KisAutoBrushModel *model, QWidget *parent, const char *name)
void resizeEvent(QResizeEvent *) override
void modified(void)
static KisResourcesInterfaceSP instance()
static QList< KoID > maskGeneratorIds()
KoResourceSP resource() const noexcept
void setText(QSpinBox *spinBox, const QStringView textTemplate)
void connectControl(KisCompositeOpListWidget *widget, QObject *source, const char *property)
Private(KisAutoBrushModel *_model)
void setPointPosition(int idx, const QPointF &position)