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

KisNodeCommandsAdapterm_commandsAdapter
 
QPointer< KisViewm_imageView
 
KisViewManagerm_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 47 of file kis_mask_manager.cc.

48 : m_view(view)
49 , m_imageView(0)
51{
52}
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 86 of file kis_mask_manager.cc.

87{
88 Q_UNUSED(mask);
89}

◆ activeDevice()

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

Definition at line 80 of file kis_mask_manager.cc.

81{
82 KisMaskSP mask = activeMask();
83 return mask ? mask->paintDevice() : 0;
84}
KisMaskSP activeMask()
KisPaintDeviceSP paintDevice() const override
Definition kis_mask.cc:223

References activeMask(), and KisMask::paintDevice().

◆ activeMask()

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

Definition at line 72 of file kis_mask_manager.cc.

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

References m_imageView.

◆ adjustMaskPosition()

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

Definition at line 96 of file kis_mask_manager.cc.

97{
98 Q_ASSERT(node);
99 Q_ASSERT(activeNode);
100
101 if (!avoidActiveNode && activeNode->allowAsChild(node)) {
102 parent = activeNode;
103 above = activeNode->lastChild();
104 } else if (activeNode->parent() && activeNode->parent()->allowAsChild(node)
105 && activeNode->parent()->parent() /* we don't want to add masks to root */) {
106 parent = activeNode->parent();
107 above = activeNode;
108 } else {
109 KisNodeSP t = activeNode;
110 while ((t = t->nextSibling())) {
111 if (t->allowAsChild(node)) {
112 parent = t;
113 above = t->lastChild();
114 break;
115 }
116 }
117
118 if (!t) {
119 t = activeNode;
120 while ((t = t->prevSibling())) {
121 if (t->allowAsChild(node)) {
122 parent = t;
123 above = t->lastChild();
124 break;
125 }
126 }
127 }
128
129 if (!t && activeNode->parent()) {
130 adjustMaskPosition(node, activeNode->parent(), true, parent, above);
131 } else if (!t) {
132 KisImageWSP image = m_view->image();
133 KisLayerSP layer = new KisPaintLayer(image.data(), image->nextLayerName(), OPACITY_OPAQUE_U8, image->colorSpace());
134 m_commandsAdapter->addNode(layer, activeNode, 0);
135
136 parent = layer;
137 above = 0;
138 }
139 }
140}
const quint8 OPACITY_OPAQUE_U8
const KoColorSpace * colorSpace() const
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:715
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 275 of file kis_mask_manager.cc.

276{
277 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
278
280 createMaskCommon(mask, activeNode, 0, kundo2_i18n("Add Colorize Mask"), "KisColorizeMask", i18n("Colorize Mask"), true, false);
281 mask->initializeCompositeOp();
282 delete mask->setColorSpace(mask->parent()->colorSpace());
283 return mask;
284}
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 296 of file kis_mask_manager.cc.

297{
298 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
299
300 KisLayerSP activeLayer = qobject_cast<KisLayer*>(activeNode.data());
301 Q_ASSERT(activeLayer);
302
305 if (!filter) return nullptr;
306
307 m_commandsAdapter->beginMacro(kundo2_i18n("Add Fast Color Overlay"));
308
309 KisFilterMaskSP mask = new KisFilterMask(m_view->image(), "");
310 mask->initSelection(activeLayer);
311 mask->setName(createMaskNameCommon(activeLayer, "KisFilterMask", i18n("Color Overlay Mask")));
312 mask->setFilter(filter->cloneWithResourcesSnapshot());
313
314 KisImageLayerAddCommand::Flags flags =
317
318 if (activeLayer->childCount() == 0) {
321 activeNode, true));
322
324 };
325
326 m_commandsAdapter->addNode(mask, activeLayer, activeLayer->lastChild(), flags);
327
329
330 return mask;
331}
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 224 of file kis_mask_manager.cc.

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

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

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

◆ createMaskNameCommon()

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

Definition at line 190 of file kis_mask_manager.cc.

191{
193 int number = masks.count() + 1;
194 return desiredName + QString(" ") + QString::number(number);
195}
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 197 of file kis_mask_manager.cc.

198{
199 if (!m_view->nodeManager()->canModifyLayer(activeNode)) return 0;
200
202
203 createMaskCommon(mask, activeNode, copyFrom, kundo2_i18n("Add Selection Mask"), "KisSelectionMask", i18n("Selection"), false, convertActiveNode, false);
204 mask->setActive(true);
205 if (convertActiveNode) {
206 m_commandsAdapter->removeNode(activeNode);
207 }
208 return mask;
209}
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 287 of file kis_mask_manager.cc.

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

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 211 of file kis_mask_manager.cc.

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

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 333 of file kis_mask_manager.cc.

334{
335 if (!activeMask()) return;
336
337 if (!m_view->nodeManager()->canModifyLayer(activeMask())) return;
338
339 if (activeMask()->inherits("KisFilterMask")) {
340 KisFilterMask *mask = static_cast<KisFilterMask*>(activeMask().data());
341
342 KisLayerSP layer = qobject_cast<KisLayer*>(mask->parent().data());
343 if (! layer)
344 return;
345
346
347 KisPaintDeviceSP dev = layer->original();
348 if (!dev) {
349 return;
350 }
351
352 KisDlgAdjLayerProps dlg(layer, mask, dev, m_view, mask->filter().data(), mask->name(), i18n("Filter Mask Properties"), m_view->mainWindowAsQWidget(), "dlgeffectmaskprops");
353
354 KisFilterConfigurationSP configBefore(mask->filter());
355 Q_ASSERT(configBefore);
356 QString xmlBefore = configBefore->toXML();
357
358 if (dlg.exec() == QDialog::Accepted) {
359
360 KisFilterConfigurationSP configAfter(dlg.filterConfiguration());
361 Q_ASSERT(configAfter);
362 QString xmlAfter = configAfter->toXML();
363
364 mask->setName(dlg.layerName());
365
366 if(xmlBefore != xmlAfter) {
368 = new KisChangeFilterCmd(mask,
369 configBefore->cloneWithResourcesSnapshot(),
370 configAfter->cloneWithResourcesSnapshot());
371
372 // FIXME: check whether is needed
373 cmd->redo();
375 m_view->document()->setModified(true);
376 }
377 }
378 else {
379 KisFilterConfigurationSP configAfter(dlg.filterConfiguration());
380 Q_ASSERT(configAfter);
381 QString xmlAfter = configAfter->toXML();
382
383 if(xmlBefore != xmlAfter) {
384 mask->setFilter(configBefore->cloneWithResourcesSnapshot());
385 mask->setDirty();
386 }
387 }
388
389 } else {
390 // Not much to show for transparency or selection masks?
391 }
392}
void setModified(bool _mod)
void setFilter(KisFilterConfigurationSP filterConfig, bool checkCompareConfig=true) override
virtual KisFilterConfigurationSP filter() const
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
QString name() const
KisPaintDeviceSP original() const override=0
virtual void setDirty()
Definition kis_node.cpp:577

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

◆ masksUpdated()

void KisMaskManager::masksUpdated ( )
private

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

Definition at line 91 of file kis_mask_manager.cc.

92{
94}

References m_view, and KisViewManager::updateGUI().

◆ setup()

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

Definition at line 59 of file kis_mask_manager.cc.

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

◆ setView()

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

Definition at line 54 of file kis_mask_manager.cc.

55{
56 m_imageView = imageView;
57}

References m_imageView.

◆ updateGUI()

void KisMaskManager::updateGUI ( )
private

Definition at line 65 of file kis_mask_manager.cc.

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

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: