Krita Source Code Documentation
Loading...
Searching...
No Matches
artisticcolorselector_dock.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7#include <kis_debug.h>
8
9#include <klocalizedstring.h>
12#include <KoResourceServer.h>
13#include <KoCanvasBase.h>
14#include <kis_canvas2.h>
15#include <KoColor.h>
17#include <kis_icon_utils.h>
18#include <KisPart.h>
19#include <kis_shape_layer.h>
20#include <kis_types.h>
21#include <KisDocument.h>
23#include <kis_group_layer.h>
24#include <KisView.h>
27
28#include <QWidget>
29#include <QButtonGroup>
30
32#include <KisViewManager.h>
34#include <kis_arcs_constants.h>
35#include <KisGamutMaskToolbar.h>
36
37#include "ui_wdgArtisticColorSelector.h"
38#include "ui_wdgARCSSettings.h"
39#include "ui_wdgWheelPreferencesPopup.h"
40
41class KisMainWindow;
42
43struct ArtisticColorSelectorUI: public QWidget, public Ui_wdgArtisticColorSelector
44{
46 setupUi(this);
47 }
48};
49
50struct ARCSSettingsUI: public QWidget, public Ui_wdgARCSSettings
51{
53 setupUi(this);
54 }
55};
56
57struct WheelPreferencesPopupUI: public QWidget, public Ui_wdgWheelPreferencesPopup
58{
60 setupUi(this);
61 }
62};
63
64
66 : QDockWidget(i18n("Artistic Color Selector"))
67 , m_canvas(nullptr)
68 , m_resourceProvider(0)
69 , m_selectedMask(nullptr)
70{
71 setEnabled(false);
72
73 m_hsxButtons = new QButtonGroup();
77
78 QPixmap hueStepsPixmap = KisIconUtils::loadIcon("wheel-sectors").pixmap(16,16);
79 QPixmap saturationStepsPixmap = KisIconUtils::loadIcon("wheel-rings").pixmap(16,16);
80 QPixmap valueScaleStepsPixmap = KisIconUtils::loadIcon("wheel-light").pixmap(16,16);
81 QIcon infinityIcon = KisIconUtils::loadIcon("infinity");
82 m_infinityPixmap = infinityIcon.pixmap(16,16);
83
84 m_selectorUI->colorSelector->loadSettings();
85
86 m_selectorUI->bnWheelPrefs->setIcon(KisIconUtils::loadIcon("wheel-sectors"));
87 m_selectorUI->bnWheelPrefs->setPopupWidget(m_wheelPrefsUI);
88 m_selectorUI->bnWheelPrefs->setArrowVisible(false);
89
90 m_selectorUI->bnDockerPrefs->setPopupWidget(m_preferencesUI);
91 m_selectorUI->bnDockerPrefs->setIcon(KisIconUtils::loadIcon("configure-thicker"));
92 m_selectorUI->bnDockerPrefs->setArrowVisible(false);
93
94 //preferences
95 m_hsxButtons->addButton(m_preferencesUI->bnHsy, KisColor::HSY);
96 m_hsxButtons->addButton(m_preferencesUI->bnHsi, KisColor::HSI);
97 m_hsxButtons->addButton(m_preferencesUI->bnHsl, KisColor::HSL);
98 m_hsxButtons->addButton(m_preferencesUI->bnHsv, KisColor::HSV);
99
100 m_wheelPrefsUI->bnInverseSat->setChecked(m_selectorUI->colorSelector->isSaturationInverted());
101
102 m_wheelPrefsUI->labelHueSteps->setPixmap(hueStepsPixmap);
103 m_wheelPrefsUI->labelSaturationSteps->setPixmap(saturationStepsPixmap);
104 m_wheelPrefsUI->labelValueScaleSteps->setPixmap(valueScaleStepsPixmap);
105
108 m_wheelPrefsUI->numValueScaleSteps->setRange(MIN_NUM_UI_LIGHT_PIECES, MAX_NUM_LIGHT_PIECES);
109
110 m_wheelPrefsUI->bnInfHueSteps->setIcon(infinityIcon);
111 m_wheelPrefsUI->bnInfValueScaleSteps->setIcon(infinityIcon);
112
113 m_wheelPrefsUI->bnInfHueSteps->setToolTip(i18n("Continuous Mode"));
114 m_wheelPrefsUI->bnInfValueScaleSteps->setToolTip(i18n("Continuous Mode"));
115
116 int selectorHueSteps = m_selectorUI->colorSelector->getNumPieces();
117 if (selectorHueSteps == 1) {
118 m_wheelPrefsUI->bnInfHueSteps->setChecked(true);
119 } else {
120 m_wheelPrefsUI->bnInfHueSteps->setChecked(false);
121 }
122 m_wheelPrefsUI->numHueSteps->setValue(selectorHueSteps);
123
124 m_wheelPrefsUI->numSaturationSteps->setValue(m_selectorUI->colorSelector->getNumRings());
125
126 int selectorValueScaleSteps = m_selectorUI->colorSelector->getNumLightPieces();
127 if (selectorValueScaleSteps == 1) {
128 m_wheelPrefsUI->bnInfValueScaleSteps->setChecked(true);
129 } else {
130 m_wheelPrefsUI->bnInfValueScaleSteps->setChecked(false);
131 }
132 m_wheelPrefsUI->numValueScaleSteps->setValue(m_selectorUI->colorSelector->getNumLightPieces());
133
134 m_preferencesUI->bnDefInfHueSteps->setIcon(infinityIcon);
135 m_preferencesUI->bnDefInfValueScaleSteps->setIcon(infinityIcon);
136
137 m_preferencesUI->labelDefHueSteps->setPixmap(hueStepsPixmap);
138 m_preferencesUI->labelDefSaturationSteps->setPixmap(saturationStepsPixmap);
139 m_preferencesUI->labelDefValueScaleSteps->setPixmap(valueScaleStepsPixmap);
140
141 m_preferencesUI->defaultHueSteps->setRange(MIN_NUM_HUE_PIECES, MAX_NUM_HUE_PIECES);
142 m_preferencesUI->defaultSaturationSteps->setRange(MIN_NUM_SATURATION_RINGS, MAX_NUM_SATURATION_RINGS);
143 m_preferencesUI->defaultValueScaleSteps->setRange(MIN_NUM_LIGHT_PIECES, MAX_NUM_LIGHT_PIECES);
144
145 m_preferencesUI->defaultHueSteps->setValue(m_selectorUI->colorSelector->getDefaultHueSteps());
146 m_preferencesUI->defaultSaturationSteps->setValue(m_selectorUI->colorSelector->getDefaultSaturationSteps());
147 m_preferencesUI->defaultValueScaleSteps->setValue(m_selectorUI->colorSelector->getDefaultValueScaleSteps());
148
149 m_preferencesUI->showBgColor->setChecked(m_selectorUI->colorSelector->getShowBgColor());
150 m_preferencesUI->showValueScaleNumbers->setChecked(m_selectorUI->colorSelector->getShowValueScaleNumbers());
151
152 m_preferencesUI->enforceGamutMask->setChecked(m_selectorUI->colorSelector->enforceGamutMask());
153 m_preferencesUI->permissiveGamutMask->setChecked(!m_selectorUI->colorSelector->enforceGamutMask());
154
155 m_preferencesUI->spLumaR->setValue(m_selectorUI->colorSelector->lumaR());
156 m_preferencesUI->spLumaG->setValue(m_selectorUI->colorSelector->lumaG());
157 m_preferencesUI->spLumaB->setValue(m_selectorUI->colorSelector->lumaB());
158 m_preferencesUI->spLumaGamma->setValue(m_selectorUI->colorSelector->lumaGamma());
159
160 switch(m_selectorUI->colorSelector->getColorSpace())
161 {
162 case KisColor::HSV: { m_preferencesUI->bnHsv->setChecked(true); } break;
163 case KisColor::HSI: { m_preferencesUI->bnHsi->setChecked(true); } break;
164 case KisColor::HSL: { m_preferencesUI->bnHsl->setChecked(true); } break;
165 case KisColor::HSY: { m_preferencesUI->bnHsy->setChecked(true); } break;
166 }
167
168 if (m_selectorUI->colorSelector->getColorSpace() == KisColor::HSY) {
169 m_preferencesUI->lumaCoefficientBox->show();
170 } else {
171 m_preferencesUI->lumaCoefficientBox->hide();
172 }
173
174 connect(m_wheelPrefsUI->numValueScaleSteps , SIGNAL(valueChanged(int)) , SLOT(slotPreferenceChanged()));
175 connect(m_wheelPrefsUI->numHueSteps , SIGNAL(valueChanged(int)) , SLOT(slotPreferenceChanged()));
176 connect(m_wheelPrefsUI->numSaturationSteps , SIGNAL(valueChanged(int)) , SLOT(slotPreferenceChanged()));
177 connect(m_wheelPrefsUI->bnInverseSat , SIGNAL(clicked(bool)) , SLOT(slotPreferenceChanged()));
178 connect(m_wheelPrefsUI->bnInfHueSteps , SIGNAL(clicked(bool)) , SLOT(slotPreferenceChanged()));
179 connect(m_wheelPrefsUI->bnInfValueScaleSteps, SIGNAL(clicked(bool)) , SLOT(slotPreferenceChanged()));
180 connect(m_wheelPrefsUI->bnDefault , SIGNAL(clicked(bool)) , SLOT(slotResetDefaultSettings()));
181
182 connect(m_preferencesUI->defaultHueSteps , SIGNAL(valueChanged(int)) , SLOT(slotPreferenceChanged()));
183 connect(m_preferencesUI->defaultSaturationSteps, SIGNAL(valueChanged(int)) , SLOT(slotPreferenceChanged()));
184 connect(m_preferencesUI->defaultValueScaleSteps, SIGNAL(valueChanged(int)) , SLOT(slotPreferenceChanged()));
185 connect(m_preferencesUI->bnDefInfHueSteps , SIGNAL(clicked(bool)) , SLOT(slotPreferenceChanged()));
186 connect(m_preferencesUI->bnDefInfValueScaleSteps, SIGNAL(clicked(bool)) , SLOT(slotPreferenceChanged()));
187
188 connect(m_preferencesUI->showBgColor , SIGNAL(toggled(bool)) , SLOT(slotPreferenceChanged()));
189 connect(m_preferencesUI->showValueScaleNumbers, SIGNAL(toggled(bool)) , SLOT(slotPreferenceChanged()));
190 connect(m_preferencesUI->enforceGamutMask , SIGNAL(toggled(bool)) , SLOT(slotPreferenceChanged()));
191
192 connect(m_preferencesUI->spLumaR , SIGNAL(valueChanged(qreal)), SLOT(slotColorSpaceSelected()));
193 connect(m_preferencesUI->spLumaG , SIGNAL(valueChanged(qreal)), SLOT(slotColorSpaceSelected()));
194 connect(m_preferencesUI->spLumaB , SIGNAL(valueChanged(qreal)), SLOT(slotColorSpaceSelected()));
195 connect(m_preferencesUI->spLumaGamma , SIGNAL(valueChanged(qreal)), SLOT(slotColorSpaceSelected()));
196
197 connect(m_selectorUI->colorSelector , SIGNAL(sigFgColorChanged(KisColor)) , SLOT(slotFgColorChanged(KisColor)));
198 connect(m_selectorUI->colorSelector , SIGNAL(sigBgColorChanged(KisColor)) , SLOT(slotBgColorChanged(KisColor)));
199
200 connect(m_hsxButtons , SIGNAL(idClicked(int)) , SLOT(slotColorSpaceSelected()));
201
202 setWidget(m_selectorUI);
203}
204
206{
207 m_selectorUI->colorSelector->saveSettings();
208 delete m_hsxButtons;
209}
210
212{
214 m_selectorUI->colorSelector->setFgColor(m_resourceProvider->resourceManager()->foregroundColor());
215 m_selectorUI->colorSelector->setBgColor(m_resourceProvider->resourceManager()->backgroundColor());
216
217 connect(m_resourceProvider, SIGNAL(sigGamutMaskChanged(KoGamutMaskSP)),
218 this, SLOT(slotGamutMaskSet(KoGamutMaskSP)), Qt::UniqueConnection);
219
220 connect(m_resourceProvider, SIGNAL(sigGamutMaskUnset()),
221 this, SLOT(slotGamutMaskUnset()), Qt::UniqueConnection);
222
223 connect(m_resourceProvider, SIGNAL(sigGamutMaskPreviewUpdate()),
224 this, SLOT(slotGamutMaskPreviewUpdate()), Qt::UniqueConnection);
225
226 connect(m_resourceProvider, SIGNAL(sigGamutMaskDeactivated()),
227 this, SLOT(slotGamutMaskDeactivate()), Qt::UniqueConnection);
228
229 m_selectorUI->gamutMaskToolbar->connectMaskSignals(m_resourceProvider);
230}
231
233{
235 m_selectorUI->colorSelector->setFgColor(value.value<KoColor>());
236
238 m_selectorUI->colorSelector->setBgColor(value.value<KoColor>());
239}
240
247
254
256{
257 KisColor::Type type = static_cast<KisColor::Type>(
258 m_hsxButtons->id(m_hsxButtons->checkedButton()));
259
260 m_selectorUI->colorSelector->setColorSpace(type);
261
262 if (type == KisColor::HSY) {
263 m_preferencesUI->lumaCoefficientBox->show();
264 } else {
265 m_preferencesUI->lumaCoefficientBox->hide();
266 }
267
268 m_selectorUI->colorSelector->setLumaCoefficients(
269 m_preferencesUI->spLumaR->value(),
270 m_preferencesUI->spLumaG->value(),
271 m_preferencesUI->spLumaB->value(),
272 m_preferencesUI->spLumaGamma->value()
273 );
274}
275
277{
278 int hueSteps = DEFAULT_HUE_STEPS;
279 if (m_wheelPrefsUI->bnInfHueSteps->isChecked()) {
280 m_wheelPrefsUI->numHueSteps->setEnabled(false);
281 hueSteps = 1;
282 } else {
283 m_wheelPrefsUI->numHueSteps->setEnabled(true);
284 hueSteps = m_wheelPrefsUI->numHueSteps->value();
285 }
286 m_selectorUI->colorSelector->setNumPieces(hueSteps);
287
288 m_selectorUI->colorSelector->setNumRings(m_wheelPrefsUI->numSaturationSteps->value());
289
290 int valueScaleSteps;
291 if (m_wheelPrefsUI->bnInfValueScaleSteps->isChecked()) {
292 m_wheelPrefsUI->numValueScaleSteps->setEnabled(false);
293 valueScaleSteps = 1;
294 } else {
295 valueScaleSteps = m_wheelPrefsUI->numValueScaleSteps->value();
296 m_wheelPrefsUI->numValueScaleSteps->setEnabled(true);
297 }
298 m_selectorUI->colorSelector->setNumLightPieces(valueScaleSteps);
299
300 int defHueSteps;
301 if (m_preferencesUI->bnDefInfHueSteps->isChecked()) {
302 m_preferencesUI->defaultHueSteps->setEnabled(false);
303 defHueSteps = 1;
304 } else {
305 m_preferencesUI->defaultHueSteps->setEnabled(true);
306 defHueSteps = m_preferencesUI->defaultHueSteps->value();
307 }
308 m_selectorUI->colorSelector->setDefaultHueSteps(defHueSteps);
309
310 m_selectorUI->colorSelector->setDefaultSaturationSteps(m_preferencesUI->defaultSaturationSteps->value());
311
312 int defValueScaleSteps;
313 if (m_preferencesUI->bnDefInfValueScaleSteps->isChecked()) {
314 m_preferencesUI->defaultValueScaleSteps->setEnabled(false);
315 defValueScaleSteps = 1;
316 } else {
317 m_preferencesUI->defaultValueScaleSteps->setEnabled(true);
318 defValueScaleSteps = m_preferencesUI->defaultValueScaleSteps->value();
319 }
320 m_selectorUI->colorSelector->setDefaultValueScaleSteps(defValueScaleSteps);
321
322 m_selectorUI->colorSelector->setShowBgColor(m_preferencesUI->showBgColor->isChecked());
323 m_selectorUI->colorSelector->setShowValueScaleNumbers(m_preferencesUI->showValueScaleNumbers->isChecked());
324 m_selectorUI->colorSelector->setEnforceGamutMask(m_preferencesUI->enforceGamutMask->isChecked());
325
326 m_selectorUI->colorSelector->setInverseSaturation(m_wheelPrefsUI->bnInverseSat->isChecked());
327}
328
330{
331 quint32 hueSteps = m_selectorUI->colorSelector->getDefaultHueSteps();
332 quint32 saturationSteps = m_selectorUI->colorSelector->getDefaultSaturationSteps();
333 quint32 valueScaleSteps = m_selectorUI->colorSelector->getDefaultValueScaleSteps();
334
335 m_selectorUI->colorSelector->setNumRings(saturationSteps);
336 m_wheelPrefsUI->numSaturationSteps->blockSignals(true);
337 m_wheelPrefsUI->numSaturationSteps->setValue(saturationSteps);
338 m_wheelPrefsUI->numSaturationSteps->blockSignals(false);
339
340 m_selectorUI->colorSelector->setNumPieces(hueSteps);
341 m_wheelPrefsUI->numHueSteps->blockSignals(true);
342 m_wheelPrefsUI->numHueSteps->setValue(hueSteps);
343 m_wheelPrefsUI->numHueSteps->blockSignals(false);
344
345 if (hueSteps == 1) {
346 m_wheelPrefsUI->numHueSteps->setEnabled(false);
347 m_wheelPrefsUI->bnInfHueSteps->setChecked(true);
348 } else {
349 m_wheelPrefsUI->numHueSteps->setEnabled(true);
350 m_wheelPrefsUI->bnInfHueSteps->setChecked(false);
351 }
352
353 m_selectorUI->colorSelector->setNumLightPieces(valueScaleSteps);
354 m_wheelPrefsUI->numValueScaleSteps->blockSignals(true);
355 m_wheelPrefsUI->numValueScaleSteps->setValue(valueScaleSteps);
356 m_wheelPrefsUI->numValueScaleSteps->blockSignals(false);
357
358 if (valueScaleSteps == 1) {
359 m_wheelPrefsUI->numValueScaleSteps->setEnabled(false);
360 m_wheelPrefsUI->bnInfValueScaleSteps->setChecked(true);
361 } else {
362 m_wheelPrefsUI->numValueScaleSteps->setEnabled(true);
363 m_wheelPrefsUI->bnInfValueScaleSteps->setChecked(false);
364 }
365}
366
368{
369 bool b = (!m_selectedMask) ? false : checked;
370
371 if (b == true) {
372 m_selectorUI->colorSelector->setGamutMask(m_selectedMask);
373 }
374
375 m_selectorUI->colorSelector->setGamutMaskOn(b);
376}
377
379{
380 if (!canvas) {
381 return;
382 }
383
384 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
385
386 if (m_canvas) {
388 }
389
390 if (m_canvas) {
391 connect(m_canvas->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)),
392 SLOT(slotCanvasResourceChanged(int,QVariant)), Qt::UniqueConnection);
393
394 connect(m_canvas->displayColorConverter(), SIGNAL(displayConfigurationChanged()),
395 SLOT(slotSelectorSettingsChanged()), Qt::UniqueConnection);
396
397 m_selectorUI->colorSelector->setColorConverter(m_canvas->displayColorConverter());
398 setEnabled(true);
399 }
400}
401
403{
404 setEnabled(false);
405 m_canvas = nullptr;
406 m_selectorUI->colorSelector->setColorConverter(KisDisplayColorConverter::dumbConverterInstance());
407}
408
410{
411 if (!mask) {
412 return;
413 }
414
415 m_selectedMask = mask;
416
417 if (m_selectedMask) {
418 m_selectorUI->colorSelector->setGamutMask(m_selectedMask);
420 } else {
421 slotGamutMaskToggle(false);
422 }
423}
424
426{
427 if (!m_selectedMask) {
428 return;
429 }
430
431 m_selectedMask = nullptr;
432
433 slotGamutMaskToggle(false);
434 m_selectorUI->colorSelector->setGamutMask(m_selectedMask);
435}
436
438{
439 m_selectorUI->colorSelector->setDirty();
440}
441
446
448{
449 m_selectorUI->colorSelector->setDirty();
450}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void slotFgColorChanged(const KisColor &color)
void slotGamutMaskSet(KoGamutMaskSP mask)
void slotBgColorChanged(const KisColor &color)
void slotCanvasResourceChanged(int key, const QVariant &value)
KisCanvasResourceProvider * m_resourceProvider
WheelPreferencesPopupUI * m_wheelPrefsUI
void setViewManager(KisViewManager *kisview) override
ArtisticColorSelectorUI * m_selectorUI
void setCanvas(KoCanvasBase *canvas) override
KisDisplayColorConverter displayColorConverter
void disconnectCanvasObserver(QObject *object) override
KoCanvasResourceProvider * resourceManager()
KoColor toKoColor() const
static KisDisplayColorConverter * dumbConverterInstance()
Main window for Krita.
KisCanvasResourceProvider * canvasResourceProvider()
QPointer< KoCanvasResourceProvider > resourceManager
void setBackgroundColor(const KoColor &color)
void setForegroundColor(const KoColor &color)
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
static const int MIN_NUM_SATURATION_RINGS
static const int MAX_NUM_HUE_PIECES
static const int MAX_NUM_LIGHT_PIECES
static const int MIN_NUM_HUE_PIECES
static const int MAX_NUM_SATURATION_RINGS
static const int MIN_NUM_UI_HUE_PIECES
static const int MIN_NUM_UI_LIGHT_PIECES
static const int DEFAULT_HUE_STEPS
static const int MIN_NUM_LIGHT_PIECES
QIcon loadIcon(const QString &name)
@ BackgroundColor
The active background color selected for this canvas.
@ ForegroundColor
The active foreground color selected for this canvas.