Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMaskManager Class Reference

#include <kis_mask_manager.h>

+ Inheritance diagram for KisMaskManager:

Public Member Functions

 KisMaskManager (KisViewManager *view)
 
void setView (QPointer< KisView >view)
 
 ~KisMaskManager () override
 

Private Member Functions

void activateMask (KisMaskSP mask)
 
KisPaintDeviceSP activeDevice ()
 
KisMaskSP activeMask ()
 
void adjustMaskPosition (KisNodeSP node, KisNodeSP activeNode, bool avoidActiveNode, KisNodeSP &parent, KisNodeSP &above)
 
KisNodeSP createColorizeMask (KisNodeSP activeNode)
 
KisNodeSP createFastColorOverlayMask (KisNodeSP activeNode)
 
KisNodeSP createFilterMask (KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool quiet, bool convertActiveNode)
 
void createMaskCommon (KisMaskSP mask, KisNodeSP activeNode, KisPaintDeviceSP copyFrom, const KUndo2MagicString &macroName, const QString &nodeType, const QString &nodeName, bool suppressSelection, bool avoidActiveNode, bool updateImage=true)
 
QString createMaskNameCommon (KisNodeSP targetNode, const QString &nodeType, const QString &desiredName)
 
KisNodeSP createSelectionMask (KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool convertActiveNode)
 
KisNodeSP createTransformMask (KisNodeSP activeNode)
 
KisNodeSP createTransparencyMask (KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool convertActiveNode)
 
void maskProperties ()
 
void masksUpdated ()
 
void setup (KisKActionCollection *actionCollection, KisActionManager *actionManager)
 
void updateGUI ()
 

Private Attributes

KisNodeCommandsAdapter * m_commandsAdapter
 
QPointer< KisView > m_imageView
 
KisViewManager * m_view
 

Friends

class KisNodeManager
 

Detailed Description

Handle the gui for manipulating masks.

Definition at line 25 of file kis_mask_manager.h.

Constructor & Destructor Documentation

◆ KisMaskManager()

KisMaskManager::KisMaskManager ( KisViewManager * view)

Definition at line 48 of file kis_mask_manager.cc.

49 : m_view(view)
50 , m_imageView(0)
52{
53}
KisNodeCommandsAdapter * m_commandsAdapter
KisViewManager * m_view
QPointer< KisView > m_imageView

◆ ~KisMaskManager()

KisMaskManager::~KisMaskManager ( )
inlineoverride

Definition at line 34 of file kis_mask_manager.h.

34{}

Member Function Documentation

◆ activateMask()

void KisMaskManager::activateMask ( KisMaskSP mask)
private

Activate a new mask. There can be only one mask active per view; and if the mask is active, it becomes the paint device.

Definition at line 87 of file kis_mask_manager.cc.

88{
89 Q_UNUSED(mask);
90}

◆ activeDevice()

KisPaintDeviceSP KisMaskManager::activeDevice ( )
private
Returns
the paint device associated with the currently active mask, if there is one.

Definition at line 81 of file kis_mask_manager.cc.

82{
83 KisMaskSP mask = activeMask();
84 return mask ? mask->paintDevice() : 0;
85}
KisMaskSP activeMask()

References activeMask().

◆ activeMask()

KisMaskSP KisMaskManager::activeMask ( )
private
Returns
the active mask, if there is one

Definition at line 73 of file kis_mask_manager.cc.

74{
75 if (m_imageView) {
76 return m_imageView->currentMask();
77 }
78 return 0;
79}

References m_imageView.

◆ adjustMaskPosition()

void KisMaskManager::adjustMaskPosition ( KisNodeSP node,
KisNodeSP activeNode,
bool avoidActiveNode,
KisNodeSP & parent,
KisNodeSP & above )
private

Definition at line 97 of file kis_mask_manager.cc.

98{
99 Q_ASSERT(node);
100 Q_ASSERT(activeNode);
101
102 if (!avoidActiveNode && activeNode->allowAsChild(node)) {
103 parent = activeNode;
104 above = activeNode->lastChild();
105 } else if (activeNode->parent() && activeNode->parent()->allowAsChild(node)
106 && activeNode->parent()->parent() /* we don't want to add masks to root */) {
107 parent = activeNode->parent();
108 above = activeNode;
109 } else {
110 KisNodeSP t = activeNode;
111 while ((t = t->nextSibling())) {
112 if (t->allowAsChild(node)) {
113 parent = t;
114 above = t->lastChild();
115 break;
116 }
117 }
118
119 if (!t) {
120 t = activeNode;
121 while ((t = t->prevSibling())) {
122 if (t->allowAsChild(node)) {
123 parent = t;
124 above = t->lastChild();
125 break;
126 }
127 }
128 }
129
130 if (!t && activeNode->parent()) {
131 adjustMaskPosition(node, activeNode->parent(), true, parent, above);
132 } else if (!t) {
133 KisImageWSP image = m_view->image();
134 KisLayerSP layer = new KisPaintLayer(image.data(), image->nextLayerName(), OPACITY_OPAQUE_U8, image->colorSpace());
135 m_commandsAdapter->addNode(layer, activeNode, 0);
136
137 parent = layer;
138 above = 0;
139 }
140 }
141}
const quint8 OPACITY_OPAQUE_U8
const KoColorSpace * colorSpace() const
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:741
void adjustMaskPosition(KisNodeSP node, KisNodeSP activeNode, bool avoidActiveNode, KisNodeSP &parent, KisNodeSP &above)
void addNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis, KisImageLayerAddCommand::Flags flags=KisImageLayerAddCommand::DoRedoUpdates|KisImageLayerAddCommand::DoUndoUpdates)
KisImageWSP image() const
Return the image this view is displaying.
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
KisNodeSP prevSibling() const
Definition kis_node.cpp:402
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP lastChild() const
Definition kis_node.cpp:367
KisNodeSP nextSibling() const
Definition kis_node.cpp:408
virtual bool allowAsChild(KisNodeSP) const =0

References KisNodeCommandsAdapter::addNode(), adjustMaskPosition(), KisNode::allowAsChild(), KisImage::colorSpace(), KisWeakSharedPtr< T >::data(), KisViewManager::image(), KisNode::lastChild(), m_commandsAdapter, m_view, KisImage::nextLayerName(), KisNode::nextSibling(), OPACITY_OPAQUE_U8, KisNode::parent, and KisNode::prevSibling().

◆ createColorizeMask()

KisNodeSP KisMaskManager::createColorizeMask ( KisNodeSP activeNode)
private

Definition at line 276 of file kis_mask_manager.cc.

277{
278 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
279
281 createMaskCommon(mask, activeNode, 0, kundo2_i18n("Add Colorize Mask"), "KisColorizeMask", i18n("Colorize Mask"), true, false);
282 mask->initializeCompositeOp();
283 delete mask->setColorSpace(mask->parent()->colorSpace());
284 return mask;
285}
KUndo2Command * setColorSpace(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KoUpdater *progressUpdater=nullptr)
void createMaskCommon(KisMaskSP mask, KisNodeSP activeNode, KisPaintDeviceSP copyFrom, const KUndo2MagicString &macroName, const QString &nodeType, const QString &nodeName, bool suppressSelection, bool avoidActiveNode, bool updateImage=true)
bool canModifyLayer(KisNodeSP node, bool showWarning=true)
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
KUndo2MagicString kundo2_i18n(const char *text)
virtual const KoColorSpace * colorSpace() const =0

References KisNodeManager::canModifyLayer(), KisBaseNode::colorSpace(), createMaskCommon(), KisViewManager::image(), KisColorizeMask::initializeCompositeOp(), kundo2_i18n(), m_view, KisViewManager::nodeManager(), KisNode::parent, and KisColorizeMask::setColorSpace().

◆ createFastColorOverlayMask()

KisNodeSP KisMaskManager::createFastColorOverlayMask ( KisNodeSP activeNode)
private

Definition at line 297 of file kis_mask_manager.cc.

298{
299 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
300
301 KisLayerSP activeLayer = qobject_cast<KisLayer*>(activeNode.data());
302 Q_ASSERT(activeLayer);
303
306 if (!filter) return nullptr;
307
308 m_commandsAdapter->beginMacro(kundo2_i18n("Add Fast Color Overlay"));
309
310 KisFilterMaskSP mask = new KisFilterMask(m_view->image(), "");
311 mask->initSelection(activeLayer);
312 mask->setName(createMaskNameCommon(activeLayer, "KisFilterMask", i18n("Color Overlay Mask")));
313 mask->setFilter(filter->cloneWithResourcesSnapshot());
314
315 KisImageLayerAddCommand::Flags flags =
318
319 if (activeLayer->childCount() == 0) {
322 activeNode, true));
323
325 };
326
327 m_commandsAdapter->addNode(mask, activeLayer, activeLayer->lastChild(), flags);
328
330
331 return mask;
332}
static KisFilterRegistry * instance()
static KisResourcesInterfaceSP instance()
QString createMaskNameCommon(KisNodeSP targetNode, const QString &nodeType, const QString &desiredName)
void addExtraCommand(KUndo2Command *command)
void beginMacro(const KUndo2MagicString &macroName)
const T value(const QString &id) const
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const
quint32 childCount() const
Definition kis_node.cpp:414

