Krita Source Code Documentation
Loading...
Searching...
No Matches
digitalmixer_dock.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2022 Bourumir Wyngs <bourumir.wyngs@gmail.com>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8#include "digitalmixer_dock.h"
9
10#include <QGridLayout>
11#include <KisSignalMapper.h>
12
13#include <klocalizedstring.h>
14#include "kis_icon_utils.h"
15
16#include <KoColorPatch.h>
17#include <KoColorSlider.h>
18#include <KoColorPopupAction.h>
21#include <KoCanvasBase.h>
22
23#include <kis_color_button.h>
25
27 public:
28 DigitalMixerPatch(QWidget* parent) : KoColorPatch(parent) {}
29 QSize sizeHint() const override
30 {
31 return QSize(24,24);
32 }
33};
34
36 : QDockWidget(i18n("Digital Colors Mixer")), m_canvas(0)
37 , m_tellCanvas(true)
38{
40 KoColor initColors[6] = { KoColor(Qt::black, sRGB),
41 KoColor(Qt::white, sRGB),
42 KoColor(Qt::red, sRGB),
43 KoColor(Qt::green, sRGB),
44 KoColor(Qt::blue, sRGB),
45 KoColor(Qt::yellow, sRGB) };
46
47 QWidget* widget = new QWidget(this);
48 QGridLayout* layout = new QGridLayout( widget );
49
50 // Current Color
52 m_currentColorPatch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
53 m_currentColorPatch->setMinimumWidth(48);
54 layout->addWidget(m_currentColorPatch, 0, 0,3,1);
55
56 // Create the sliders
57
58 KisSignalMapper* signalMapperSelectColor = new KisSignalMapper(this);
59 connect(signalMapperSelectColor, SIGNAL(mapped(int)), SLOT(popupColorChanged(int)));
60
61 KisSignalMapper* signalMapperColorSlider = new KisSignalMapper(this);
62 connect(signalMapperColorSlider, SIGNAL(mapped(int)), SLOT(colorSliderChanged(int)));
63
64 KisSignalMapper* signalMapperTargetColor = new KisSignalMapper(this);
65 connect(signalMapperTargetColor, SIGNAL(mapped(int)), SLOT(targetColorChanged(int)));
66
67 for(int i = 0; i < 6; ++i)
68 {
69 Mixer mixer;
70 mixer.targetColor = new DigitalMixerPatch(this);
71 mixer.targetColor->setFixedSize(32, 22);
72 layout->addWidget(mixer.targetColor, 0, i + 1);
73 mixer.targetSlider = new KoColorSlider(Qt::Vertical, this);
74 mixer.targetSlider->setFixedWidth(22);
75 mixer.targetSlider->setMinimumHeight(66);
76 layout->addWidget(mixer.targetSlider, 1, i + 1);
77 mixer.actionColor = new KisColorButton( this );
78 mixer.actionColor->setFixedWidth(22);
79 layout->addWidget(mixer.actionColor, 2, i + 1);
80
81 m_mixers.push_back(mixer);
82
83 connect(mixer.actionColor, SIGNAL(changed(KoColor)), signalMapperSelectColor, SLOT(map()));
84 signalMapperSelectColor->setMapping(mixer.actionColor, i);
85
86 connect(mixer.targetSlider, SIGNAL(valueChanged(int)), signalMapperColorSlider, SLOT(map()));
87 signalMapperColorSlider->setMapping(mixer.targetSlider, i);
88 mixer.targetSlider->setValue(125);
89
90 connect(mixer.targetColor, SIGNAL(triggered(KoColorPatch*)), signalMapperTargetColor, SLOT(map()));
91 signalMapperTargetColor->setMapping(mixer.targetColor, i);
92 }
93
94 //Gradient Mixer
95 KisSignalMapper* signalMapperGradientStartColor = new KisSignalMapper(this);
96 connect(signalMapperGradientStartColor, SIGNAL(mapped(int)), SLOT(gradientStartColorChanged(int)));
97
98 KisSignalMapper* signalMapperGradientColorSlider = new KisSignalMapper(this);
99 connect(signalMapperGradientColorSlider, SIGNAL(mapped(int)), SLOT(gradientColorSliderChanged(int)));
100
101 KisSignalMapper* signalMapperGradientEndColor = new KisSignalMapper(this);
102 connect(signalMapperGradientEndColor, SIGNAL(mapped(int)), SLOT(gradientEndColorChanged(int)));
103
104 KisSignalMapper* signalMapperGradientTargetColor = new KisSignalMapper(this);
105 connect(signalMapperGradientTargetColor, SIGNAL(mapped(int)), SLOT(gradientTargetColorChanged(int)));
106
107
109 m_gradientMixer.targetColor->setFixedSize(32,32);
110 layout->addWidget(m_gradientMixer.targetColor, 3, 0);
111
113 m_gradientMixer.startColor->setFixedWidth(22);
114 layout->addWidget(m_gradientMixer.startColor, 3, 1);
115
116 m_gradientMixer.targetSlider = new KoColorSlider(Qt::Horizontal, this);
117 m_gradientMixer.targetSlider->setFixedHeight(22);
118 // m_gradientMixer.targetSlider->setMinimumWidth(20);
119 // m_gradientMixer.targetSlider->setMaximumWidth(120);
120 // m_gradientMixer.targetSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
121 layout->addWidget(m_gradientMixer.targetSlider, 3, 2, 1, 4);
122
124 m_gradientMixer.endColor->setFixedWidth(22);
125 layout->addWidget(m_gradientMixer.endColor, 3, 6);
126
127 connect(m_gradientMixer.startColor, SIGNAL(changed(KoColor)), signalMapperGradientStartColor, SLOT(map()));
128 signalMapperGradientStartColor->setMapping(m_gradientMixer.startColor, 6);
129
130 connect(m_gradientMixer.targetSlider, SIGNAL(valueChanged(int)), signalMapperGradientColorSlider, SLOT(map()));
131 signalMapperGradientColorSlider->setMapping(m_gradientMixer.targetSlider, 6);
132 m_gradientMixer.targetSlider->setValue(125);
133
134 connect(m_gradientMixer.endColor, SIGNAL(changed(KoColor)), signalMapperGradientEndColor, SLOT(map()));
135 signalMapperGradientEndColor->setMapping(m_gradientMixer.endColor, 6);
136
137 connect(m_gradientMixer.targetColor, SIGNAL(triggered(KoColorPatch*)), signalMapperGradientTargetColor, SLOT(map()));
138 signalMapperGradientTargetColor->setMapping(m_gradientMixer.targetColor, 6);
139
140 m_reset_button = new QPushButton(KisIconUtils::loadIcon("reload-preset-16"),i18n("Reset"));
141 m_reset_button->setToolTip(i18n("Return to default settings"));
142 layout->addWidget(m_reset_button, 0, 0, Qt::AlignLeft);
143 connect(m_reset_button, SIGNAL(clicked()), SLOT(resetMixer()));
144
145 resetMixer(); // reset colors to default
146 setWidget( widget );
147}
148
150{
151 setEnabled(canvas != 0);
152
153 if (m_canvas) {
154 m_canvas->disconnectCanvasObserver(this);
155 }
156
157 m_canvas = canvas;
158
159 if (m_canvas) {
160 connect(m_canvas->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)),
161 this, SLOT(canvasResourceChanged(int,QVariant)));
162
163 m_tellCanvas=false;
164 setCurrentColor(m_canvas->resourceManager()->foregroundColor());
165 m_tellCanvas=true;
166 }
167}
168
169
171{
173 KoColor end_color = m_gradientMixer.endColor->color();
174 color.convertTo(end_color.colorSpace());
175 m_gradientMixer.targetSlider->setColors(color, end_color);
176
178}
179
184
186{
188 KoColor start_color = m_gradientMixer.startColor->color();
189 color.convertTo(start_color.colorSpace());
190 m_gradientMixer.targetSlider->setColors(start_color, color);
191
193}
194
199
201{
202 KoColor color = m_mixers[i].actionColor->color();
204 m_mixers[i].targetSlider->setColors( color, m_currentColor);
206}
207
209{
210 m_mixers[i].targetColor->setColor(m_mixers[i].targetSlider->currentColor());
211}
212
214{
215 setCurrentColor(m_mixers[i].targetColor->color());
216}
217
219{
221
222 KoColor initColors[6] = { KoColor(Qt::black, sRGB),
223 KoColor(Qt::white, sRGB),
224 KoColor(Qt::red, sRGB),
225 KoColor(Qt::green, sRGB),
226 KoColor(Qt::blue, sRGB),
227 KoColor(Qt::yellow, sRGB) };
228
229 for(int i = 0; i < m_mixers.size(); ++i)
230 {
231 m_mixers[i].actionColor->setColor(initColors[i]);
232 }
233
234 setCurrentColor(KoColor(Qt::black, sRGB));
235
236 m_gradientMixer.startColor->setColor(KoColor(Qt::black, sRGB));
237 m_gradientMixer.endColor->setColor(KoColor(Qt::white, sRGB));
238}
239
241{
242 m_currentColor = color;
244 for(int i = 0; i < m_mixers.size(); ++i)
245 {
248 }
249 if (m_canvas && m_tellCanvas)
250 {
251 m_canvas->resourceManager()->setForegroundColor(m_currentColor);
252 }
253}
254
255void DigitalMixerDock::canvasResourceChanged(int key, const QVariant& v)
256{
257 m_tellCanvas = false;
259 setCurrentColor(v.value<KoColor>());
260 m_tellCanvas = true;
261}
262
264{
266 connect(provider, SIGNAL(sigSavingWorkspace(KisWorkspaceResourceSP)),
268 connect(provider, SIGNAL(sigLoadingWorkspace(KisWorkspaceResourceSP)),
270}
271
273{
274 KisPropertiesConfiguration configuration;
275
276 configuration.setProperty("gradient_from",
277 QVariant::fromValue(m_gradientMixer.startColor->color()));
278 configuration.setProperty("gradient_to",
279 QVariant::fromValue(m_gradientMixer.endColor->color()));
280
281 for(int i = 0; i < m_mixers.size(); ++i)
282 {
283 configuration.setProperty("mixer_" + QString::number(i),
284 QVariant::fromValue(m_mixers[i].actionColor->color()));
285 }
286 workspace->setPrefixedProperties("digital-mixer", &configuration);
287}
288
289static void useColor(const KisPropertiesConfiguration &conf, KisColorButton* colorButton, const QString &color)
290{
291 // Do not change if undefined
292 KoColor koColor = conf.getColor(color, colorButton->color());
293 colorButton->setColor(koColor);
294}
295
297{
298 KisPropertiesConfiguration configuration;
299 workspace->getPrefixedProperties("digital-mixer", &configuration);
300
301 useColor(configuration, m_gradientMixer.startColor, "gradient_from");
302 useColor(configuration, m_gradientMixer.endColor, "gradient_to");
303
304 for (int i = 0; i < m_mixers.size(); ++i) {
305 useColor(configuration, m_mixers[i].actionColor, "mixer_" + QString::number(i));
306 }
307}
qreal v
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void popupColorChanged(int i)
GradientMixer m_gradientMixer
void gradientTargetColorChanged(int)
void setViewManager(KisViewManager *kisview) override
QList< Mixer > m_mixers
void gradientColorSliderChanged(int)
void canvasResourceChanged(int, const QVariant &)
void setCanvas(KoCanvasBase *canvas) override
reimplemented from KoCanvasObserverBase
void gradientEndColorChanged(int)
void loadFromWorkspace(KisWorkspaceResourceSP workspace)
void saveToWorkspace(KisWorkspaceResourceSP workspace)
void gradientStartColorChanged(int)
void colorSliderChanged(int i)
void setCurrentColor(const KoColor &)
QPointer< KoCanvasBase > m_canvas
QPushButton * m_reset_button
KoColorPatch * m_currentColorPatch
QSize sizeHint() const override
DigitalMixerPatch(QWidget *parent)
A pushbutton to display or allow user selection of a color.
void setColor(const KoColor &c)
The KisSignalMapper class bundles signals from identifiable senders.
void setMapping(QObject *sender, int id)
KisCanvasResourceProvider * canvasResourceProvider()
void setColor(const KoColor &c)
KoColor color() const
void convertTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
Definition KoColor.cpp:136
void setColor(const quint8 *data, const KoColorSpace *colorSpace=0)
Definition KoColor.cpp:186
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
static void useColor(const KisPropertiesConfiguration &conf, KisColorButton *colorButton, const QString &color)
QIcon loadIcon(const QString &name)
@ ForegroundColor
The active foreground color selected for this canvas.
KisColorButton * actionColor
virtual void setProperty(const QString &name, const QVariant &value)
KoColor getColor(const QString &name, const KoColor &color=KoColor()) const
getColor fetch the given property as a KoColor.
void setColors(const KoColor &minColor, const KoColor &maxColor)
KoColor currentColor() const
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())