Krita Source Code Documentation
Loading...
Searching...
No Matches
WGActionManager.cpp
Go to the documentation of this file.
1
2/*
3 * SPDX-FileCopyrightText: 2021 Mathias Wein <lynx.mw+kde@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-3.0-or-later
6 */
7
8#include "WGActionManager.h"
9
10#include "WGColorSelectorDock.h"
11#include "WGColorPatches.h"
15#include "WGSelectorPopup.h"
17#include "WGShadeSelector.h"
18
19#include <kis_action.h>
20#include <kis_action_manager.h>
21#include <kis_canvas2.h>
25#include <KisViewManager.h>
27
28#include <QVector4D>
29
31 : QObject(parentDock)
32 , m_docker(parentDock)
33 , m_displayConfig(new WGSelectorDisplayConfig)
34 , m_colorTooltip(new WGColorPreviewToolTip)
35 , m_colorChangeCompressor(new KisSignalCompressor(100 /* ms */, KisSignalCompressor::POSTPONE, this))
36 , m_colorModel(new KisVisualColorModel)
37{
38 m_lastUsedColor.setOpacity(quint8(0));
39 connect(m_colorChangeCompressor, SIGNAL(timeout()), SLOT(slotUpdateDocker()));
40 connect(m_colorModel.data(), SIGNAL(sigChannelValuesChanged(QVector4D,quint32)), SLOT(slotChannelValuesChanged()));
41 connect(WGConfig::notifier(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
42 connect(WGConfig::notifier(), SIGNAL(selectorConfigChanged()), SLOT(slotSelectorConfigChanged()));
44}
45
53
55{
56 Q_UNUSED(oldCanvas);
57 KisDisplayColorConverter *converter = canvas ? canvas->displayColorConverter() : 0;
58 m_displayConfig->setDisplayConverter(converter);
59 if (m_colorSelector) {
60 m_colorSelector->setDisplayRenderer(m_displayConfig->displayConverter()->displayRendererInterface());
61 }
62}
63
65{
66 KisActionManager *actionManager = viewManager->actionManager();
67 KisAction *action;
68 action = actionManager->createAction("show_wg_color_selector");
69 connect(action, SIGNAL(triggered()), SLOT(slotShowColorSelectorPopup()));
70 action = actionManager->createAction("show_wg_shade_selector");
71 connect(action, SIGNAL(triggered()), SLOT(slotShowShadeSelectorPopup()));
72 action = actionManager->createAction("show_wg_mypaint_selector");
73 connect(action, SIGNAL(triggered()), SLOT(slotShowMyPaintSelectorPopup()));
74 action = actionManager->createAction("show_wg_color_history");
75 connect(action, SIGNAL(triggered()), SLOT(slotShowColorHistoryPopup()));
76 action = actionManager->createAction("wgcs_lighten_color");
77 connect(action, SIGNAL(triggered(bool)), SLOT(slotIncreaseLightness()));
78 action = actionManager->createAction("wgcs_darken_color");
79 connect(action, SIGNAL(triggered(bool)), SLOT(slotDecreaseLightness()));
80 action = actionManager->createAction("wgcs_increase_saturation");
81 connect(action, SIGNAL(triggered(bool)), SLOT(slotIncreaseSaturation()));
82 action = actionManager->createAction("wgcs_decrease_saturation");
83 connect(action, SIGNAL(triggered(bool)), SLOT(slotDecreaseSaturation()));
84 action = actionManager->createAction("wgcs_shift_hue_clockwise");
85 connect(action, SIGNAL(triggered(bool)), SLOT(slotShiftHueCW()));
86 action = actionManager->createAction("wgcs_shift_hue_counterclockwise");
87 connect(action, SIGNAL(triggered(bool)), SLOT(slotShiftHueCCW()));
88}
89
94
95void WGActionManager::updateWidgetSize(QWidget *widget, int size)
96{
97 QSizePolicy hsp = widget->sizePolicy();
98 if (hsp.horizontalPolicy() != QSizePolicy::Fixed) {
99 widget->setFixedWidth(size);
100 } else {
101 widget->setFixedWidth(QWIDGETSIZE_MAX); // looks weird, but that really resets min size to 0...
102 }
103 if (hsp.verticalPolicy() != QSizePolicy::Fixed) {
104 widget->setFixedHeight(size);
105 } else {
106 widget->setFixedHeight(QWIDGETSIZE_MAX);
107 }
108}
109
111{
112 // preparations
113 m_isSynchronizing = true;
114 if (m_currentPopup) {
115 m_currentPopup->hide();
116 m_currentPopup = 0;
117 }
118 const KisVisualColorModel &dockerModel = m_docker->colorModel();
119 m_colorModel->copyState(dockerModel);
120 m_colorTooltip->setLastUsedColor(m_displayConfig->displayConverter()->toQColor(m_lastUsedColor));
121 QColor baseCol = m_displayConfig->displayConverter()->toQColor(m_colorModel->currentColor());
124 m_isSynchronizing = false;
125
126 m_currentPopup = popup;
127 popup->slotShowPopup();
128 m_colorTooltip->show(popup);
129}
130
136
137void WGActionManager::modifyHSX(int channel, float amount)
138{
139 if (channel < 0 || channel > 2) {
140 return;
141 }
142 if (m_docker->colorModel().isHSXModel()) {
143 QVector4D channelValues = m_docker->colorModel().channelValues();
144 channelValues[channel] = qBound(0.0f, channelValues[channel] + amount, 1.0f);
145 m_docker->setChannelValues(channelValues);
146 }
147}
148
150{
152 int popupSize = cfg.get(WGConfig::popupSize);
153 bool proofColors = cfg.get(WGConfig::proofToPaintingColors);
154 m_displayConfig->setPreviewInPaintingCS(proofColors);
155
156 if (m_colorSelector) {
158 m_colorSelector->setProofColors(proofColors);
160 }
161 if (m_shadeSelector) {
164 }
165 if (m_myPaintSelector) {
168 }
171 KIS_ASSERT(selector);
172 selector->updateSettings();
173 updateWidgetSize(selector, popupSize);
174 }
175}
176
178{
179 if (m_colorSelector) {
181 KisColorSelectorConfiguration selectorConf = cfg.colorSelectorConfiguration();
182 m_colorSelector->setConfiguration(&selectorConf);
183 }
184}
185
187{
188 if (popup == m_currentPopup) {
189 m_currentPopup = 0;
190 m_colorTooltip->hide();
191 }
192}
193
195{
200 m_colorSelector->setDisplayRenderer(m_displayConfig->displayConverter()->displayRendererInterface());
203 connect(m_colorSelectorPopup, SIGNAL(sigPopupClosed(WGSelectorPopup*)),
205 connect(m_colorSelector, SIGNAL(sigInteraction(bool)), SLOT(slotColorInteraction(bool)));
206
208 }
209
210 // update gamut mask
211 KisCanvas2 *canvas = qobject_cast<KisCanvas2*>(m_docker->observedCanvas());
212 if (canvas) {
213 KisCanvasResourceProvider *resourceProvider = canvas->imageView()->resourceProvider();
214 if (resourceProvider->gamutMaskActive()) {
216 }
217 else {
219 }
220 }
221
223}
224
240
257
259{
260 if (!m_colorHistoryPopup) {
262 // when settings or a document changes, the model is switched in updateColorHistoryModel()
266 history->updateSettings();
269 connect(m_colorHistoryPopup, SIGNAL(sigPopupClosed(WGSelectorPopup*)),
271 connect(history, SIGNAL(sigColorInteraction(bool)), SLOT(slotColorPatchInteraction(bool)));
272 connect(history, SIGNAL(sigColorChanged(KoColor)), SLOT(slotColorSelected(KoColor)));
273 }
275}
276
281
283{
284 modifyHSX(2, -0.1f);
285}
286
291
296
298{
299 modifyHSX(0, 0.1f);
300}
301
303{
304 modifyHSX(0, -0.1f);
305}
306
308{
309 // FIXME: KoColorDisplayRendererInterface's displayConfigurationChanged()
310 // signal (e.g. layer switches) makes the color model Q_EMIT new channel values
311 // and this would overwrite the color resources with outdated data!
312 // so make sure a popup is actually active
315 QColor color = m_displayConfig->displayConverter()->toQColor(m_colorModel->currentColor());
317 }
318}
319
321{
322 if (active) {
323 QColor baseCol = m_displayConfig->displayConverter()->toQColor(m_colorModel->currentColor());
326 }
327}
328
330{
332 if (active && canvas) {
333 KoColor fgColor = canvas->resourceManager()->foregroundColor();
334 QColor baseCol = m_docker->displayColorConverter()->toQColor(fgColor);
337 }
338}
339
340/* Directly set canvas resource for color history,
341 */
343{
344 // CAVEAT: currently, the color history does not allow background color setting
345 if (!m_docker->observedCanvas()) {
346 return;
347 }
348 m_docker->observedCanvas()->resourceManager()->setForegroundColor(color);
349 QColor previewCol = m_docker->displayColorConverter()->toQColor(color);
350 m_colorTooltip->setCurrentColor(previewCol);
351
352}
353
358
360{
361 if (!m_colorHistoryPopup) return;
362
364 if (history) {
366 }
367}
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
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 setColorHistoryModel(KisUniqueColorSet *history)
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)
KisUniqueColorSet * colorHistoryModel() const
const KisVisualColorModel & colorModel() const
KisDisplayColorConverter * displayColorConverter(bool rawPointer=false) 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:256
WGConfigNotifier * notifier()
Definition WGConfig.cpp:190
class WGConfig Accessor
const GenericSetting< bool > proofToPaintingColors
Definition WGConfig.cpp:237
const NumericSetting< int > popupSize
Definition WGConfig.cpp:245