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

#include <kis_node_manager.h>

+ Inheritance diagram for KisNodeManager:

Classes

struct  Private
 

Public Slots

void activateNextNode (bool siblingsOnly=false)
 
void activateNextSiblingNode ()
 
void activatePreviousNode (bool siblingsOnly=false)
 
void activatePreviousSiblingNode ()
 
void addNodesDirect (KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
 
void changeCloneSource ()
 pop up a window for changing the source of the selected Clone Layers
 
void changeIsolationMode (bool isolateActiveLayer, bool isolateActiveGroup)
 
void changeIsolationRoot (KisNodeSP isolationRoot)
 
void colorOverlayMaskProperties (KisNodeSP node)
 
void convertNode (const QString &nodeType)
 
void copyLayersToClipboard ()
 
void copyNodesDirect (KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
 
void createFromVisible ()
 
KisNodeSP createNode (const QString &nodeType, bool quiet=false, KisPaintDeviceSP copyFrom=0)
 
void createQuickClippingGroup ()
 
void createQuickGroup ()
 
void createReferenceImage (bool fromLayer)
 
void createReferenceImageFromLayer ()
 
void createReferenceImageFromVisible ()
 
void cutLayersToClipboard ()
 
void duplicateActiveNode ()
 
void handleExternalIsolationChange ()
 
void lowerNode ()
 
void mirrorAllNodesX ()
 
void mirrorAllNodesY ()
 
void mirrorNode (KisNodeSP node, const KUndo2MagicString &commandName, Qt::Orientation orientation, KisSelectionSP selection)
 
void mirrorNodes (KisNodeList nodes, const KUndo2MagicString &commandName, Qt::Orientation orientation, KisSelectionSP selection)
 
void mirrorNodeX ()
 
void mirrorNodeY ()
 
void moveNodeAt (KisNodeSP node, KisNodeSP parent, int index)
 
void moveNodesDirect (KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
 
void nodeCompositeOpChanged (const KoCompositeOp *op)
 
void nodeOpacityChanged (qreal opacity)
 
void nodeProperties (KisNodeSP node)
 
void nodePropertiesIgnoreSelection (KisNodeSP node)
 
void nodesUpdated ()
 
void pasteLayersFromClipboard (bool changeOffset=false, QPointF offset=QPointF(), KisProcessingApplicator *applicator=nullptr)
 
void quickUngroup ()
 
void raiseNode ()
 
void reinitializeIsolationActionGroup ()
 
void removeNode ()
 
void saveNodeAsImage ()
 
void saveVectorLayerAsImage ()
 
void selectAllNodes ()
 
void selectInvisibleNodes ()
 
void selectLockedNodes ()
 
void selectUnlockedNodes ()
 
void selectVisibleNodes ()
 
void setIsolateActiveGroupMode (bool checked)
 
void setIsolateActiveLayerMode (bool checked)
 
void slotImageRequestNodeReselection (KisNodeSP activeNode, const KisNodeList &selectedNodes)
 
void slotNonUiActivatedNode (KisNodeSP node)
 
void slotPinToTimeline (bool value)
 
void slotSetSelectedNodes (const KisNodeList &nodes)
 slotSetSelectedNodes set the list of nodes selected in the layerbox. Selected nodes are not necessarily active nodes.
 
void slotSplitAlphaIntoMask ()
 
void slotSplitAlphaSaveMerged ()
 
void slotSplitAlphaWrite ()
 
void slotUiActivatedNode (KisNodeSP node)
 
void switchToPreviouslyActiveNode ()
 
void toggleAlphaLock ()
 
void toggleInheritAlpha ()
 
void toggleIsolateActiveNode ()
 
void toggleLock ()
 
void toggleVisibility ()
 

Signals

void sigNodeActivated (KisNodeSP node)
 emitted whenever a node is selected.
 
void sigUiNeedChangeActiveNode (KisNodeSP node)
 
void sigUiNeedChangeSelectedNodes (const QList< KisNodeSP > &nodes)
 

Public Member Functions

const KoColorSpaceactiveColorSpace ()
 
KisLayerSP activeLayer ()
 
KisNodeSP activeNode ()
 Convenience function to get the active layer or mask.
 
KisPaintDeviceSP activePaintDevice ()
 Get the paint device the user wants to paint on now.
 
bool canModifyLayer (KisNodeSP node, bool showWarning=true)
 
bool canModifyLayers (KisNodeList nodes, bool showWarning=true)
 
bool canMoveLayer (KisNodeSP node, bool showWarning=true)
 
bool canMoveLayers (KisNodeList nodes, bool showWarning=true)
 
KisLayerSP createPaintLayer ()
 
 KisNodeManager (KisViewManager *view)
 
KisNodeDisplayModeAdapternodeDisplayModeAdapter () const
 
KisNodeInsertionAdapternodeInsertionAdapter () const
 
KisNodeSelectionAdapternodeSelectionAdapter () const
 
void removeSingleNode (KisNodeSP node)
 
KisNodeList selectedNodes ()
 
void setNodeCompositeOp (KisNodeSP node, const KoCompositeOp *compositeOp)
 
void setNodeName (KisNodeSP node, const QString &name)
 
void setNodeOpacity (KisNodeSP node, qint32 opacity)
 
void setup (KisKActionCollection *collection, KisActionManager *actionManager)
 
void setView (QPointer< KisView >imageView)
 
bool trySetNodeProperties (KisNodeSP node, KisImageSP image, KisBaseNode::PropertyList properties) const
 
void updateGUI ()
 
 ~KisNodeManager () override
 

Static Public Member Functions

static bool isNodeHidden (KisNodeSP node, bool isGlobalSelectionHidden)
 

Private Member Functions

qint32 convertOpacityToInt (qreal opacity)
 
bool createQuickGroupImpl (KisNodeJugglerCompressed *juggler, const QString &overrideGroupName, KisNodeSP *newGroup, KisNodeSP *newLastChild)
 
void removeSelectedNodes (KisNodeList selectedNodes)
 
void selectLayersImpl (const KoProperties &props, const KoProperties &invertedProps)
 
void slotSomethingActivatedNodeImpl (KisNodeSP node)
 
void slotUiActivateNode ()
 slotUiActivateNode inspects the sender to see which node needs to be activated.
 

Private Attributes

Private *const m_d
 

Friends

class KisNodeActivationActionCreatorVisitor
 

Detailed Description

The node manager passes requests for new layers or masks on to the mask and layer managers.

Definition at line 39 of file kis_node_manager.h.

Constructor & Destructor Documentation

◆ KisNodeManager()

KisNodeManager::KisNodeManager ( KisViewManager * view)

Definition at line 192 of file kis_node_manager.cpp.

193 : m_d(new Private(this, view))
194{
196}
void slotImageRequestNodeReselection(KisNodeSP activeNode, const KisNodeList &selectedNodes)
Private *const m_d
KisSynchronizedConnection< KisNodeSP, KisNodeList > activateNodeConnection

References KisNodeManager::Private::activateNodeConnection, m_d, and slotImageRequestNodeReselection().

◆ ~KisNodeManager()

KisNodeManager::~KisNodeManager ( )
override

Definition at line 198 of file kis_node_manager.cpp.

199{
200 delete m_d;
201}

References m_d.

Member Function Documentation

◆ activateNextNode

void KisNodeManager::activateNextNode ( bool siblingsOnly = false)
slot

Definition at line 1162 of file kis_node_manager.cpp.

1163{
1165 if (!activeNode) return;
1166
1167 KisNodeSP nextNode = activeNode->nextSibling();
1168
1169 if (!siblingsOnly) {
1170 // Recurse groups...
1171 while (nextNode && nextNode->childCount() > 0) {
1172 nextNode = nextNode->firstChild();
1173 }
1174
1175 // Out of nodes? Back out of group...
1176 if (!nextNode && activeNode->parent()) {
1177 nextNode = activeNode->parent();
1178 }
1179 }
1180
1181 // Skip nodes hidden from tree view..
1182 while (nextNode && isNodeHidden(nextNode, m_d->nodeDisplayModeAdapter->showGlobalSelectionMask())) {
1183 nextNode = nextNode->nextSibling();
1184 }
1185
1186 // Select node, unless root..
1187 if (nextNode && nextNode->parent()) {
1188 slotNonUiActivatedNode(nextNode);
1189 }
1190}
static bool isNodeHidden(KisNodeSP node, bool isGlobalSelectionHidden)
KisNodeSP activeNode()
Convenience function to get the active layer or mask.
void slotNonUiActivatedNode(KisNodeSP node)
QScopedPointer< KisNodeDisplayModeAdapter > nodeDisplayModeAdapter
KisNodeSP firstChild() const
Definition kis_node.cpp:361
quint32 childCount() const
Definition kis_node.cpp:414
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References activeNode(), KisNode::childCount(), KisNode::firstChild(), isNodeHidden(), m_d, KisNode::nextSibling(), KisNodeManager::Private::nodeDisplayModeAdapter, KisNode::parent, and slotNonUiActivatedNode().

◆ activateNextSiblingNode

void KisNodeManager::activateNextSiblingNode ( )
slot

Definition at line 1192 of file kis_node_manager.cpp.

1193{
1194 activateNextNode(true);
1195}
void activateNextNode(bool siblingsOnly=false)

References activateNextNode().

◆ activatePreviousNode

void KisNodeManager::activatePreviousNode ( bool siblingsOnly = false)
slot

Definition at line 1197 of file kis_node_manager.cpp.

1198{
1200 if (!activeNode) return;
1201
1202 KisNodeSP nextNode = activeNode->prevSibling();
1203
1204 if (!siblingsOnly) {
1205 // Enter groups..
1206 if (activeNode->childCount() > 0) {
1207 nextNode = activeNode->lastChild();
1208 }
1209
1210 // Out of nodes? Back out of group...
1211 if (!nextNode && activeNode->parent()) {
1212 nextNode = activeNode->parent()->prevSibling();
1213 }
1214 }
1215
1216 // Skip nodes hidden from tree view..
1217 while (nextNode && isNodeHidden(nextNode, m_d->nodeDisplayModeAdapter->showGlobalSelectionMask())) {
1218 nextNode = nextNode->prevSibling();
1219 }
1220
1221 // Select node, unless root..
1222 if (nextNode && nextNode->parent()) {
1223 slotNonUiActivatedNode(nextNode);
1224 }
1225}
KisNodeSP prevSibling() const
Definition kis_node.cpp:402
KisNodeSP lastChild() const
Definition kis_node.cpp:367

References activeNode(), KisNode::childCount(), isNodeHidden(), KisNode::lastChild(), m_d, KisNodeManager::Private::nodeDisplayModeAdapter, KisNode::parent, KisNode::prevSibling(), and slotNonUiActivatedNode().

◆ activatePreviousSiblingNode

void KisNodeManager::activatePreviousSiblingNode ( )
slot

Definition at line 1227 of file kis_node_manager.cpp.

1228{
1230}
void activatePreviousNode(bool siblingsOnly=false)

References activatePreviousNode().

◆ activeColorSpace()

const KoColorSpace * KisNodeManager::activeColorSpace ( )
Returns
the active color space used for composition, meaning the color space of the active mask, or the color space of the parent of the active layer

Definition at line 459 of file kis_node_manager.cpp.

460{
463 } else {
464 Q_ASSERT(m_d->layerManager.activeLayer());
467 else
468 return m_d->view->image()->colorSpace();
469 }
470}
const KoColorSpace * colorSpace() const
KisLayerSP activeLayer()
KisPaintDeviceSP activeDevice()
const KoColorSpace * colorSpace() const
KisImageWSP image() const
Return the image this view is displaying.
const KoColorSpace * colorSpace() const override
returns the image's colorSpace or null, if there is no image
Definition kis_layer.cc:225
KisLayerSP parentLayer() const

References KisMaskManager::activeDevice(), KisLayerManager::activeLayer(), KisImage::colorSpace(), KisPaintDevice::colorSpace(), KisLayer::colorSpace(), KisViewManager::image(), KisNodeManager::Private::layerManager, m_d, KisNodeManager::Private::maskManager, KisLayer::parentLayer(), and KisNodeManager::Private::view.

◆ activeLayer()

KisLayerSP KisNodeManager::activeLayer ( )

convenience function to get the active layer. If a mask is active, it's parent layer is the active layer.

Definition at line 454 of file kis_node_manager.cpp.

455{
456 return m_d->layerManager.activeLayer();
457}

References KisLayerManager::activeLayer(), KisNodeManager::Private::layerManager, and m_d.

◆ activeNode()

KisNodeSP KisNodeManager::activeNode ( )

Convenience function to get the active layer or mask.

Definition at line 446 of file kis_node_manager.cpp.

447{
448 if (m_d->imageView) {
449 return m_d->imageView->currentNode();
450 }
451 return 0;
452}
QPointer< KisView > imageView

References KisNodeManager::Private::imageView, and m_d.

◆ activePaintDevice()

KisPaintDeviceSP KisNodeManager::activePaintDevice ( )

◆ addNodesDirect

void KisNodeManager::addNodesDirect ( KisNodeList nodes,
KisNodeSP parent,
KisNodeSP aboveThis )
slot

Adds a list of nodes without searching appropriate position for it. You must ensure that the nodes are allowed to be added to the parent, otherwise you'll get an assert.

Definition at line 553 of file kis_node_manager.cpp.

554{
555 KUndo2MagicString actionName = kundo2_i18n("Add Nodes");
556 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
557 juggler->addNode(nodes, parent, aboveThis);
558}
void addNode(const KisNodeList &nodes, KisNodeSP dstParent, KisNodeSP dstAbove)
KUndo2MagicString kundo2_i18n(const char *text)
KisNodeJugglerCompressed * lazyGetJuggler(const KUndo2MagicString &actionName)

References KisNodeJugglerCompressed::addNode(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), and m_d.

◆ canModifyLayer()

bool KisNodeManager::canModifyLayer ( KisNodeSP node,
bool showWarning = true )

Definition at line 497 of file kis_node_manager.cpp.

498{
499 return canModifyLayers({node}, showWarning);
500}
bool canModifyLayers(KisNodeList nodes, bool showWarning=true)

References canModifyLayers().

◆ canModifyLayers()

bool KisNodeManager::canModifyLayers ( KisNodeList nodes,
bool showWarning = true )

Definition at line 472 of file kis_node_manager.cpp.

473{
474 KisNodeSP lockedNode;
475 Q_FOREACH (KisNodeSP node, nodes) {
476 if (!node->isEditable(false)) {
477 lockedNode = node;
478 break;
479 }
480 }
481
482 if (lockedNode && showWarning) {
483 QString errorMessage;
484
485 if (nodes.size() <= 1) {
486 errorMessage = i18n("Layer is locked");
487 } else {
488 errorMessage = i18n("Layer \"%1\" is locked", lockedNode->name());
489 }
490
491 m_d->view->showFloatingMessage(errorMessage, QIcon());
492 }
493
494 return !lockedNode;
495}
void showFloatingMessage(const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
shows a floating message in the top right corner of the canvas
bool isEditable(bool checkVisibility=true) const
QString name() const

References KisBaseNode::isEditable(), m_d, KisBaseNode::name(), KisViewManager::showFloatingMessage(), and KisNodeManager::Private::view.

◆ canMoveLayer()

bool KisNodeManager::canMoveLayer ( KisNodeSP node,
bool showWarning = true )

Definition at line 520 of file kis_node_manager.cpp.

521{
522 return canMoveLayers({node}, showWarning);
523}
bool canMoveLayers(KisNodeList nodes, bool showWarning=true)

References canMoveLayers().

◆ canMoveLayers()

bool KisNodeManager::canMoveLayers ( KisNodeList nodes,
bool showWarning = true )

Definition at line 502 of file kis_node_manager.cpp.

503{
504 KisNodeSP lockedNode;
505 Q_FOREACH (KisNodeSP node, nodes) {
506 if (node->parent() && !node->parent()->isEditable(false)) {
507 lockedNode = node->parent();
508 break;
509 }
510 }
511
512 if (lockedNode && showWarning) {
513 QString errorMessage = i18n("Layer \"%1\" is locked", lockedNode->name());
514 m_d->view->showFloatingMessage(errorMessage, QIcon());
515 }
516
517 return !lockedNode;
518}

References KisBaseNode::isEditable(), m_d, KisBaseNode::name(), KisNode::parent, KisViewManager::showFloatingMessage(), and KisNodeManager::Private::view.

◆ changeCloneSource

void KisNodeManager::changeCloneSource ( )
slot

pop up a window for changing the source of the selected Clone Layers

Definition at line 929 of file kis_node_manager.cpp.

References KisLayerManager::changeCloneSource(), KisNodeManager::Private::layerManager, and m_d.

◆ changeIsolationMode

void KisNodeManager::changeIsolationMode ( bool isolateActiveLayer,
bool isolateActiveGroup )
slot

Definition at line 584 of file kis_node_manager.cpp.

585{
586 KisImageWSP image = m_d->view->image();
589
590 if (isolateActiveLayer || isolateActiveGroup) {
591 if (image->startIsolatedMode(activeNode, isolateActiveLayer, isolateActiveGroup) == false) {
593 }
594 } else {
595 image->stopIsolatedMode();
596 }
597}
bool startIsolatedMode(KisNodeSP node, bool isolateLayer, bool isolateGroup)
void stopIsolatedMode()
void reinitializeIsolationActionGroup()
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75

References activeNode(), KisViewManager::image(), KIS_ASSERT_RECOVER_RETURN, m_d, reinitializeIsolationActionGroup(), KisImage::startIsolatedMode(), KisImage::stopIsolatedMode(), and KisNodeManager::Private::view.

◆ changeIsolationRoot

void KisNodeManager::changeIsolationRoot ( KisNodeSP isolationRoot)
slot

Definition at line 599 of file kis_node_manager.cpp.

600{
601 KisImageWSP image = m_d->view->image();
602 if (!image || !isolationRoot) return;
603
604 const bool isIsolatingLayer = image->isIsolatingLayer();
605 const bool isIsolatingGroup = image->isIsolatingGroup();
606
607 // Restart isolation with a new root node and the same settings.
608 if (image->startIsolatedMode(isolationRoot, isIsolatingLayer, isIsolatingGroup) == false) {
610 }
611}
bool isIsolatingLayer() const
bool isIsolatingGroup() const

References KisViewManager::image(), KisImage::isIsolatingGroup(), KisImage::isIsolatingLayer(), m_d, reinitializeIsolationActionGroup(), KisImage::startIsolatedMode(), and KisNodeManager::Private::view.

◆ colorOverlayMaskProperties

void KisNodeManager::colorOverlayMaskProperties ( KisNodeSP node)
slot

Open a dialog to change layer's fast color overlay mask properties.

Definition at line 1542 of file kis_node_manager.cpp.

1543{
1544 Q_ASSERT(node);
1545 KisLayerSP layer = qobject_cast<KisLayer*>(node.data());
1546 if (!layer) {
1547 return;
1548 }
1549
1550 KisFilterMaskSP mask = layer->colorOverlayMask();
1551 if (!mask) {
1552 // This layer does not use fast color overlay mask.
1553 return;
1554 }
1555
1557}
void nodePropertiesIgnoreSelection(KisNodeSP node)
KisFilterMaskSP colorOverlayMask() const
Definition kis_layer.cc:573

References KisLayer::colorOverlayMask(), KisSharedPtr< T >::data(), and nodePropertiesIgnoreSelection().

◆ convertNode

void KisNodeManager::convertNode ( const QString & nodeType)
slot

Definition at line 707 of file kis_node_manager.cpp.

708{
710 return;
711 }
712
714 if (!activeNode) return;
715
716 if (!canModifyLayer(activeNode)) return;
717
718 if (nodeType == "KisPaintLayer") {
720 } else if (nodeType == "KisSelectionMask" ||
721 nodeType == "KisFilterMask" ||
722 nodeType == "KisTransparencyMask") {
723
726
727 m_d->commandsAdapter.beginMacro(kundo2_i18n("Convert to a Selection Mask"));
728
729 bool result = false;
730
731 if (nodeType == "KisSelectionMask") {
732 result = !m_d->maskManager.createSelectionMask(activeNode, copyFrom, true).isNull();
733 } else if (nodeType == "KisFilterMask") {
734 result = !m_d->maskManager.createFilterMask(activeNode, copyFrom, false, true).isNull();
735 } else if (nodeType == "KisTransparencyMask") {
736 result = !m_d->maskManager.createTransparencyMask(activeNode, copyFrom, true).isNull();
737 }
738
740
741 if (!result) {
744 }
745 } else if (nodeType == "KisFileLayer") {
747 } else {
748 warnKrita << "Unsupported node conversion type:" << nodeType;
749 }
750}
char nodeType(const KoPathPoint *point)
void convertLayerToFileLayer(KisNodeSP source)
void convertNodeToPaintLayer(KisNodeSP source)
KisNodeSP createSelectionMask(KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool convertActiveNode)
KisNodeSP createTransparencyMask(KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool convertActiveNode)
KisNodeSP createFilterMask(KisNodeSP activeNode, KisPaintDeviceSP copyFrom, bool quiet, bool convertActiveNode)
void beginMacro(const KUndo2MagicString &macroName)
bool canModifyLayer(KisNodeSP node, bool showWarning=true)
bool isNull() const
bool blockUntilOperationsFinished(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
void blockUntilOperationsFinishedForced(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
#define warnKrita
Definition kis_debug.h:91
virtual KisPaintDeviceSP projection() const =0
virtual KisPaintDeviceSP paintDevice() const =0
KisNodeCommandsAdapter commandsAdapter

References activeNode(), KisNodeCommandsAdapter::beginMacro(), KisViewManager::blockUntilOperationsFinished(), KisViewManager::blockUntilOperationsFinishedForced(), canModifyLayer(), KisNodeManager::Private::commandsAdapter, KisLayerManager::convertLayerToFileLayer(), KisLayerManager::convertNodeToPaintLayer(), KisMaskManager::createFilterMask(), KisMaskManager::createSelectionMask(), KisMaskManager::createTransparencyMask(), KisNodeCommandsAdapter::endMacro(), KisViewManager::image(), KisNodeManager::Private::imageView, KisSharedPtr< T >::isNull(), kundo2_i18n(), KisNodeManager::Private::layerManager, m_d, KisNodeManager::Private::maskManager, nodeType(), KisBaseNode::paintDevice(), KisBaseNode::projection(), KisNodeCommandsAdapter::undoLastCommand(), KisNodeManager::Private::view, and warnKrita.

◆ convertOpacityToInt()

qint32 KisNodeManager::convertOpacityToInt ( qreal opacity)
private

Scales opacity from the range 0...1 to the integer range 0...255

Scales opacity from the range 0...100 to the integer range 0...255

Definition at line 934 of file kis_node_manager.cpp.

935{
941 return qMin(255, int(opacity * 2.55 + 0.5));
942}

◆ copyLayersToClipboard

void KisNodeManager::copyLayersToClipboard ( )
slot

Definition at line 1582 of file kis_node_manager.cpp.

1583{
1584 KisNodeList nodes = this->selectedNodes();
1585 KisClipboard::instance()->setLayers(nodes, m_d->view->image(), true);
1586}
void setLayers(KisNodeList nodes, KisImageSP image, bool forceCopy=false)
static KisClipboard * instance()
KisNodeList selectedNodes()

References KisViewManager::image(), KisClipboard::instance(), m_d, selectedNodes(), KisClipboard::setLayers(), and KisNodeManager::Private::view.

◆ copyNodesDirect

void KisNodeManager::copyNodesDirect ( KisNodeList nodes,
KisNodeSP parent,
KisNodeSP aboveThis )
slot

Copies a list of nodes without searching appropriate position for it. You must ensure that the nodes are allowed to be added to the parent, otherwise you'll get an assert.

Definition at line 546 of file kis_node_manager.cpp.

547{
548 KUndo2MagicString actionName = kundo2_i18n("Copy Nodes");
549 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
550 juggler->copyNode(nodes, parent, aboveThis);
551}
void copyNode(const KisNodeList &nodes, KisNodeSP dstParent, KisNodeSP dstAbove)

References KisNodeJugglerCompressed::copyNode(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), and m_d.

◆ createFromVisible

void KisNodeManager::createFromVisible ( )
slot

Create new layer from actually visible

Definition at line 689 of file kis_node_manager.cpp.

690{
692}
void newLayerFromVisible(KisImageSP image, KisNodeSP putAfter, MergeFlags flags)

References KisViewManager::image(), KisNode::lastChild(), m_d, KisLayerUtils::newLayerFromVisible(), KisNodeFacade::root, and KisNodeManager::Private::view.

◆ createNode

KisNodeSP KisNodeManager::createNode ( const QString & nodeType,
bool quiet = false,
KisPaintDeviceSP copyFrom = 0 )
slot

the check for editability happens inside the functions themselves, because layers can be created anyway (in a different position), but masks cannot.

Definition at line 635 of file kis_node_manager.cpp.

636{
638 return 0;
639 }
640
642 if (!activeNode) {
643 activeNode = m_d->view->image()->root();
644 }
645
647
651
652 // XXX: make factories for this kind of stuff,
653 // with a registry
654
655 if (nodeType == "KisPaintLayer") {
657 } else if (nodeType == "KisGroupLayer") {
659 } else if (nodeType == "KisAdjustmentLayer") {
661 } else if (nodeType == "KisGeneratorLayer") {
663 } else if (nodeType == "KisShapeLayer") {
665 } else if (nodeType == "KisCloneLayer") {
666 KisNodeList nodes = selectedNodes();
667 if (nodes.isEmpty()) {
668 nodes.append(activeNode);
669 }
670 return m_d->layerManager.addCloneLayer(nodes);
671 } else if (nodeType == "KisTransparencyMask") {
672 return m_d->maskManager.createTransparencyMask(activeNode, copyFrom, false);
673 } else if (nodeType == "KisFilterMask") {
674 return m_d->maskManager.createFilterMask(activeNode, copyFrom, quiet, false);
675 } else if (nodeType == "FastColorOverlayFilterMask") {
677 } else if (nodeType == "KisColorizeMask") {
679 } else if (nodeType == "KisTransformMask") {
681 } else if (nodeType == "KisSelectionMask") {
682 return m_d->maskManager.createSelectionMask(activeNode, copyFrom, false);
683 } else if (nodeType == "KisFileLayer") {
685 }
686 return 0;
687}
KisNodeSP addShapeLayer(KisNodeSP activeNode)
KisNodeSP addGeneratorLayer(KisNodeSP activeNode)
KisNodeSP addFileLayer(KisNodeSP activeNode)
KisLayerSP addPaintLayer(KisNodeSP activeNode)
KisNodeSP addGroupLayer(KisNodeSP activeNode)
KisNodeSP addCloneLayer(KisNodeList nodes)
KisNodeSP addAdjustmentLayer(KisNodeSP activeNode)
KisNodeSP createTransformMask(KisNodeSP activeNode)
KisNodeSP createColorizeMask(KisNodeSP activeNode)
KisNodeSP createFastColorOverlayMask(KisNodeSP activeNode)
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85

References activeNode(), KisLayerManager::addAdjustmentLayer(), KisLayerManager::addCloneLayer(), KisLayerManager::addFileLayer(), KisLayerManager::addGeneratorLayer(), KisLayerManager::addGroupLayer(), KisLayerManager::addPaintLayer(), KisLayerManager::addShapeLayer(), KisViewManager::blockUntilOperationsFinished(), KisMaskManager::createColorizeMask(), KisMaskManager::createFastColorOverlayMask(), KisMaskManager::createFilterMask(), KisMaskManager::createSelectionMask(), KisMaskManager::createTransformMask(), KisMaskManager::createTransparencyMask(), KisViewManager::image(), KIS_ASSERT_RECOVER_RETURN_VALUE, KisNodeManager::Private::layerManager, m_d, KisNodeManager::Private::maskManager, nodeType(), KisNodeFacade::root, selectedNodes(), and KisNodeManager::Private::view.

◆ createPaintLayer()

KisLayerSP KisNodeManager::createPaintLayer ( )

Definition at line 701 of file kis_node_manager.cpp.

702{
703 KisNodeSP node = createNode("KisPaintLayer");
704 return dynamic_cast<KisLayer*>(node.data());
705}
KisNodeSP createNode(const QString &nodeType, bool quiet=false, KisPaintDeviceSP copyFrom=0)

References createNode(), and KisSharedPtr< T >::data().

◆ createQuickClippingGroup

void KisNodeManager::createQuickClippingGroup ( )
slot

Definition at line 1668 of file kis_node_manager.cpp.

1669{
1670 KUndo2MagicString actionName = kundo2_i18n("Quick Clipping Group");
1671 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1672
1674 KisNodeSP above;
1675
1676 KisImageSP image = m_d->view->image();
1677 if (createQuickGroupImpl(juggler, image->nextLayerName(i18nc("default name for a clipping group layer", "Clipping Group")), &parent, &above)) {
1678 KisPaintLayerSP maskLayer = new KisPaintLayer(image.data(), i18nc("default name for quick clip group mask layer", "Mask Layer"), OPACITY_OPAQUE_U8, image->colorSpace());
1679 maskLayer->disableAlphaChannel(true);
1680
1681 juggler->addNode(KisNodeList() << maskLayer, parent, above);
1682 }
1683}
const quint8 OPACITY_OPAQUE_U8
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:742
bool createQuickGroupImpl(KisNodeJugglerCompressed *juggler, const QString &overrideGroupName, KisNodeSP *newGroup, KisNodeSP *newLastChild)
QList< KisNodeSP > KisNodeList
Definition kis_types.h:264
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
void disableAlphaChannel(bool disable)
Definition kis_layer.cc:319

References KisNodeJugglerCompressed::addNode(), KisImage::colorSpace(), createQuickGroupImpl(), KisSharedPtr< T >::data(), KisLayer::disableAlphaChannel(), KisViewManager::image(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, KisImage::nextLayerName(), OPACITY_OPAQUE_U8, and KisNodeManager::Private::view.

◆ createQuickGroup

void KisNodeManager::createQuickGroup ( )
slot

Definition at line 1657 of file kis_node_manager.cpp.

1658{
1659 KUndo2MagicString actionName = kundo2_i18n("Quick Group");
1660 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1661
1663 KisNodeSP above;
1664
1665 createQuickGroupImpl(juggler, "", &parent, &above);
1666}

References createQuickGroupImpl(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), and m_d.

◆ createQuickGroupImpl()

bool KisNodeManager::createQuickGroupImpl ( KisNodeJugglerCompressed * juggler,
const QString & overrideGroupName,
KisNodeSP * newGroup,
KisNodeSP * newLastChild )
private

Definition at line 1618 of file kis_node_manager.cpp.

1622{
1623 KisNodeSP active = activeNode();
1624 if (!active) return false;
1625
1626 if (!canMoveLayer(active)) return false;
1627
1628 KisImageSP image = m_d->view->image();
1629 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->nextLayerName(i18nc("A group of layers", "Group"));
1630 KisGroupLayerSP group = new KisGroupLayer(image.data(), groupName, OPACITY_OPAQUE_U8);
1631
1632 KisNodeList nodes1;
1633 nodes1 << group;
1634
1635 KisNodeList nodes2;
1638
1639 if (nodes2.size() == 0) return false;
1640
1641 if (KisLayerUtils::checkIsChildOf(active, nodes2)) {
1642 active = nodes2.first();
1643 }
1644
1645 KisNodeSP parent = active->parent();
1646 KisNodeSP aboveThis = active;
1647
1648 juggler->addNode(nodes1, parent, aboveThis);
1649 juggler->moveNode(nodes2, group, 0);
1650
1651 *newGroup = group;
1652 *newLastChild = nodes2.last();
1653
1654 return true;
1655}
void moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP above)
bool canMoveLayer(KisNodeSP node, bool showWarning=true)
void sortMergeableNodes(KisNodeSP root, KisNodeList &inputNodes, KisNodeList &outputNodes)
void filterMergeableNodes(KisNodeList &nodes, bool allowMasks)
bool checkIsChildOf(KisNodeSP node, const KisNodeList &parents)

References activeNode(), KisNodeJugglerCompressed::addNode(), canMoveLayer(), KisLayerUtils::checkIsChildOf(), KisSharedPtr< T >::data(), KisLayerUtils::filterMergeableNodes(), KisViewManager::image(), m_d, KisNodeJugglerCompressed::moveNode(), KisImage::nextLayerName(), OPACITY_OPAQUE_U8, KisNode::parent, KisNodeFacade::root, selectedNodes(), KisLayerUtils::sortMergeableNodes(), and KisNodeManager::Private::view.

◆ createReferenceImage

void KisNodeManager::createReferenceImage ( bool fromLayer)
slot

Definition at line 752 of file kis_node_manager.cpp.

752 {
753 KisViewManager* m_view = m_d->view;
754 KisDocument *document = m_view->document();
755 KisCanvas2 *canvas = m_view->canvasBase();
756
757 const KisPaintDeviceSP paintDevice = fromLayer ? m_view->activeLayer()->projection()
758 : canvas->currentImage()->projection();
761 std::unique_ptr<KisReferenceImage> reference(KisReferenceImage::fromQImage(*canvas->coordinatesConverter(), image));
763 if (reference) {
764 if (document->referenceImagesLayer()) {
765 reference->setZIndex(document->referenceImagesLayer()->shapes().size());
766 }
767 canvas->addCommand(KisReferenceImagesLayer::addReferenceImages(document, {reference.release()}));
768
769 KoToolManager::instance()->switchToolRequested("ToolReferenceImages");
770
771 } else {
772 if (canvas->canvasWidget()) {
773 QString strMessage = fromLayer ? i18nc("error dialog from the reference tool", "Could not create a reference image from the active layer.")
774 : i18nc("error dialog from the reference tool", "Could not create a reference image from the visible canvas.");
775
776 m_d->view->showFloatingMessage(strMessage, QIcon(), 5000, KisFloatingMessage::High, Qt::TextSingleLine);
777 }
778 }
779}
KisImageWSP currentImage() const
KisCoordinatesConverter * coordinatesConverter
void addCommand(KUndo2Command *command) override
KisAbstractCanvasWidget * canvasWidget
KisPaintDeviceSP projection() const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
static KisReferenceImage * fromQImage(const KisCoordinatesConverter &converter, const QImage &img)
static KUndo2Command * addReferenceImages(KisDocument *document, QList< KoShape * > referenceImages)
KisDocument * document() const
KisCanvas2 * canvasBase() const
Return the canvas base class.
KisLayerSP activeLayer()
Convenience method to get at the active layer.
void switchToolRequested(const QString &id)
static KoToolManager * instance()
Return the toolmanager singleton.
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:826

References KisViewManager::activeLayer(), KisCanvas2::addCommand(), KisReferenceImagesLayer::addReferenceImages(), KisViewManager::canvasBase(), KisCanvas2::canvasWidget, KisPaintDevice::convertToQImage(), KisCanvas2::coordinatesConverter, KisCanvas2::currentImage(), KisViewManager::document(), KisReferenceImage::fromQImage(), KisFloatingMessage::High, KoToolManager::instance(), KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisImage::projection(), KisLayer::projection(), KisViewManager::showFloatingMessage(), KoToolManager::switchToolRequested(), and KisNodeManager::Private::view.

◆ createReferenceImageFromLayer

void KisNodeManager::createReferenceImageFromLayer ( )
slot

Definition at line 781 of file kis_node_manager.cpp.

781 {
783}
void createReferenceImage(bool fromLayer)

References createReferenceImage().

◆ createReferenceImageFromVisible

void KisNodeManager::createReferenceImageFromVisible ( )
slot

Definition at line 785 of file kis_node_manager.cpp.

785 {
787}

References createReferenceImage().

◆ cutLayersToClipboard

void KisNodeManager::cutLayersToClipboard ( )
slot

Definition at line 1559 of file kis_node_manager.cpp.

1560{
1561 KisNodeList nodes = this->selectedNodes();
1562 if (nodes.isEmpty()) return;
1563
1564 KisNodeList::Iterator it = nodes.begin();
1565 while (it != nodes.end()) {
1566 // make sure the deleted nodes aren't referenced here again
1567 if (!it->data()->parent()) {
1568 nodes.erase(it);
1569 }
1570 it++;
1571 }
1572
1573 KisClipboard::instance()->setLayers(nodes, m_d->view->image(), false);
1574
1575 if (canModifyLayers(nodes)) {
1576 KUndo2MagicString actionName = kundo2_i18n("Cut Nodes");
1577 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1578 juggler->removeNode(nodes);
1579 }
1580}
void removeNode(const KisNodeList &nodes)

References canModifyLayers(), KisViewManager::image(), KisClipboard::instance(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, KisNodeJugglerCompressed::removeNode(), selectedNodes(), KisClipboard::setLayers(), and KisNodeManager::Private::view.

◆ duplicateActiveNode

void KisNodeManager::duplicateActiveNode ( )
slot

Definition at line 1054 of file kis_node_manager.cpp.

1055{
1056 KUndo2MagicString actionName = kundo2_i18n("Duplicate Nodes");
1057 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1058 juggler->duplicateNode(selectedNodes());
1059}
void duplicateNode(const KisNodeList &nodes)

References KisNodeJugglerCompressed::duplicateNode(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, and selectedNodes().

◆ handleExternalIsolationChange

void KisNodeManager::handleExternalIsolationChange ( )
slot

Responds to external changes in isolation mode (i.e. from KisImage).

Definition at line 613 of file kis_node_manager.cpp.

614{
615 // It might be that we have multiple Krita windows open. In such a case
616 // only the currently active one should restart isolated mode
617 if (!m_d->view->mainWindowAsQWidget()->isActiveWindow()) return;
618
619 KisImageWSP image = m_d->view->image();
621
622 const bool isIsolatingLayer = image->isIsolatingLayer();
623 const bool isIsolatingGroup = image->isIsolatingGroup();
624
625 m_d->view->actionManager()->actionByName("isolate_active_layer")->setChecked(isIsolatingLayer);
626 m_d->view->actionManager()->actionByName("isolate_active_group")->setChecked(isIsolatingGroup);
627}
KisAction * actionByName(const QString &name) const
KisActionManager * actionManager() const
QWidget * mainWindowAsQWidget() const

References KisActionManager::actionByName(), KisViewManager::actionManager(), activeNode(), KisViewManager::image(), KisImage::isIsolatingGroup(), KisImage::isIsolatingLayer(), m_d, KisViewManager::mainWindowAsQWidget(), and KisNodeManager::Private::view.

◆ isNodeHidden()

bool KisNodeManager::isNodeHidden ( KisNodeSP node,
bool isGlobalSelectionHidden )
static

Definition at line 1006 of file kis_node_manager.cpp.

1007{
1008 if (node && node->isFakeNode()) {
1009 return true;
1010 }
1011
1012 if (isGlobalSelectionHidden && dynamic_cast<KisSelectionMask *>(node.data()) &&
1013 (!node->parent() || !node->parent()->parent())) {
1014 return true;
1015 }
1016
1017 return false;
1018}
virtual bool isFakeNode() const

References KisSharedPtr< T >::data(), KisBaseNode::isFakeNode(), and KisNode::parent.

◆ lowerNode

void KisNodeManager::lowerNode ( )
slot

move the active node down the nodestack

Definition at line 1086 of file kis_node_manager.cpp.

1087{
1088 if (!canMoveLayers(selectedNodes())) return;
1089
1090 KUndo2MagicString actionName = kundo2_i18n("Lower Nodes");
1091 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1092 juggler->lowerNode(selectedNodes());
1093}
void lowerNode(const KisNodeList &nodes)

References canMoveLayers(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), KisNodeJugglerCompressed::lowerNode(), m_d, and selectedNodes().

◆ mirrorAllNodesX

void KisNodeManager::mirrorAllNodesX ( )
slot

Definition at line 1148 of file kis_node_manager.cpp.

1149{
1150 KisNodeSP node = m_d->view->image()->root();
1151 mirrorNode(node, kundo2_i18n("Mirror All Layers Horizontally"),
1152 Qt::Horizontal, m_d->view->selection());
1153}
void mirrorNode(KisNodeSP node, const KUndo2MagicString &commandName, Qt::Orientation orientation, KisSelectionSP selection)
KisSelectionSP selection()

References KisViewManager::image(), kundo2_i18n(), m_d, mirrorNode(), KisNodeFacade::root, KisViewManager::selection(), and KisNodeManager::Private::view.

◆ mirrorAllNodesY

void KisNodeManager::mirrorAllNodesY ( )
slot

Definition at line 1155 of file kis_node_manager.cpp.

1156{
1157 KisNodeSP node = m_d->view->image()->root();
1158 mirrorNode(node, kundo2_i18n("Mirror All Layers Vertically"),
1159 Qt::Vertical, m_d->view->selection());
1160}

References KisViewManager::image(), kundo2_i18n(), m_d, mirrorNode(), KisNodeFacade::root, KisViewManager::selection(), and KisNodeManager::Private::view.

◆ mirrorNode

void KisNodeManager::mirrorNode ( KisNodeSP node,
const KUndo2MagicString & commandName,
Qt::Orientation orientation,
KisSelectionSP selection )
slot

Definition at line 1239 of file kis_node_manager.cpp.

1243{
1244 KisNodeList nodes = {node};
1245 mirrorNodes(nodes, actionName, orientation, selection);
1246}
void mirrorNodes(KisNodeList nodes, const KUndo2MagicString &commandName, Qt::Orientation orientation, KisSelectionSP selection)

References mirrorNodes().

◆ mirrorNodes

void KisNodeManager::mirrorNodes ( KisNodeList nodes,
const KUndo2MagicString & commandName,
Qt::Orientation orientation,
KisSelectionSP selection )
slot

Definition at line 1248 of file kis_node_manager.cpp.

1252{
1253 Q_FOREACH(KisNodeSP node, nodes) {
1254 if (!canModifyLayer(node)) return;
1255 }
1256
1257 KisImageSignalVector emitSignals;
1258
1259 KisProcessingApplicator applicator(m_d->view->image(), nodes,
1261 emitSignals, actionName);
1262
1263 KisProcessingVisitorSP visitor;
1264
1265 if (selection) {
1266 visitor = new KisMirrorProcessingVisitor(selection, orientation);
1267 } else {
1268 visitor = new KisMirrorProcessingVisitor(m_d->view->image()->bounds(), orientation);
1269 }
1270
1271 if (!selection) {
1272 applicator.applyVisitorAllFrames(visitor, KisStrokeJobData::CONCURRENT);
1273 } else {
1274 applicator.applyVisitor(visitor, KisStrokeJobData::CONCURRENT);
1275 }
1276
1277 applicator.end();
1278
1279 nodesUpdated();
1280}
QRect bounds() const override

References KisProcessingApplicator::applyVisitor(), KisProcessingApplicator::applyVisitorAllFrames(), KisImage::bounds(), canModifyLayer(), KisStrokeJobData::CONCURRENT, KisProcessingApplicator::end(), KisViewManager::image(), m_d, nodesUpdated(), KisProcessingApplicator::RECURSIVE, and KisNodeManager::Private::view.

◆ mirrorNodeX

void KisNodeManager::mirrorNodeX ( )
slot

Definition at line 1120 of file kis_node_manager.cpp.

1121{
1122 KisNodeList nodes = selectedNodes();
1123
1124 KUndo2MagicString commandName;
1125 if (nodes.size() == 1 && nodes[0]->inherits("KisMask")) {
1126 commandName = kundo2_i18n("Mirror Mask Horizontally");
1127 }
1128 else {
1129 commandName = kundo2_i18np("Mirror Layer Horizontally", "Mirror %1 Layers Horizontally", nodes.size());
1130 }
1131 mirrorNodes(nodes, commandName, Qt::Horizontal, m_d->view->selection());
1132}
KUndo2MagicString kundo2_i18np(const char *sing, const char *plur, const A1 &a1)

References kundo2_i18n(), kundo2_i18np(), m_d, mirrorNodes(), selectedNodes(), KisViewManager::selection(), and KisNodeManager::Private::view.

◆ mirrorNodeY

void KisNodeManager::mirrorNodeY ( )
slot

Definition at line 1134 of file kis_node_manager.cpp.

1135{
1136 KisNodeList nodes = selectedNodes();
1137
1138 KUndo2MagicString commandName;
1139 if (nodes.size() == 1 && nodes[0]->inherits("KisMask")) {
1140 commandName = kundo2_i18n("Mirror Mask Vertically");
1141 }
1142 else {
1143 commandName = kundo2_i18np("Mirror Layer Vertically", "Mirror %1 Layers Vertically", nodes.size());
1144 }
1145 mirrorNodes(nodes, commandName, Qt::Vertical, m_d->view->selection());
1146}

References kundo2_i18n(), kundo2_i18np(), m_d, mirrorNodes(), selectedNodes(), KisViewManager::selection(), and KisNodeManager::Private::view.

◆ moveNodeAt

void KisNodeManager::moveNodeAt ( KisNodeSP node,
KisNodeSP parent,
int index )
slot

Definition at line 525 of file kis_node_manager.cpp.

526{
527 if (parent->allowAsChild(node)) {
528 if (node->inherits("KisSelectionMask") && parent->inherits("KisLayer")) {
529 KisSelectionMask *m = dynamic_cast<KisSelectionMask*>(node.data());
530 KisLayer *l = qobject_cast<KisLayer*>(parent.data());
531 if (m && m->active() && l && l->selectionMask()) {
532 l->selectionMask()->setActive(false);
533 }
534 }
535 m_d->commandsAdapter.moveNode(node, parent, index);
536 }
537}
void moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
virtual KisSelectionMaskSP selectionMask() const
Definition kis_layer.cc:504
void setActive(bool active)

References KisSelectionMask::active(), KisNodeManager::Private::commandsAdapter, KisSharedPtr< T >::data(), m_d, KisNodeCommandsAdapter::moveNode(), KisLayer::selectionMask(), and KisSelectionMask::setActive().

◆ moveNodesDirect

void KisNodeManager::moveNodesDirect ( KisNodeList nodes,
KisNodeSP parent,
KisNodeSP aboveThis )
slot

Moves a list of nodes without searching appropriate position for it. You must ensure that the nodes are allowed to be added to the parent, otherwise you'll get an assert.

Definition at line 539 of file kis_node_manager.cpp.

540{
541 KUndo2MagicString actionName = kundo2_i18n("Move Nodes");
542 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
543 juggler->moveNode(nodes, parent, aboveThis);
544}

References kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, and KisNodeJugglerCompressed::moveNode().

◆ nodeCompositeOpChanged

void KisNodeManager::nodeCompositeOpChanged ( const KoCompositeOp * op)
slot

Definition at line 1047 of file kis_node_manager.cpp.

1048{
1049 KisNodeSP node = activeNode();
1050
1051 setNodeCompositeOp(node, op);
1052}
void setNodeCompositeOp(KisNodeSP node, const KoCompositeOp *compositeOp)

References activeNode(), and setNodeCompositeOp().

◆ nodeDisplayModeAdapter()

KisNodeDisplayModeAdapter * KisNodeManager::nodeDisplayModeAdapter ( ) const

Definition at line 1001 of file kis_node_manager.cpp.

1002{
1003 return m_d->nodeDisplayModeAdapter.data();
1004}

References m_d, and KisNodeManager::Private::nodeDisplayModeAdapter.

◆ nodeInsertionAdapter()

KisNodeInsertionAdapter * KisNodeManager::nodeInsertionAdapter ( ) const

Definition at line 996 of file kis_node_manager.cpp.

997{
998 return m_d->nodeInsertionAdapter.data();
999}
QScopedPointer< KisNodeInsertionAdapter > nodeInsertionAdapter

References m_d, and KisNodeManager::Private::nodeInsertionAdapter.

◆ nodeOpacityChanged

void KisNodeManager::nodeOpacityChanged ( qreal opacity)
slot

Definition at line 1040 of file kis_node_manager.cpp.

1041{
1042 KisNodeSP node = activeNode();
1043
1044 setNodeOpacity(node, convertOpacityToInt(opacity));
1045}
void setNodeOpacity(KisNodeSP node, qint32 opacity)
qint32 convertOpacityToInt(qreal opacity)

References activeNode(), convertOpacityToInt(), and setNodeOpacity().

◆ nodeProperties

void KisNodeManager::nodeProperties ( KisNodeSP node)
slot

Definition at line 901 of file kis_node_manager.cpp.

902{
903 if ((selectedNodes().size() > 1 && node->inherits("KisLayer")) || node->inherits("KisLayer")) {
905 }
906 else if (node->inherits("KisMask")) {
908 }
909}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KisNodeManager::Private::layerManager, KisLayerManager::layerProperties(), m_d, KisNodeManager::Private::maskManager, KisMaskManager::maskProperties(), and selectedNodes().

◆ nodePropertiesIgnoreSelection

void KisNodeManager::nodePropertiesIgnoreSelection ( KisNodeSP node)
slot

Definition at line 911 of file kis_node_manager.cpp.

912{
913 Q_ASSERT(node);
914
915 // Change the current node temporarily
916 KisNodeSP originalNode = m_d->imageView->currentNode();
917 m_d->imageView->setCurrentNode(node);
918
919 if (node->inherits("KisLayer")) {
921 }
922 else if (node->inherits("KisMask")) {
924 }
925
926 m_d->imageView->setCurrentNode(originalNode);
927}

References KisNodeManager::Private::imageView, KisNodeManager::Private::layerManager, KisLayerManager::layerProperties(), m_d, KisNodeManager::Private::maskManager, and KisMaskManager::maskProperties().

◆ nodeSelectionAdapter()

KisNodeSelectionAdapter * KisNodeManager::nodeSelectionAdapter ( ) const

Definition at line 991 of file kis_node_manager.cpp.

992{
993 return m_d->nodeSelectionAdapter.data();
994}
QScopedPointer< KisNodeSelectionAdapter > nodeSelectionAdapter

References m_d, and KisNodeManager::Private::nodeSelectionAdapter.

◆ nodesUpdated

void KisNodeManager::nodesUpdated ( )
slot

Definition at line 877 of file kis_node_manager.cpp.

878{
879 KisNodeSP node = activeNode();
880 if (!node) return;
881
884
885 m_d->view->updateGUI();
887
888 {
890 m_d->pinToTimeline->setChecked(node->isPinnedToTimeline());
891 }
892}
KisSelectionManager * selectionManager()
bool isPinnedToTimeline() const

References activeNode(), KisBaseNode::isPinnedToTimeline(), KisNodeManager::Private::layerManager, KisLayerManager::layersUpdated(), m_d, KisNodeManager::Private::maskManager, KisMaskManager::masksUpdated(), KisNodeManager::Private::pinToTimeline, KisSelectionManager::selectionChanged(), KisViewManager::selectionManager(), KisViewManager::updateGUI(), and KisNodeManager::Private::view.

◆ pasteLayersFromClipboard

void KisNodeManager::pasteLayersFromClipboard ( bool changeOffset = false,
QPointF offset = QPointF(),
KisProcessingApplicator * applicator = nullptr )
slot

Definition at line 1588 of file kis_node_manager.cpp.

1589{
1590 const QMimeData *data = KisClipboard::instance()->layersMimeData();
1591 if (!data) return;
1592
1594
1595 KisShapeController *shapeController = dynamic_cast<KisShapeController*>(m_d->imageView->document()->shapeController());
1596 Q_ASSERT(shapeController);
1597
1598 KisDummiesFacadeBase *dummiesFacade = dynamic_cast<KisDummiesFacadeBase*>(m_d->imageView->document()->shapeController());
1599 Q_ASSERT(dummiesFacade);
1600
1601 const bool copyNode = false;
1602 KisImageSP image = m_d->view->image();
1603 KisNodeDummy *parentDummy = dummiesFacade->dummyForNode(activeNode ? activeNode : image->root());
1604 KisNodeDummy *aboveThisDummy = parentDummy ? parentDummy->lastChild() : 0;
1605
1607 image,
1608 shapeController,
1609 parentDummy,
1610 aboveThisDummy,
1611 copyNode,
1613 changeOffset,
1614 offset,
1615 applicator);
1616}
const QMimeData * layersMimeData() const
virtual KisNodeDummy * dummyForNode(KisNodeSP node) const =0
static bool insertMimeLayers(const QMimeData *data, KisImageSP image, KisShapeController *shapeController, KisNodeDummy *parentDummy, KisNodeDummy *aboveThisDummy, bool copyNode, KisNodeInsertionAdapter *nodeInsertionAdapter, bool changeOffset=false, QPointF offset=QPointF(), KisProcessingApplicator *applicator=nullptr)
KisNodeDummy * lastChild() const
KisNodeInsertionAdapter * nodeInsertionAdapter() const

References activeNode(), KisDummiesFacadeBase::dummyForNode(), KisViewManager::image(), KisNodeManager::Private::imageView, KisMimeData::insertMimeLayers(), KisClipboard::instance(), KisNodeDummy::lastChild(), KisClipboard::layersMimeData(), m_d, nodeInsertionAdapter(), KisNodeFacade::root, and KisNodeManager::Private::view.

◆ quickUngroup

void KisNodeManager::quickUngroup ( )
slot

Definition at line 1685 of file kis_node_manager.cpp.

1686{
1687 KisNodeSP active = activeNode();
1688 if (!active) return;
1689
1690 if (!canModifyLayer(active)) return;
1691
1692 KisNodeSP parent = active->parent();
1693 KisNodeSP aboveThis = active;
1694
1695 auto checkCanMoveLayers = [this] (KisNodeList nodes, KisNodeSP newParent) -> bool {
1696 auto incompatibleNode =
1697 std::find_if(nodes.begin(), nodes.end(),
1698 [newParent] (KisNodeSP node) {
1699 return !newParent->allowAsChild(node);
1700 });
1701
1702 if (incompatibleNode != nodes.end()) {
1703 const QString message =
1704 newParent->parent() ?
1705 i18n("Cannot move layer \"%1\" into new parent \"%2\"",
1706 (*incompatibleNode)->name(),
1707 newParent->name()) :
1708 i18n("Cannot move layer \"%1\" into the root layer",
1709 (*incompatibleNode)->name());
1710 m_d->view->showFloatingMessage(message, QIcon());
1711 return false;
1712 }
1713 return true;
1714 };
1715
1716 KUndo2MagicString actionName = kundo2_i18n("Quick Ungroup");
1717
1718 if (parent && dynamic_cast<KisGroupLayer*>(active.data())) {
1719 KisNodeList nodes = active->childNodes(QStringList(), KoProperties());
1720
1721 if (checkCanMoveLayers(nodes, parent)) {
1722 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1723 juggler->moveNode(nodes, parent, active);
1724 juggler->removeNode(KisNodeList() << active);
1725 }
1726 } else if (parent && parent->parent()) {
1727 KisNodeSP grandParent = parent->parent();
1728
1729 KisNodeList allChildNodes = parent->childNodes(QStringList(), KoProperties());
1730 KisNodeList allSelectedNodes = selectedNodes();
1731
1732 const bool removeParent = KritaUtils::compareListsUnordered(allChildNodes, allSelectedNodes);
1733
1734 if (checkCanMoveLayers(allSelectedNodes, parent)) {
1735 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1736 juggler->moveNode(allSelectedNodes, grandParent, parent);
1737 if (removeParent) {
1738 juggler->removeNode(KisNodeList() << parent);
1739 }
1740 }
1741 }
1742}
QList< QString > QStringList
const char * name(StandardAction id)
bool compareListsUnordered(const QList< T > &a, const QList< T > &b)
QList< KisNodeSP > childNodes(const QStringList &nodeTypes, const KoProperties &properties) const
Definition kis_node.cpp:439

References activeNode(), canModifyLayer(), KisNode::childNodes(), KritaUtils::compareListsUnordered(), KisSharedPtr< T >::data(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, KisNodeJugglerCompressed::moveNode(), KisNode::parent, KisNodeJugglerCompressed::removeNode(), selectedNodes(), KisViewManager::showFloatingMessage(), and KisNodeManager::Private::view.

◆ raiseNode

void KisNodeManager::raiseNode ( )
slot

move the active node up the nodestack.

Definition at line 1077 of file kis_node_manager.cpp.

1078{
1079 if (!canMoveLayers(selectedNodes())) return;
1080
1081 KUndo2MagicString actionName = kundo2_i18n("Raise Nodes");
1082 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1083 juggler->raiseNode(selectedNodes());
1084}
void raiseNode(const KisNodeList &nodes)

References canMoveLayers(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, KisNodeJugglerCompressed::raiseNode(), and selectedNodes().

◆ reinitializeIsolationActionGroup

void KisNodeManager::reinitializeIsolationActionGroup ( )
slot

Definition at line 629 of file kis_node_manager.cpp.

630{
631 m_d->view->actionManager()->actionByName("isolate_active_layer")->setChecked(false);
632 m_d->view->actionManager()->actionByName("isolate_active_group")->setChecked(false);
633}

References KisActionManager::actionByName(), KisViewManager::actionManager(), m_d, and KisNodeManager::Private::view.

◆ removeNode

void KisNodeManager::removeNode ( )
slot

Definition at line 1115 of file kis_node_manager.cpp.

1116{
1118}
void removeSelectedNodes(KisNodeList selectedNodes)

References removeSelectedNodes(), and selectedNodes().

◆ removeSelectedNodes()

void KisNodeManager::removeSelectedNodes ( KisNodeList selectedNodes)
private

Definition at line 1106 of file kis_node_manager.cpp.

1107{
1108 if (!canModifyLayers(nodes)) return;
1109
1110 KUndo2MagicString actionName = kundo2_i18n("Remove Nodes");
1111 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1112 juggler->removeNode(nodes);
1113}

References canModifyLayers(), kundo2_i18n(), KisNodeManager::Private::lazyGetJuggler(), m_d, and KisNodeJugglerCompressed::removeNode().

◆ removeSingleNode()

void KisNodeManager::removeSingleNode ( KisNodeSP node)

Definition at line 1095 of file kis_node_manager.cpp.

1096{
1097 if (!node || !node->parent()) {
1098 return;
1099 }
1100
1101 KisNodeList nodes;
1102 nodes << node;
1103 removeSelectedNodes(nodes);
1104}

References KisNode::parent, and removeSelectedNodes().

◆ saveNodeAsImage

void KisNodeManager::saveNodeAsImage ( )
slot

Definition at line 1323 of file kis_node_manager.cpp.

1324{
1325 KisNodeSP node = activeNode();
1326
1327 if (!node) {
1328 warnKrita << "BUG: Save Node As Image was called without any node selected";
1329 return;
1330 }
1331
1332 KisPaintDeviceSP saveDevice = node->projection();
1333
1334 if (!saveDevice) {
1335 m_d->view->showFloatingMessage(i18nc("warning message when trying to export a transform mask", "Layer has no pixel data"), QIcon());
1336 return;
1337 }
1338
1339 KisImageSP image = m_d->view->image();
1340 QRect saveRect = image->bounds() | node->exactBounds();
1341
1342 m_d->saveDeviceAsImage(saveDevice,
1343 node->name(),
1344 saveRect,
1345 image->xRes(), image->yRes(),
1346 node->opacity());
1347}
double xRes() const
double yRes() const
virtual QRect exactBounds() const
quint8 opacity() const
void saveDeviceAsImage(KisPaintDeviceSP device, const QString &defaultName, const QRect &bounds, qreal xRes, qreal yRes, quint8 opacity)

References activeNode(), KisImage::bounds(), KisBaseNode::exactBounds(), KisViewManager::image(), m_d, KisBaseNode::name(), KisBaseNode::opacity(), KisBaseNode::projection(), KisNodeManager::Private::saveDeviceAsImage(), KisViewManager::showFloatingMessage(), KisNodeManager::Private::view, warnKrita, KisImage::xRes(), and KisImage::yRes().

◆ saveVectorLayerAsImage

void KisNodeManager::saveVectorLayerAsImage ( )
slot

Definition at line 1351 of file kis_node_manager.cpp.

1352{
1353 KisShapeLayerSP shapeLayer = qobject_cast<KisShapeLayer*>(activeNode().data());
1354 if (!shapeLayer) {
1355 return;
1356 }
1357
1359 dialog.setCaption(i18nc("@title:window", "Export to SVG"));
1360 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1361 dialog.setMimeTypeFilters(QStringList() << "image/svg+xml", "image/svg+xml");
1362 QString filename = dialog.filename();
1363
1364 if (filename.isEmpty()) return;
1365
1366 QUrl url = QUrl::fromLocalFile(filename);
1367
1368 if (url.isEmpty()) return;
1369
1370 const QSizeF sizeInPx = m_d->view->image()->bounds().size();
1371 const QSizeF sizeInPt(sizeInPx.width() / m_d->view->image()->xRes(),
1372 sizeInPx.height() / m_d->view->image()->yRes());
1373
1374 QList<KoShape*> shapes = shapeLayer->shapes();
1375 std::sort(shapes.begin(), shapes.end(), KoShape::compareShapeZIndex);
1376
1377 SvgWriter writer(shapes);
1378 if (!writer.save(filename, sizeInPt, true)) {
1379 QMessageBox::warning(qApp->activeWindow(), i18nc("@title:window", "Krita"), i18n("Could not save to svg: %1", filename));
1380 }
1381}
QList< KoShape * > shapes() const
static bool compareShapeZIndex(KoShape *s1, KoShape *s2)
Definition KoShape.cpp:388
Implements exporting shapes to SVG.
Definition SvgWriter.h:33

References activeNode(), KisImage::bounds(), KoShape::compareShapeZIndex(), KisViewManager::image(), m_d, KisViewManager::mainWindowAsQWidget(), SvgWriter::save(), KoFileDialog::SaveFile, KoShapeContainer::shapes(), KisNodeManager::Private::view, KisImage::xRes(), and KisImage::yRes().

◆ selectAllNodes

void KisNodeManager::selectAllNodes ( )
slot

Definition at line 1760 of file kis_node_manager.cpp.

1761{
1762 KoProperties props;
1763 selectLayersImpl(props, props);
1764}
void selectLayersImpl(const KoProperties &props, const KoProperties &invertedProps)

References selectLayersImpl().

◆ selectedNodes()

KisNodeList KisNodeManager::selectedNodes ( )

Definition at line 986 of file kis_node_manager.cpp.

987{
988 return m_d->selectedNodes;
989}

References m_d, and KisNodeManager::Private::selectedNodes.

◆ selectInvisibleNodes

void KisNodeManager::selectInvisibleNodes ( )
slot

Definition at line 1788 of file kis_node_manager.cpp.

1789{
1790 KoProperties props;
1791 props.setProperty("visible", false);
1792
1793 KoProperties invertedProps;
1794 invertedProps.setProperty("visible", true);
1795
1796 selectLayersImpl(props, invertedProps);
1797}
void setProperty(const QString &name, const QVariant &value)

References selectLayersImpl(), and KoProperties::setProperty().

◆ selectLayersImpl()

void KisNodeManager::selectLayersImpl ( const KoProperties & props,
const KoProperties & invertedProps )
private

Definition at line 1744 of file kis_node_manager.cpp.

1745{
1746 KisImageSP image = m_d->view->image();
1747 KisNodeList nodes = KisLayerUtils::findNodesWithProps(image->root(), props, true);
1748
1750
1752 nodes = KisLayerUtils::findNodesWithProps(image->root(), invertedProps, true);
1753 }
1754
1755 if (!nodes.isEmpty()) {
1756 slotImageRequestNodeReselection(nodes.last(), nodes);
1757 }
1758}
KisNodeList findNodesWithProps(KisNodeSP root, const KoProperties &props, bool excludeRoot)

References KritaUtils::compareListsUnordered(), KisLayerUtils::findNodesWithProps(), KisViewManager::image(), m_d, KisNodeFacade::root, selectedNodes(), slotImageRequestNodeReselection(), and KisNodeManager::Private::view.

◆ selectLockedNodes

void KisNodeManager::selectLockedNodes ( )
slot

Definition at line 1777 of file kis_node_manager.cpp.

1778{
1779 KoProperties props;
1780 props.setProperty("locked", true);
1781
1782 KoProperties invertedProps;
1783 invertedProps.setProperty("locked", false);
1784
1785 selectLayersImpl(props, invertedProps);
1786}

References selectLayersImpl(), and KoProperties::setProperty().

◆ selectUnlockedNodes

void KisNodeManager::selectUnlockedNodes ( )
slot

Definition at line 1799 of file kis_node_manager.cpp.

1800{
1801 KoProperties props;
1802 props.setProperty("locked", false);
1803
1804 KoProperties invertedProps;
1805 invertedProps.setProperty("locked", true);
1806
1807 selectLayersImpl(props, invertedProps);
1808}

References selectLayersImpl(), and KoProperties::setProperty().

◆ selectVisibleNodes

void KisNodeManager::selectVisibleNodes ( )
slot

Definition at line 1766 of file kis_node_manager.cpp.

1767{
1768 KoProperties props;
1769 props.setProperty("visible", true);
1770
1771 KoProperties invertedProps;
1772 invertedProps.setProperty("visible", false);
1773
1774 selectLayersImpl(props, invertedProps);
1775}

References selectLayersImpl(), and KoProperties::setProperty().

◆ setIsolateActiveGroupMode

void KisNodeManager::setIsolateActiveGroupMode ( bool checked)
slot

Definition at line 575 of file kis_node_manager.cpp.

576{
577 KisImageWSP image = m_d->view->image();
579
580 const bool layerIsolationState = image->isIsolatingLayer();
581 changeIsolationMode(layerIsolationState, checked);
582}
void changeIsolationMode(bool isolateActiveLayer, bool isolateActiveGroup)

References changeIsolationMode(), KisViewManager::image(), KisImage::isIsolatingLayer(), KIS_ASSERT_RECOVER_RETURN, m_d, and KisNodeManager::Private::view.

◆ setIsolateActiveLayerMode

void KisNodeManager::setIsolateActiveLayerMode ( bool checked)
slot

Definition at line 566 of file kis_node_manager.cpp.

567{
568 KisImageWSP image = m_d->view->image();
570
571 const bool groupIsolationState = image->isIsolatingGroup();
572 changeIsolationMode(checked, groupIsolationState);
573}

References changeIsolationMode(), KisViewManager::image(), KisImage::isIsolatingGroup(), KIS_ASSERT_RECOVER_RETURN, m_d, and KisNodeManager::Private::view.

◆ setNodeCompositeOp()

void KisNodeManager::setNodeCompositeOp ( KisNodeSP node,
const KoCompositeOp * compositeOp )

Sets compositeOp for the node in a universal way (masks/layers)

Definition at line 961 of file kis_node_manager.cpp.

963{
964 if (!node) return;
965 if (node->compositeOp() == compositeOp) return;
966
967 m_d->commandsAdapter.setCompositeOp(node, compositeOp);
968}
void setCompositeOp(KisNodeSP node, const KoCompositeOp *compositeOp)
QString compositeOp

References KisNodeManager::Private::commandsAdapter, KisBaseNode::compositeOp, m_d, and KisNodeCommandsAdapter::setCompositeOp().

◆ setNodeName()

void KisNodeManager::setNodeName ( KisNodeSP node,
const QString & name )

Sets the name for the node in a universal way (masks/layers)

Definition at line 944 of file kis_node_manager.cpp.

945{
946 if (!node) return;
947 if (node->name() == name) return;
948
949 m_d->commandsAdapter.setNodeName(node, name);
950
951}
void setNodeName(KisNodeSP node, const QString &name)

References KisNodeManager::Private::commandsAdapter, m_d, KisBaseNode::name(), and KisNodeCommandsAdapter::setNodeName().

◆ setNodeOpacity()

void KisNodeManager::setNodeOpacity ( KisNodeSP node,
qint32 opacity )

Sets opacity for the node in a universal way (masks/layers)

Definition at line 953 of file kis_node_manager.cpp.

954{
955 if (!node) return;
956 if (node->opacity() == opacity) return;
957
958 m_d->commandsAdapter.setOpacity(node, opacity);
959}
void setOpacity(KisNodeSP node, qint32 opacity)

References KisNodeManager::Private::commandsAdapter, m_d, KisBaseNode::opacity(), and KisNodeCommandsAdapter::setOpacity().

◆ setup()

void KisNodeManager::setup ( KisKActionCollection * collection,
KisActionManager * actionManager )

Definition at line 274 of file kis_node_manager.cpp.

275{
276 m_d->layerManager.setup(actionManager);
277 m_d->maskManager.setup(actionCollection, actionManager);
278
279 KisAction * action = 0;
280
281 action = actionManager->createAction("mirrorNodeX");
282 connect(action, SIGNAL(triggered()), this, SLOT(mirrorNodeX()));
283
284 action = actionManager->createAction("mirrorNodeY");
285 connect(action, SIGNAL(triggered()), this, SLOT(mirrorNodeY()));
286
287 action = actionManager->createAction("mirrorAllNodesX");
288 connect(action, SIGNAL(triggered()), this, SLOT(mirrorAllNodesX()));
289
290 action = actionManager->createAction("mirrorAllNodesY");
291 connect(action, SIGNAL(triggered()), this, SLOT(mirrorAllNodesY()));
292
293 action = actionManager->createAction("activateNextLayer");
294 connect(action, SIGNAL(triggered()), this, SLOT(activateNextNode()));
295
296 action = actionManager->createAction("activateNextSiblingLayer");
297 connect(action, SIGNAL(triggered()), this, SLOT(activateNextSiblingNode()));
298
299 action = actionManager->createAction("activatePreviousLayer");
300 connect(action, SIGNAL(triggered()), this, SLOT(activatePreviousNode()));
301
302 action = actionManager->createAction("activatePreviousSiblingLayer");
303 connect(action, SIGNAL(triggered()), this, SLOT(activatePreviousSiblingNode()));
304
305 action = actionManager->createAction("switchToPreviouslyActiveNode");
306 connect(action, SIGNAL(triggered()), this, SLOT(switchToPreviouslyActiveNode()));
307
308 action = actionManager->createAction("save_node_as_image");
309 connect(action, SIGNAL(triggered()), this, SLOT(saveNodeAsImage()));
310
311 action = actionManager->createAction("save_vector_node_to_svg");
312 connect(action, SIGNAL(triggered()), this, SLOT(saveVectorLayerAsImage()));
314
315 action = actionManager->createAction("duplicatelayer");
316 connect(action, SIGNAL(triggered()), this, SLOT(duplicateActiveNode()));
317
318 action = actionManager->createAction("copy_layer_clipboard");
319 connect(action, SIGNAL(triggered()), this, SLOT(copyLayersToClipboard()));
320
321 action = actionManager->createAction("cut_layer_clipboard");
322 connect(action, SIGNAL(triggered()), this, SLOT(cutLayersToClipboard()));
323
324 action = actionManager->createAction("paste_layer_from_clipboard");
325 connect(action, SIGNAL(triggered()), this, SLOT(pasteLayersFromClipboard()));
326
327 action = actionManager->createAction("create_quick_group");
328 connect(action, SIGNAL(triggered()), this, SLOT(createQuickGroup()));
329
330 action = actionManager->createAction("create_quick_clipping_group");
331 connect(action, SIGNAL(triggered()), this, SLOT(createQuickClippingGroup()));
332
333 action = actionManager->createAction("quick_ungroup");
334 connect(action, SIGNAL(triggered()), this, SLOT(quickUngroup()));
335
336 action = actionManager->createAction("select_all_layers");
337 connect(action, SIGNAL(triggered()), this, SLOT(selectAllNodes()));
338
339 action = actionManager->createAction("select_visible_layers");
340 connect(action, SIGNAL(triggered()), this, SLOT(selectVisibleNodes()));
341
342 action = actionManager->createAction("select_locked_layers");
343 connect(action, SIGNAL(triggered()), this, SLOT(selectLockedNodes()));
344
345 action = actionManager->createAction("select_invisible_layers");
346 connect(action, SIGNAL(triggered()), this, SLOT(selectInvisibleNodes()));
347
348 action = actionManager->createAction("select_unlocked_layers");
349 connect(action, SIGNAL(triggered()), this, SLOT(selectUnlockedNodes()));
350
351 action = actionManager->createAction("new_from_visible");
352 connect(action, SIGNAL(triggered()), this, SLOT(createFromVisible()));
353
354 action = actionManager->createAction("create_reference_image_from_active_layer");
355 connect(action, SIGNAL(triggered()), this, SLOT(createReferenceImageFromLayer()));
356
357 action = actionManager->createAction("create_reference_image_from_visible_canvas");
358 connect(action, SIGNAL(triggered()), this, SLOT(createReferenceImageFromVisible()));
359
360 action = actionManager->createAction("pin_to_timeline");
361 action->setCheckable(true);
362 connect(action, SIGNAL(toggled(bool)), this, SLOT(slotPinToTimeline(bool)));
363 m_d->pinToTimeline = action;
364
365 NEW_LAYER_ACTION("add_new_paint_layer", "KisPaintLayer");
366
367 NEW_LAYER_ACTION("add_new_group_layer", "KisGroupLayer");
368
369 NEW_LAYER_ACTION("add_new_clone_layer", "KisCloneLayer");
370
371 NEW_LAYER_ACTION("add_new_shape_layer", "KisShapeLayer");
372
373 NEW_LAYER_ACTION("add_new_adjustment_layer", "KisAdjustmentLayer");
374
375 NEW_LAYER_ACTION("add_new_fill_layer", "KisGeneratorLayer");
376
377 NEW_LAYER_ACTION("add_new_file_layer", "KisFileLayer");
378
379 NEW_LAYER_ACTION("add_new_transparency_mask", "KisTransparencyMask");
380
381 NEW_LAYER_ACTION("add_new_filter_mask", "KisFilterMask");
382
383 // NOTE: FastColorOverlayFilterMask is just an identifier, not an actual class name
384 NEW_LAYER_ACTION("add_new_fast_color_overlay_mask", "FastColorOverlayFilterMask");
385
386 NEW_LAYER_ACTION("add_new_colorize_mask", "KisColorizeMask");
387
388 NEW_LAYER_ACTION("add_new_transform_mask", "KisTransformMask");
389
390 NEW_LAYER_ACTION("add_new_selection_mask", "KisSelectionMask");
391
392 connect(&m_d->nodeCreationSignalMapper, SIGNAL(mapped(QString)),
393 this, SLOT(createNode(QString)));
394
395 CONVERT_NODE_ACTION("convert_to_paint_layer", "KisPaintLayer");
396
397 CONVERT_NODE_ACTION_2("convert_to_selection_mask", "KisSelectionMask", QStringList() << "KisSelectionMask" << "KisColorizeMask");
398
399 CONVERT_NODE_ACTION_2("convert_to_filter_mask", "KisFilterMask", QStringList() << "KisFilterMask" << "KisColorizeMask");
400
401 CONVERT_NODE_ACTION_2("convert_to_transparency_mask", "KisTransparencyMask", QStringList() << "KisTransparencyMask" << "KisColorizeMask");
402
403 CONVERT_NODE_ACTION_2("convert_to_file_layer", "KisFileLayer", QStringList() << "KisFileLayer" << "KisCloneLayer");
404
405 connect(&m_d->nodeConversionSignalMapper, SIGNAL(mapped(QString)),
406 this, SLOT(convertNode(QString)));
407
408 // Isolation Modes...
409 // Post Qt5.14 this can be replaced with QActionGroup + ExclusionPolicy::ExclusiveOptional.
410 action = actionManager->createAction("isolate_active_layer");
411 connect(action, SIGNAL(toggled(bool)), this, SLOT(setIsolateActiveLayerMode(bool)));
412 action = actionManager->createAction("isolate_active_group");
413 connect(action, SIGNAL(triggered(bool)), this, SLOT(setIsolateActiveGroupMode(bool)));
414 connect(this, SIGNAL(sigNodeActivated(KisNodeSP)), SLOT(changeIsolationRoot(KisNodeSP)));
415
416 action = actionManager->createAction("toggle_layer_visibility");
417 connect(action, SIGNAL(triggered()), this, SLOT(toggleVisibility()));
418
419 action = actionManager->createAction("toggle_layer_lock");
420 connect(action, SIGNAL(triggered()), this, SLOT(toggleLock()));
421
422 action = actionManager->createAction("toggle_layer_inherit_alpha");
423 connect(action, SIGNAL(triggered()), this, SLOT(toggleInheritAlpha()));
424
425 action = actionManager->createAction("toggle_layer_alpha_lock");
426 connect(action, SIGNAL(triggered()), this, SLOT(toggleAlphaLock()));
427
428 action = actionManager->createAction("split_alpha_into_mask");
429 connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaIntoMask()));
430
431 action = actionManager->createAction("split_alpha_write");
432 connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaWrite()));
433
434 // HINT: we can save even when the nodes are not editable
435 action = actionManager->createAction("split_alpha_save_merged");
436 connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaSaveMerged()));
437}
KisAction * createAction(const QString &name)
void setActivationFlags(ActivationFlags flags)
@ ACTIVE_SHAPE_LAYER
Activate if the current node is a vector layer.
Definition kis_action.h:50
void setup(KisActionManager *actionManager)
void setup(KisKActionCollection *actionCollection, KisActionManager *actionManager)
void setIsolateActiveGroupMode(bool checked)
void createReferenceImageFromVisible()
void slotPinToTimeline(bool value)
void switchToPreviouslyActiveNode()
void setIsolateActiveLayerMode(bool checked)
void changeIsolationRoot(KisNodeSP isolationRoot)
void pasteLayersFromClipboard(bool changeOffset=false, QPointF offset=QPointF(), KisProcessingApplicator *applicator=nullptr)
void sigNodeActivated(KisNodeSP node)
emitted whenever a node is selected.
void createReferenceImageFromLayer()
void convertNode(const QString &nodeType)
#define CONVERT_NODE_ACTION_2(id, layerType, exclude)
#define CONVERT_NODE_ACTION(id, layerType)
#define NEW_LAYER_ACTION(id, layerType)
KisSignalMapper nodeCreationSignalMapper
KisSignalMapper nodeConversionSignalMapper

