Krita Source Code Documentation
Loading...
Searching...
No Matches
WGActionManager.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021 Mathias Wein <lynx.mw+kde@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7#include "WGActionManager.h"
8
10#include "WGColorPatches.h"
14#include "WGSelectorPopup.h"
16#include "WGShadeSelector.h"
17
18#include <kis_action.h>
19#include <kis_action_manager.h>
20#include <kis_canvas2.h>
24#include <KisViewManager.h>
26
27#include <QVector4D>
28
30 : QObject(parentDock)
31 , m_docker(parentDock)
32 , m_displayConfig(new WGSelectorDisplayConfig)
33 , m_colorTooltip(new WGColorPreviewToolTip)
34 , m_colorChangeCompressor(new KisSignalCompressor(100 /* ms */, KisSignalCompressor::POSTPONE, this))
35 , m_colorModel(new KisVisualColorModel)
36{
37 m_lastUsedColor.setOpacity(quint8(0));
38 connect(m_colorChangeCompressor, SIGNAL(timeout()), SLOT(slotUpdateDocker()));
39 connect(m_colorModel.data(), SIGNAL(sigChannelValuesChanged(QVector4D,quint32)), SLOT(slotChannelValuesChanged()));
40 connect(WGConfig::notifier(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
41 connect(WGConfig::notifier(), SIGNAL(selectorConfigChanged()), SLOT(slotSelectorConfigChanged()));
43}
44
52
54{
55 Q_UNUSED(oldCanvas);
56 KisDisplayColorConverter *converter = canvas ? canvas->displayColorConverter() : 0;
57 m_displayConfig->setDisplayConverter(converter);
58 if (m_colorSelector) {
59 m_colorSelector->setDisplayRenderer(m_displayConfig->displayConverter()->displayRendererInterface());
60 }
61}
62
64{
65 KisActionManager *actionManager = viewManager->actionManager();
66 KisAction *action;
67 action = actionManager->createAction("show_wg_color_selector");
68 connect(action, SIGNAL(triggered()), SLOT(slotShowColorSelectorPopup()));
69 action = actionManager->createAction("show_wg_shade_selector");
70 connect(action, SIGNAL(triggered()), SLOT(slotShowShadeSelectorPopup()));
71 action = actionManager->createAction("show_wg_mypaint_selector");
72 connect(action, SIGNAL(triggered()), SLOT(slotShowMyPaintSelectorPopup()));
73 action = actionManager->createAction("show_wg_color_history");
74 connect(action, SIGNAL(triggered()), SLOT(slotShowColorHistoryPopup()));
75 action = actionManager->createAction("wgcs_lighten_color");
76 connect(action, SIGNAL(triggered(bool)), SLOT(slotIncreaseLightness()));
77 action = actionManager->createAction("wgcs_darken_color");
78 connect(action, SIGNAL(triggered(bool)), SLOT(slotDecreaseLightness()));
79 action = actionManager->createAction("wgcs_increase_saturation");
80 connect(action, SIGNAL(triggered(bool)), SLOT(slotIncreaseSaturation()));
81 action = actionManager->createAction("wgcs_decrease_saturation");
82 connect(action, SIGNAL(triggered(bool)), SLOT(slotDecreaseSaturation()));
83 action = actionManager->createAction("wgcs_shift_hue_clockwise");
84 connect(action, SIGNAL(triggered(bool)), SLOT(slotShiftHueCW()));
85 action = actionManager->createAction("wgcs_shift_hue_counterclockwise");
86 connect(action, SIGNAL(triggered(bool)), SLOT(slotShiftHueCCW()));
87}
88
93
94void WGActionManager::updateWidgetSize(QWidget *widget, int size)
95{
96 QSizePolicy hsp = widget->sizePolicy();
97 if (hsp.horizontalPolicy() != QSizePolicy::Fixed) {
98 widget->setFixedWidth(size);
99 } else {
100 widget->setFixedWidth(QWIDGETSIZE_MAX); // looks weird, but that really resets min size to 0...
101 }
102 if (hsp.verticalPolicy() != QSizePolicy::Fixed) {
103 widget->setFixedHeight(size);
104 } else {
105 widget->setFixedHeight(QWIDGETSIZE_MAX);
106 }
107}
108
110{
111 // preparations
112 m_isSynchronizing = true;
113 if (m_currentPopup) {
114 m_currentPopup->hide();
115 m_currentPopup = 0;
116 }
117 const KisVisualColorModel &dockerModel = m_docker->colorModel();
118 m_colorModel->copyState(dockerModel);
119 m_colorTooltip->setLastUsedColor(m_displayConfig->displayConverter()->toQColor(m_lastUsedColor));
120 QColor baseCol = m_displayConfig->displayConverter()->toQColor(m_colorModel->currentColor());
123 m_isSynchronizing = false;
124
125 m_currentPopup = popup;
126 popup->slotShowPopup();
127 m_colorTooltip->show(popup);
128}
129
135
136void WGActionManager::modifyHSX(int channel, float amount)
137{
138 if (channel < 0 || channel > 2) {
139 return;
140 }
141 if (m_docker->colorModel().isHSXModel()) {
142 QVector4D channelValues = m_docker->colorModel().channelValues();
143 channelValues[channel] = qBound(0.0f, channelValues[channel] + amount, 1.0f);
144 m_docker->setChannelValues(channelValues);
145 }
146}
147
149{
151 int popupSize = cfg.get(WGConfig::popupSize);
152 bool proofColors = cfg.get(WGConfig::proofToPaintingColors);
153 m_displayConfig->setPreviewInPaintingCS(proofColors);
154
155 if (m_colorSelector) {
157 m_colorSelector->setProofColors(proofColors);
159 }
160 if (m_shadeSelector) {
163 }
164 if (m_myPaintSelector) {
167 }
170 KIS_ASSERT(selector);
171 selector->updateSettings();
172 updateWidgetSize(selector, popupSize);
173 }
174}
175
177{
178 if (m_colorSelector) {
180 KisColorSelectorConfiguration selectorConf = cfg.colorSelectorConfiguration();
181 m_colorSelector->setConfiguration(&selectorConf);
182 }
183}
184
186{
187 if (popup == m_currentPopup) {
188 m_currentPopup = 0;
189 m_colorTooltip->hide();
190 }
191}
192
194{
199 m_colorSelector->setDisplayRenderer(m_displayConfig->displayConverter()->displayRendererInterface());
202 connect(m_colorSelectorPopup, SIGNAL(sigPopupClosed(WGSelectorPopup*)),
204 connect(m_colorSelector, SIGNAL(sigInteraction(bool)), SLOT(slotColorInteraction(bool)));
205
207 }
208
209 // update gamut mask
210 KisCanvas2 *canvas = qobject_cast<KisCanvas2*>(m_docker->observedCanvas());
211 if (canvas) {
212 KisCanvasResourceProvider *resourceProvider = canvas->imageView()->resourceProvider();
213 if (resourceProvider->gamutMaskActive()) {
215 }
216 else {
218 }
219 }
220
222}
223
239
256
258{
259 if (!m_colorHistoryPopup) {
264 history->updateSettings();
267 connect(m_colorHistoryPopup, SIGNAL(sigPopupClosed(WGSelectorPopup*)),
269 connect(history, SIGNAL(sigColorInteraction(bool)), SLOT(slotColorPatchInteraction(bool)));
270 connect(history, SIGNAL(sigColorChanged(KoColor)), SLOT(slotColorSelected(KoColor)));
271 }
273}
274
279
281{
282 modifyHSX(2, -0.1f);
283}
284
289
294
296{
297 modifyHSX(0, 0.1f);
298}
299
301{
302 modifyHSX(0, -0.1f);
303}
304
306{
307 // FIXME: KoColorDisplayRendererInterface's displayConfigurationChanged()
308 // signal (e.g. layer switches) makes the color model Q_EMIT new channel values
309 // and this would overwrite the color resources with outdated data!
310 // so make sure a popup is actually active
313 QColor color = m_displayConfig->displayConverter()->toQColor(m_colorModel->currentColor());
315 }
316}
317
319{
320 if (active) {
321 QColor baseCol = m_displayConfig->displayConverter()->toQColor(m_colorModel->currentColor());
324 }
325}
326
328{
330 if (active && canvas) {
331 KoColor fgColor = canvas->resourceManager()->foregroundColor();
332 QColor baseCol = m_docker->displayColorConverter()->toQColor(fgColor);
335 }
336}
337
338/* Directly set canvas resource for color history,
339 */
341{
342 // CAVEAT: currently, the color history does not allow background color setting
343 if (!m_docker->observedCanvas()) {
344 return;
345 }
346 m_docker->observedCanvas()->resourceManager()->setForegroundColor(color);
347 QColor previewCol = m_docker->displayColorConverter()->toQColor(color);
348 m_colorTooltip->setCurrentColor(previewCol);
349
350}
351
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
A KisActionManager class keeps track of KisActions. These actions are always associated with the GUI....
KisAction * createAction(const QString &name)
KisDisplayColorConverter displayColorConverter
QPointer< KisView > imageView() const
QColor toQColor(const KoColor &c, bool proofToPaintColors=false) const
KisActionManager * actionManager() const
The KisVisualColorModel class allows manipulating a KoColor using various color models.
QVector4D channelValues() const
The KisVisualColorSelector class.
void setRenderMode(RenderMode mode)
void setConfiguration(const KisColorSelectorConfiguration *config)
Explicitly set the shape configuration. Accepts all valid combinations of Advanced Color Selector,...
void setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer) override
void slotGamutMaskChanged(KoGamutMaskSP mask)
QPointer< KoCanvasResourceProvider > resourceManager
KoCanvasBase * observedCanvas() const
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
WGSelectorPopup * m_colorSelectorPopup
void loadColorSelectorSettings(WGConfig::Accessor &cfg)
void slotShowShadeSelectorPopup()
void updateWidgetSize(QWidget *widget, int size)
KisVisualColorModelSP m_colorModel
void slotPopupClosed(WGSelectorPopup *popup)
WGActionManager(WGColorSelectorDock *parentDock=nullptr)
KisSignalCompressor * m_colorChangeCompressor
void slotColorSelected(const KoColor &color)
WGSelectorPopup * m_myPaintSelectorPopup
void slotShowColorSelectorPopup()
void setCanvas(KisCanvas2 *canvas, KisCanvas2 *oldCanvas)
WGColorSelectorDock * m_docker
void slotColorPatchInteraction(bool active)
void slotShowMyPaintSelectorPopup()
void setLastUsedColor(const KoColor &col)
WGSelectorPopup * m_shadeSelectorPopup
WGSelectorPopup * m_currentPopup
WGColorPreviewToolTip * m_colorTooltip
WGShadeSelector * m_shadeSelector
~WGActionManager() override
KisVisualColorSelector * m_colorSelector
void showPopup(WGSelectorPopup *popup)
WGSelectorDisplayConfigSP m_displayConfig
void slotColorInteraction(bool active)
WGMyPaintShadeSelector * m_myPaintSelector
WGSelectorPopup * m_colorHistoryPopup
void registerActions(KisViewManager *viewManager)
void modifyHSX(int channel, float amount)
void setPreset(Preset preset)
void updateSettings() override
void setLastUsedColor(const QColor &color)
void show(const QWidget *focus=nullptr)
void setCurrentColor(const QColor &color)
void setPreviousColor(const QColor &color)
const KisVisualColorModel & colorModel() const
KisDisplayColorConverter * displayColorConverter(bool rawPointer=false) const
KisUniqueColorSet * colorHistory() const
void setChannelValues(const QVector4D &values)
Set new channel values; takes effect immediately!
A port of MyPaint's "Crossed Bowl" color selector.
void setModel(KisVisualColorModelSP model) override
void setSelectorWidget(KisVisualColorSelector *selector)
WGSelectorWidgetBase * selectorWidget() const
void updateSettings() override
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
const NumericSetting< KisVisualColorSelector::RenderMode > selectorRenderMode
Definition WGConfig.cpp:255
WGConfigNotifier * notifier()
Definition WGConfig.cpp:190
class WGConfig Accessor
const GenericSetting< bool > proofToPaintingColors
Definition WGConfig.cpp:237
const NumericSetting< int > popupSize
Definition WGConfig.cpp:244