References KisNodeCommandsAdapter::addExtraCommand(), KisNodeCommandsAdapter::addNode(), KisNodeCommandsAdapter::beginMacro(), KisNodeManager::canModifyLayer(), KisNode::childCount(), createMaskNameCommon(), KisSharedPtr< T >::data(), KisBaseProcessor::defaultConfiguration(), KisImageLayerAddCommand::DontActivateOnAddition, KisImageLayerAddCommand::DoRedoUpdates, KisImageLayerAddCommand::DoUndoUpdates, KisNodeCommandsAdapter::endMacro(), KisViewManager::image(), KisFilterRegistry::instance(), KisGlobalResourcesInterface::instance(), kundo2_i18n(), KisNode::lastChild(), m_commandsAdapter, m_view, KisViewManager::nodeManager(), and KoGenericRegistry< T >::value().

◆ createFilterMask()

KisNodeSP KisMaskManager::createFilterMask ( KisNodeSP activeNode,
KisPaintDeviceSP copyFrom,
bool quiet,
bool convertActiveNode )
private

FIXME: We'll use layer's original for creation of a thumbnail. Actually, we can't use it's projection as newly created mask may be going to be inserted in the middle of the masks stack

Definition at line 225 of file kis_mask_manager.cc.

226{
227 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
228
229 KisFilterMaskSP mask = new KisFilterMask(m_view->image(), "");
230 createMaskCommon(mask, activeNode, copyFrom, kundo2_i18n("Add Filter Mask"), "KisFilterMask", i18n("Filter Mask"), false, convertActiveNode);
231
232 if (convertActiveNode) {
233 m_commandsAdapter->removeNode(activeNode);
234 }
235
241 KisPaintDeviceSP originalDevice = mask->parent()->original();
242
243
244 KisDlgAdjustmentLayer dialog(mask, mask.data(), originalDevice,
245 mask->name(), i18n("New Filter Mask"),
246 m_view, qApp->activeWindow());
247
248 // If we are supposed to not disturb the user, don't start asking them about things.
249 if(quiet) {
251 if (filter) {
252 mask->setFilter(filter->cloneWithResourcesSnapshot());
253 mask->setName(mask->name());
254 }
255 return mask;
256 }
257
258 if (dialog.exec() == QDialog::Accepted) {
259 KisFilterConfigurationSP filter = dialog.filterConfiguration();
260 if (filter) {
261 QString name = dialog.layerName();
262 mask->setFilter(filter->cloneWithResourcesSnapshot());
263 mask->setName(name);
264 }
265
266 return mask;
267
268 } else {
270 }
271
272 return 0;
273}
QList< T > values() const
const char * name(StandardAction id)

References KisNodeManager::canModifyLayer(), createMaskCommon(), KisSharedPtr< T >::data(), KisViewManager::image(), KisFilterRegistry::instance(), KisGlobalResourcesInterface::instance(), kundo2_i18n(), m_commandsAdapter, m_view, KisViewManager::nodeManager(), KisNodeCommandsAdapter::removeNode(), KisNodeCommandsAdapter::undoLastCommand(), and KoGenericRegistry< T >::values().

◆ createMaskCommon()

void KisMaskManager::createMaskCommon ( KisMaskSP mask,
KisNodeSP activeNode,
KisPaintDeviceSP copyFrom,
const KUndo2MagicString & macroName,
const QString & nodeType,
const QString & nodeName,
bool suppressSelection,
bool avoidActiveNode,
bool updateImage = true )
private

Definition at line 143 of file kis_mask_manager.cc.

152{
153 m_commandsAdapter->beginMacro(macroName);
154
156 KisNodeSP above;
157 adjustMaskPosition(mask, activeNode, avoidActiveNode, parent, above);
158
159 KisLayerSP parentLayer = qobject_cast<KisLayer*>(parent.data());
160 Q_ASSERT(parentLayer);
161
162 bool shouldDeselectGlobalSelection = false;
163
164 if (!suppressSelection) {
165 if (copyFrom) {
166 mask->initSelection(copyFrom, parentLayer);
167 } else {
168 mask->initSelection(m_view->selection(), parentLayer);
169 shouldDeselectGlobalSelection = m_view->selection();
170 }
171 }
172
173 mask->setName( createMaskNameCommon(parentLayer, nodeType, nodeName) );
174
175 KisImageLayerAddCommand::Flags flags =
176 updateImage ?
179
180 m_commandsAdapter->addNode(mask, parentLayer, above, flags);
181
182 if (shouldDeselectGlobalSelection) {
184 }
185
187
188 masksUpdated();
189}
char nodeType(const KoPathPoint *point)
The command for deselection the global selection of KisImage.
KisSelectionSP selection()