References activateNextNode(), activateNextSiblingNode(), activatePreviousNode(), activatePreviousSiblingNode(), KisAction::ACTIVE_SHAPE_LAYER, changeIsolationRoot(), CONVERT_NODE_ACTION, CONVERT_NODE_ACTION_2, convertNode(), copyLayersToClipboard(), KisActionManager::createAction(), createFromVisible(), createNode(), createQuickClippingGroup(), createQuickGroup(), createReferenceImageFromLayer(), createReferenceImageFromVisible(), cutLayersToClipboard(), duplicateActiveNode(), KisNodeManager::Private::layerManager, m_d, KisNodeManager::Private::maskManager, mirrorAllNodesX(), mirrorAllNodesY(), mirrorNodeX(), mirrorNodeY(), NEW_LAYER_ACTION, KisNodeManager::Private::nodeConversionSignalMapper, KisNodeManager::Private::nodeCreationSignalMapper, pasteLayersFromClipboard(), KisNodeManager::Private::pinToTimeline, quickUngroup(), saveNodeAsImage(), saveVectorLayerAsImage(), selectAllNodes(), selectInvisibleNodes(), selectLockedNodes(), selectUnlockedNodes(), selectVisibleNodes(), KisAction::setActivationFlags(), setIsolateActiveGroupMode(), setIsolateActiveLayerMode(), KisLayerManager::setup(), KisMaskManager::setup(), sigNodeActivated(), slotPinToTimeline(), slotSplitAlphaIntoMask(), slotSplitAlphaSaveMerged(), slotSplitAlphaWrite(), switchToPreviouslyActiveNode(), toggleAlphaLock(), toggleInheritAlpha(), toggleLock(), and toggleVisibility().

◆ setView()

void KisNodeManager::setView ( QPointer< KisView > imageView)

The view has not been initialized yet, so we should try to initialize it with the node saved in KisDummiesFacadeBase (or just wait for a signal from it)

If the view is initialized, we should check if the layer still belongs to the actual image, since it could have been removed. And since the forwarding happens via KisNodeManager, the could have missed this update.

Definition at line 203 of file kis_node_manager.cpp.

204{
205 m_d->maskManager.setView(imageView);
206 m_d->layerManager.setView(imageView);
207
208 if (m_d->imageView) {
209 KisShapeController *shapeController = dynamic_cast<KisShapeController*>(m_d->imageView->document()->shapeController());
210 Q_ASSERT(shapeController);
211 shapeController->disconnect(SIGNAL(sigActivateNode(KisNodeSP)), this);
212 m_d->imageView->image()->disconnect(this);
213 m_d->imageView->image()->disconnect(&m_d->activateNodeConnection);
214 }
215
216 m_d->imageView = imageView;
217
218 if (m_d->imageView) {
219 KisShapeController *shapeController = dynamic_cast<KisShapeController*>(m_d->imageView->document()->shapeController());
220 Q_ASSERT(shapeController);
221 connect(shapeController, SIGNAL(sigActivateNode(KisNodeSP)), SLOT(slotNonUiActivatedNode(KisNodeSP)));
222
223 if (!m_d->imageView->currentNode()) {
228 if (shapeController->lastActivatedNode() && !m_d->imageView->currentNode()) {
229 slotNonUiActivatedNode(shapeController->lastActivatedNode());
230 } else {
231 // if last activated node is null, most probably, it means that the shape controller
232 // is going to Q_EMIT the activation signal very soon
233 }
234 } else {
241 if (!m_d->imageView->currentNode()->graphListener()) {
242 slotNonUiActivatedNode(m_d->imageView->image()->root()->lastChild());
243 }
244 }
245
247 m_d->imageView->resourceProvider()->slotNodeActivated(m_d->imageView->currentNode());
248 connect(m_d->imageView->image(), SIGNAL(sigIsolatedModeChanged()), this, SLOT(handleExternalIsolationChange()));
249 }
250
251}
void sigRequestNodeReselection(KisNodeSP activeNode, const KisNodeList &selectedNodes)
void setView(QPointer< KisView >view)
void setView(QPointer< KisView >view)
void handleExternalIsolationChange()

References KisNodeManager::Private::activateNodeConnection, handleExternalIsolationChange(), KisNodeManager::Private::imageView, KisDummiesFacadeBase::lastActivatedNode(), KisNodeManager::Private::layerManager, m_d, KisNodeManager::Private::maskManager, KisLayerManager::setView(), KisMaskManager::setView(), KisImage::sigRequestNodeReselection(), and slotNonUiActivatedNode().

◆ sigNodeActivated

void KisNodeManager::sigNodeActivated ( KisNodeSP node)
signal

emitted whenever a node is selected.

◆ sigUiNeedChangeActiveNode

void KisNodeManager::sigUiNeedChangeActiveNode ( KisNodeSP node)
signal

for the layer box: this sets the current node in the layerbox without telling the node manager that the node is activated, preventing loops (I think...)

◆ sigUiNeedChangeSelectedNodes

void KisNodeManager::sigUiNeedChangeSelectedNodes ( const QList< KisNodeSP > & nodes)
signal

◆ slotImageRequestNodeReselection

void KisNodeManager::slotImageRequestNodeReselection ( KisNodeSP activeNode,
const KisNodeList & selectedNodes )
slot

Definition at line 970 of file kis_node_manager.cpp.

971{
972 if (activeNode) {
974 }
975 if (!selectedNodes.isEmpty()) {
977 }
978}
void slotSetSelectedNodes(const KisNodeList &nodes)
slotSetSelectedNodes set the list of nodes selected in the layerbox. Selected nodes are not necessari...

References activeNode(), selectedNodes(), slotNonUiActivatedNode(), and slotSetSelectedNodes().

◆ slotNonUiActivatedNode

void KisNodeManager::slotNonUiActivatedNode ( KisNodeSP node)
slot

Explicitly activates node The UI will be noticed that active node has been changed. Both sigNodeActivated and sigUiNeedChangeActiveNode are emitted.

WARNING: normally you needn't call this method manually. It is automatically called when a node is added to the graph. If you have some special cases when you need to activate a node, consider adding them to KisDummiesFacadeBase instead. Calling this method directly should be the last resort.

See also
slotUiActivatedNode for comparison

Definition at line 821 of file kis_node_manager.cpp.

822{
823 // the node must still be in the graph, some asynchronous
824 // signals may easily break this requirement
825 if (node && !node->graphListener()) {
826 node = 0;
827 }
828
829 if (node == activeNode()) return;
830
832}
void slotSomethingActivatedNodeImpl(KisNodeSP node)
KisNodeGraphListener * graphListener
Definition kis_node.cpp:87

References activeNode(), KisNode::graphListener, and slotSomethingActivatedNodeImpl().

◆ slotPinToTimeline

void KisNodeManager::slotPinToTimeline ( bool value)
slot

Definition at line 694 of file kis_node_manager.cpp.

695{
696 Q_FOREACH (KisNodeSP node, selectedNodes()) {
698 }
699}
float value(const T *src, size_t ch)
void setPinnedToTimeline(bool pinned)

References selectedNodes(), KisBaseNode::setPinnedToTimeline(), and value().

◆ slotSetSelectedNodes

void KisNodeManager::slotSetSelectedNodes ( const KisNodeList & nodes)
slot

slotSetSelectedNodes set the list of nodes selected in the layerbox. Selected nodes are not necessarily active nodes.

Parameters
nodesthe selected nodes

Definition at line 980 of file kis_node_manager.cpp.

981{
982 m_d->selectedNodes = nodes;
983 Q_EMIT sigUiNeedChangeSelectedNodes(nodes);
984}
void sigUiNeedChangeSelectedNodes(const QList< KisNodeSP > &nodes)

References m_d, KisNodeManager::Private::selectedNodes, and sigUiNeedChangeSelectedNodes().

◆ slotSomethingActivatedNodeImpl()

void KisNodeManager::slotSomethingActivatedNodeImpl ( KisNodeSP node)
private

Notify the dummies facade about the lastly activated node. This information may be used when a new view is created for the image.

Definition at line 789 of file kis_node_manager.cpp.

790{
791 KisDummiesFacadeBase *dummiesFacade = dynamic_cast<KisDummiesFacadeBase*>(m_d->imageView->document()->shapeController());
792 KIS_SAFE_ASSERT_RECOVER_RETURN(dummiesFacade);
793
794 const bool nodeVisible = !isNodeHidden(node, !m_d->nodeDisplayModeAdapter->showGlobalSelectionMask());
795 if (!nodeVisible) {
796 return;
797 }
798
800 if (m_d->activateNodeImpl(node)) {
801 if (node) {
807 dummiesFacade->setLastActivatedNode(node);
808 }
809 Q_EMIT sigUiNeedChangeActiveNode(node);
810 Q_EMIT sigNodeActivated(node);
811 nodesUpdated();
812 if (node) {
813 bool toggled = m_d->view->actionCollection()->action("view_show_canvas_only")->isChecked();
814 if (toggled) {
815 m_d->view->showFloatingMessage( node->name(), QIcon(), 1600, KisFloatingMessage::Medium, Qt::TextSingleLine);
816 }
817 }
818 }
819}
void setLastActivatedNode(KisNodeSP node)
QAction * action(int index) const
void sigUiNeedChangeActiveNode(KisNodeSP node)
virtual KisKActionCollection * actionCollection() const
bool activateNodeImpl(KisNodeSP node)

References KisKActionCollection::action(), KisViewManager::actionCollection(), KisNodeManager::Private::activateNodeImpl(), activeNode(), KisNodeManager::Private::imageView, isNodeHidden(), KIS_ASSERT_RECOVER_RETURN, KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisFloatingMessage::Medium, KisBaseNode::name(), KisNodeManager::Private::nodeDisplayModeAdapter, nodesUpdated(), KisDummiesFacadeBase::setLastActivatedNode(), KisViewManager::showFloatingMessage(), sigNodeActivated(), sigUiNeedChangeActiveNode(), and KisNodeManager::Private::view.

◆ slotSplitAlphaIntoMask

void KisNodeManager::slotSplitAlphaIntoMask ( )
slot

Definition at line 1383 of file kis_node_manager.cpp.

1384{
1385 KisNodeSP node = activeNode();
1386 if (!canModifyLayer(node)) return;
1387
1388 // guaranteed by KisActionManager
1390
1391 KisLayerUtils::splitAlphaToMask(node->image(), node, m_d->maskManager.createMaskNameCommon(node, "KisTransparencyMask", i18n("Transparency Mask")));
1392}
QString createMaskNameCommon(KisNodeSP targetNode, const QString &nodeType, const QString &desiredName)
void splitAlphaToMask(KisImageSP image, KisNodeSP node, const QString &maskName)
KisImageWSP image
bool hasEditablePaintDevice() const

References activeNode(), canModifyLayer(), KisMaskManager::createMaskNameCommon(), KisBaseNode::hasEditablePaintDevice(), KisBaseNode::image, KIS_ASSERT_RECOVER_RETURN, m_d, KisNodeManager::Private::maskManager, and KisLayerUtils::splitAlphaToMask().

◆ slotSplitAlphaSaveMerged

void KisNodeManager::slotSplitAlphaSaveMerged ( )
slot

Definition at line 1471 of file kis_node_manager.cpp.

1472{
1474}
void mergeTransparencyMaskAsAlpha(bool writeToLayers)

References m_d, and KisNodeManager::Private::mergeTransparencyMaskAsAlpha().

◆ slotSplitAlphaWrite

void KisNodeManager::slotSplitAlphaWrite ( )
slot

Definition at line 1466 of file kis_node_manager.cpp.

1467{
1469}

References m_d, and KisNodeManager::Private::mergeTransparencyMaskAsAlpha().

◆ slotUiActivatedNode

void KisNodeManager::slotUiActivatedNode ( KisNodeSP node)
slot

Activates node. All non-ui listeners are notified with sigNodeActivated, sigUiNeedChangeActiveNode is not emitted.

See also
activateNode

Definition at line 834 of file kis_node_manager.cpp.

835{
836 // the node must still be in the graph, some asynchronous
837 // signals may easily break this requirement
838 if (node && !node->graphListener()) {
839 node = 0;
840 }
841
842 if (node) {
843 QStringList vectorTools = QStringList()
844 << "InteractionTool"
845 << "KarbonGradientTool"
846 << "KarbonCalligraphyTool"
847 << "PathTool";
848
849 QStringList pixelTools = QStringList()
850 << "KritaShape/KisToolBrush"
851 << "KritaShape/KisToolDyna"
852 << "KritaShape/KisToolMultiBrush"
853 << "KritaFill/KisToolFill"
854 << "KritaFill/KisToolGradient";
855
856 KisSelectionMask *selectionMask = dynamic_cast<KisSelectionMask*>(node.data());
857 const bool nodeHasVectorAbilities = node->inherits("KisShapeLayer") ||
858 (selectionMask && selectionMask->selection()->hasShapeSelection());
859
860 if (nodeHasVectorAbilities) {
861 if (pixelTools.contains(KoToolManager::instance()->activeToolId())) {
862 KoToolManager::instance()->switchToolRequested("InteractionTool");
863 }
864 }
865 else {
866 if (vectorTools.contains(KoToolManager::instance()->activeToolId())) {
867 KoToolManager::instance()->switchToolRequested("KritaShape/KisToolBrush");
868 }
869 }
870 }
871
872 if (node == activeNode()) return;
873
875}
QString activeToolId() const
Returns the toolId of the currently active tool.
KisSelectionSP selection
Definition kis_mask.cc:44
bool hasShapeSelection() const

References activeNode(), KoToolManager::activeToolId(), KisSharedPtr< T >::data(), KisNode::graphListener, KisSelection::hasShapeSelection(), KoToolManager::instance(), KisMask::selection, slotSomethingActivatedNodeImpl(), and KoToolManager::switchToolRequested().

◆ slotUiActivateNode()

void KisNodeManager::slotUiActivateNode ( )
private

slotUiActivateNode inspects the sender to see which node needs to be activated.

Definition at line 1810 of file kis_node_manager.cpp.

1811{
1812 if (!sender()->property("node").isNull()) {
1813 QString name = sender()->property("node").toString();
1814 KisNodeSP node = KisLayerUtils::findNodeByName(m_d->imageView->image()->rootLayer(),name);
1815 if (node) {
1816 slotUiActivatedNode(node);
1817 }
1818 }
1819}
void slotUiActivatedNode(KisNodeSP node)
KisNodeSP findNodeByName(KisNodeSP root, const QString &name)

References KisLayerUtils::findNodeByName(), KisNodeManager::Private::imageView, m_d, and slotUiActivatedNode().

◆ switchToPreviouslyActiveNode

void KisNodeManager::switchToPreviouslyActiveNode ( )
slot

◆ toggleAlphaLock

void KisNodeManager::toggleAlphaLock ( )
slot

Definition at line 1502 of file kis_node_manager.cpp.

1503{
1504 KisNodeList nodes = this->selectedNodes();
1505 KisNodeSP active = activeNode();
1506 if (nodes.isEmpty() || !active) return;
1507
1508 auto layer = qobject_cast<KisPaintLayer*>(active.data());
1509 if (!layer) {
1510 return;
1511 }
1512
1513 bool isAlphaLocked = layer->alphaLocked();
1514 for (auto &node : nodes) {
1515 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1516 if (layer) {
1518 }
1519 }
1520}
static void setNodePropertyAutoUndo(KisNodeSP node, const KoID &id, const QVariant &value, KisImageSP image)

References activeNode(), KisLayerPropertiesIcons::alphaLocked, KisSharedPtr< T >::data(), KisViewManager::image(), m_d, selectedNodes(), KisLayerPropertiesIcons::setNodePropertyAutoUndo(), and KisNodeManager::Private::view.

◆ toggleInheritAlpha

void KisNodeManager::toggleInheritAlpha ( )
slot

Definition at line 1522 of file kis_node_manager.cpp.

1523{
1524 KisNodeList nodes = this->selectedNodes();
1525 KisNodeSP active = activeNode();
1526 if (nodes.isEmpty() || !active) return;
1527
1528 auto layer = qobject_cast<KisLayer*>(active.data());
1529 if (!layer) {
1530 return;
1531 }
1532
1533 bool isAlphaDisabled = layer->alphaChannelDisabled();
1534 for (auto &node : nodes) {
1535 auto layer = qobject_cast<KisLayer*>(node.data());
1536 if (layer) {
1538 }
1539 }
1540}

References activeNode(), KisSharedPtr< T >::data(), KisViewManager::image(), KisLayerPropertiesIcons::inheritAlpha, m_d, selectedNodes(), KisLayerPropertiesIcons::setNodePropertyAutoUndo(), and KisNodeManager::Private::view.

◆ toggleIsolateActiveNode

void KisNodeManager::toggleIsolateActiveNode ( )
slot

Definition at line 560 of file kis_node_manager.cpp.

561{
562 QAction* action = m_d->view->actionManager()->actionByName("isolate_active_layer");
563 action->toggle();
564}

References KisActionManager::actionByName(), KisViewManager::actionManager(), m_d, and KisNodeManager::Private::view.

◆ toggleLock

void KisNodeManager::toggleLock ( )
slot

Definition at line 1476 of file kis_node_manager.cpp.

1477{
1478 KisNodeList nodes = this->selectedNodes();
1479 KisNodeSP active = activeNode();
1480 if (nodes.isEmpty() || !active) return;
1481
1482 bool isLocked = active->userLocked();
1483
1484 for (auto &node : nodes) {
1486 }
1487}
bool userLocked() const

References activeNode(), KisViewManager::image(), KisLayerPropertiesIcons::locked, m_d, selectedNodes(), KisLayerPropertiesIcons::setNodePropertyAutoUndo(), KisBaseNode::userLocked(), and KisNodeManager::Private::view.

◆ toggleVisibility

void KisNodeManager::toggleVisibility ( )
slot

Definition at line 1489 of file kis_node_manager.cpp.

1490{
1491 KisNodeList nodes = this->selectedNodes();
1492 KisNodeSP active = activeNode();
1493 if (nodes.isEmpty() || !active) return;
1494
1495 bool isVisible = active->visible();
1496
1497 for (auto &node : nodes) {
1499 }
1500}
virtual bool visible(bool recursive=false) const

References activeNode(), KisViewManager::image(), m_d, selectedNodes(), KisLayerPropertiesIcons::setNodePropertyAutoUndo(), KisNodeManager::Private::view, KisBaseNode::visible(), and KisLayerPropertiesIcons::visible.

◆ trySetNodeProperties()

bool KisNodeManager::trySetNodeProperties ( KisNodeSP node,
KisImageSP image,
KisBaseNode::PropertyList properties ) const

Definition at line 1020 of file kis_node_manager.cpp.

1021{
1022 const KisPaintLayer *paintLayer = dynamic_cast<KisPaintLayer*>(node.data());
1023 if (paintLayer) {
1025
1026 if (properties.contains(onionSkinOn)) {
1027 const KisPaintDeviceSP &paintDevice = paintLayer->paintDevice();
1028 if (paintDevice && paintDevice->defaultPixel().opacityU8() == 255) {
1029 m_d->view->showFloatingMessage(i18n("Onion skins require a layer with transparent background."), QIcon());
1030 return false;
1031 }
1032 }
1033 }
1034
1036
1037 return true;
1038}
static KisBaseNode::Property getProperty(const KoID &id, bool state)
static void setNodePropertiesAutoUndo(KisNodeSP node, KisImageSP image, PropertyList proplist)
KoColor defaultPixel() const
quint8 opacityU8() const
Definition KoColor.cpp:341
KisPaintDeviceSP paintDevice

References KisSharedPtr< T >::data(), KisPaintDevice::defaultPixel(), KisLayerPropertiesIcons::getProperty(), m_d, KisLayerPropertiesIcons::onionSkins, KoColor::opacityU8(), KisPaintLayer::paintDevice, KisNodePropertyListCommand::setNodePropertiesAutoUndo(), KisViewManager::showFloatingMessage(), and KisNodeManager::Private::view.

◆ updateGUI()

void KisNodeManager::updateGUI ( )

Friends And Related Symbol Documentation

◆ KisNodeActivationActionCreatorVisitor

Definition at line 265 of file kis_node_manager.h.

Member Data Documentation

◆ m_d

Private* const KisNodeManager::m_d
private

Definition at line 291 of file kis_node_manager.h.


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