References KisNodeCommandsAdapter::addExtraCommand(), KisNodeCommandsAdapter::addNode(), adjustMaskPosition(), KisNodeCommandsAdapter::beginMacro(), createMaskNameCommon(), KisImageLayerAddCommand::DoRedoUpdates, KisImageLayerAddCommand::DoUndoUpdates, KisNodeCommandsAdapter::endMacro(), m_commandsAdapter, m_imageView, m_view, masksUpdated(), nodeType(), KisImageLayerAddCommand::None, and KisViewManager::selection().

◆ createMaskNameCommon()

QString KisMaskManager::createMaskNameCommon ( KisNodeSP targetNode,
const QString & nodeType,
const QString & desiredName )
private

Definition at line 191 of file kis_mask_manager.cc.

192{
194 int number = masks.count() + 1;
195 return desiredName + QString(" ") + QString::number(number);
196}
QList< QString > QStringList
QList< KisNodeSP > childNodes(const QStringList &nodeTypes, const KoProperties &properties) const
Definition kis_node.cpp:439

References KisNode::childNodes(), and nodeType().

◆ createSelectionMask()

KisNodeSP KisMaskManager::createSelectionMask ( KisNodeSP activeNode,
KisPaintDeviceSP copyFrom,
bool convertActiveNode )
private

Definition at line 198 of file kis_mask_manager.cc.

199{
200 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
201
203
204 createMaskCommon(mask, activeNode, copyFrom, kundo2_i18n("Add Selection Mask"), "KisSelectionMask", i18n("Selection"), false, convertActiveNode, false);
205 mask->setActive(true);
206 if (convertActiveNode) {
207 m_commandsAdapter->removeNode(activeNode);
208 }
209 return mask;
210}
void setActive(bool active)

References KisNodeManager::canModifyLayer(), createMaskCommon(), KisViewManager::image(), kundo2_i18n(), m_commandsAdapter, m_view, KisViewManager::nodeManager(), KisNodeCommandsAdapter::removeNode(), and KisSelectionMask::setActive().

◆ createTransformMask()

KisNodeSP KisMaskManager::createTransformMask ( KisNodeSP activeNode)
private

Definition at line 288 of file kis_mask_manager.cc.

289{
290 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
291
293 createMaskCommon(mask, activeNode, 0, kundo2_i18n("Add Transform Mask"), "KisTransformMask", i18n("Transform Mask"), true, false);
294 return mask;
295}

References KisNodeManager::canModifyLayer(), createMaskCommon(), KisViewManager::image(), kundo2_i18n(), m_view, and KisViewManager::nodeManager().

◆ createTransparencyMask()

KisNodeSP KisMaskManager::createTransparencyMask ( KisNodeSP activeNode,
KisPaintDeviceSP copyFrom,
bool convertActiveNode )
private

Definition at line 212 of file kis_mask_manager.cc.

213{
214 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
215
216 KisMaskSP mask = new KisTransparencyMask(m_view->image(), "");
217 createMaskCommon(mask, activeNode, copyFrom, kundo2_i18n("Add Transparency Mask"), "KisTransparencyMask", i18n("Transparency Mask"), false, convertActiveNode);
218 if (convertActiveNode) {
219 m_commandsAdapter->removeNode(activeNode);
220 }
221 return mask;
222}

References KisNodeManager::canModifyLayer(), createMaskCommon(), KisViewManager::image(), kundo2_i18n(), m_commandsAdapter, m_view, KisViewManager::nodeManager(), and KisNodeCommandsAdapter::removeNode().

◆ maskProperties()

void KisMaskManager::maskProperties ( )
private

Show the mask properties dialog

Definition at line 334 of file kis_mask_manager.cc.

335{
336 if (!activeMask()) return;
337
338 if (!m_view->nodeManager()->canModifyLayer(activeMask())) return;
339
340 if (activeMask()->inherits("KisFilterMask")) {
341 KisFilterMask *mask = static_cast<KisFilterMask*>(activeMask().data());
342
343 KisLayerSP layer = qobject_cast<KisLayer*>(mask->parent().data());
344 if (! layer)
345 return;
346
347
348 KisPaintDeviceSP dev = layer->original();
349 if (!dev) {
350 return;
351 }
352
353 KisDlgAdjustmentLayer dlg(mask, mask, dev, mask->name(),
354 i18n("Filter Mask Properties"), m_view,
355 m_view->mainWindowAsQWidget(), mask->filter());
356
357 KisFilterConfigurationSP configBefore(mask->filter());
358 Q_ASSERT(configBefore);
359 QString xmlBefore = configBefore->toXML();
360
361 if (dlg.exec() == QDialog::Accepted) {
362
363 KisFilterConfigurationSP configAfter(dlg.filterConfiguration());
364 Q_ASSERT(configAfter);
365 QString xmlAfter = configAfter->toXML();
366
367 KUndo2Command *cmd = nullptr;
368
369 if(xmlBefore != xmlAfter) {
371 new KisChangeFilterCmd(mask,
372 configBefore->cloneWithResourcesSnapshot(),
373 configAfter->cloneWithResourcesSnapshot()));
374 }
375
376 if (mask->name() != dlg.layerName()) {
378 new KisNodeRenameCommand(mask, mask->name(), dlg.layerName()));
379 }
380
381 if (cmd) {
383 m_view->document()->setModified(true);
384 }
385 }
386 else {
387 KisFilterConfigurationSP configAfter(dlg.filterConfiguration());
388 Q_ASSERT(configAfter);
389 QString xmlAfter = configAfter->toXML();
390
391 if(xmlBefore != xmlAfter) {
392 mask->setFilter(configBefore->cloneWithResourcesSnapshot());
393 mask->setDirty();
394 }
395 }
396
397 } else {
398 // Not much to show for transparency or selection masks?
399 }
400}
void setModified(bool _mod)
void setFilter(KisFilterConfigurationSP filterConfig, bool checkCompareConfig=true) override
virtual KisFilterConfigurationSP filter() const
The command for setting the node's name.
virtual void addCommand(KUndo2Command *cmd)=0
KisDocument * document() const
KisUndoAdapter * undoAdapter()
The undo adapter is used to add commands to the undo stack.
QWidget * mainWindowAsQWidget() const
KUndo2Command * composeCommands(KUndo2Command *parent, KUndo2Command *cmd)
QString name() const
KisPaintDeviceSP original() const override=0
virtual void setDirty()
Definition kis_node.cpp:577

References activeMask(), KisUndoAdapter::addCommand(), KisNodeManager::canModifyLayer(), KisCommandUtils::composeCommands(), KisSharedPtr< T >::data(), KisWeakSharedPtr< T >::data(), KisViewManager::document(), KisNodeFilterInterface::filter(), KisDlgAdjustmentLayer::filterConfiguration(), KisDlgAdjustmentLayer::layerName(), m_view, KisViewManager::mainWindowAsQWidget(), KisBaseNode::name(), KisViewManager::nodeManager(), KisLayer::original(), KisNode::parent, KisNode::setDirty(), KisFilterMask::setFilter(), KisDocument::setModified(), and KisViewManager::undoAdapter().

◆ masksUpdated()

void KisMaskManager::masksUpdated ( )
private

called whenever the mask stack is updated to enable/disable all menu items

Definition at line 92 of file kis_mask_manager.cc.

93{
95}

References m_view, and KisViewManager::updateGUI().

◆ setup()

void KisMaskManager::setup ( KisKActionCollection * actionCollection,
KisActionManager * actionManager )
private

Definition at line 60 of file kis_mask_manager.cc.

61{
62 Q_UNUSED(actionCollection);
63 Q_UNUSED(actionManager);
64}

◆ setView()

void KisMaskManager::setView ( QPointer< KisView > view)

Definition at line 55 of file kis_mask_manager.cc.

56{
57 m_imageView = imageView;
58}

References m_imageView.

◆ updateGUI()

void KisMaskManager::updateGUI ( )
private

Definition at line 66 of file kis_mask_manager.cc.

67{
68 // XXX: enable/disable menu items according to whether there's a mask selected currently
69 // XXX: disable the selection mask item if there's already a selection mask
70 // YYY: doesn't KisAction do that already?
71}

Friends And Related Symbol Documentation

◆ KisNodeManager

friend class KisNodeManager
friend

Definition at line 39 of file kis_mask_manager.h.

Member Data Documentation

◆ m_commandsAdapter

KisNodeCommandsAdapter* KisMaskManager::m_commandsAdapter
private

Definition at line 86 of file kis_mask_manager.h.

◆ m_imageView

QPointer<KisView> KisMaskManager::m_imageView
private

Definition at line 85 of file kis_mask_manager.h.

◆ m_view

KisViewManager* KisMaskManager::m_view
private

Definition at line 84 of file kis_mask_manager.h.


The documentation for this class was generated from the following files: