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 1163 of file kis_node_manager.cpp.

1164{
1166 if (!activeNode) return;
1167
1168 KisNodeSP nextNode = activeNode->nextSibling();
1169
1170 if (!siblingsOnly) {
1171 // Recurse groups...
1172 while (nextNode && nextNode->childCount() > 0) {
1173 nextNode = nextNode->firstChild();
1174 }
1175
1176 // Out of nodes? Back out of group...
1177 if (!nextNode && activeNode->parent()) {
1178 nextNode = activeNode->parent();
1179 }
1180 }
1181
1182 // Skip nodes hidden from tree view..
1183 while (nextNode && isNodeHidden(nextNode, m_d->nodeDisplayModeAdapter->showGlobalSelectionMask())) {
1184 nextNode = nextNode->nextSibling();
1185 }
1186
1187 // Select node, unless root..
1188 if (nextNode && nextNode->parent()) {
1189 slotNonUiActivatedNode(nextNode);
1190 }
1191}
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 1193 of file kis_node_manager.cpp.

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

References activateNextNode().

◆ activatePreviousNode

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

Definition at line 1198 of file kis_node_manager.cpp.

1199{
1201 if (!activeNode) return;
1202
1203 KisNodeSP nextNode = activeNode->prevSibling();
1204
1205 if (!siblingsOnly) {
1206 // Enter groups..
1207 if (activeNode->childCount() > 0) {
1208 nextNode = activeNode->lastChild();
1209 }
1210
1211 // Out of nodes? Back out of group...
1212 if (!nextNode && activeNode->parent()) {
1213 nextNode = activeNode->parent()->prevSibling();
1214 }
1215 }
1216
1217 // Skip nodes hidden from tree view..
1218 while (nextNode && isNodeHidden(nextNode, m_d->nodeDisplayModeAdapter->showGlobalSelectionMask())) {
1219 nextNode = nextNode->prevSibling();
1220 }
1221
1222 // Select node, unless root..
1223 if (nextNode && nextNode->parent()) {
1224 slotNonUiActivatedNode(nextNode);
1225 }
1226}
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 1228 of file kis_node_manager.cpp.

1229{
1231}
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 461 of file kis_node_manager.cpp.

462{
465 } else {
466 Q_ASSERT(m_d->layerManager.activeLayer());
469 else
470 return m_d->view->image()->colorSpace();
471 }
472}
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 456 of file kis_node_manager.cpp.

457{
458 return m_d->layerManager.activeLayer();
459}

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 448 of file kis_node_manager.cpp.

449{
450 if (m_d->imageView) {
451 return m_d->imageView->currentNode();
452 }
453 return 0;
454}
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 555 of file kis_node_manager.cpp.

556{
557 KUndo2MagicString actionName = kundo2_i18n("Add Nodes");
558 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
559 juggler->addNode(nodes, parent, aboveThis);
560}
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 499 of file kis_node_manager.cpp.

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

References canModifyLayers().

◆ canModifyLayers()

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

Definition at line 474 of file kis_node_manager.cpp.

475{
476 KisNodeSP lockedNode;
477 Q_FOREACH (KisNodeSP node, nodes) {
478 if (!node->isEditable(false)) {
479 lockedNode = node;
480 break;
481 }
482 }
483
484 if (lockedNode && showWarning) {
485 QString errorMessage;
486
487 if (nodes.size() <= 1) {
488 errorMessage = i18n("Layer is locked");
489 } else {
490 errorMessage = i18n("Layer \"%1\" is locked", lockedNode->name());
491 }
492
493 m_d->view->showFloatingMessage(errorMessage, QIcon());
494 }
495
496 return !lockedNode;
497}
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 522 of file kis_node_manager.cpp.

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

References canMoveLayers().

◆ canMoveLayers()

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

Definition at line 504 of file kis_node_manager.cpp.

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

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 930 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 586 of file kis_node_manager.cpp.

587{
588 KisImageWSP image = m_d->view->image();
591
592 if (isolateActiveLayer || isolateActiveGroup) {
593 if (image->startIsolatedMode(activeNode, isolateActiveLayer, isolateActiveGroup) == false) {
595 }
596 } else {
597 image->stopIsolatedMode();
598 }
599}
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 601 of file kis_node_manager.cpp.

602{
603 KisImageWSP image = m_d->view->image();
604 if (!image || !isolationRoot) return;
605
606 const bool isIsolatingLayer = image->isIsolatingLayer();
607 const bool isIsolatingGroup = image->isIsolatingGroup();
608
609 // Restart isolation with a new root node and the same settings.
610 if (image->startIsolatedMode(isolationRoot, isIsolatingLayer, isIsolatingGroup) == false) {
612 }
613}
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 1543 of file kis_node_manager.cpp.

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

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

◆ convertNode

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

Definition at line 709 of file kis_node_manager.cpp.

710{
712 return;
713 }
714
716 if (!activeNode) return;
717
718 if (!canModifyLayer(activeNode)) return;
719
720 if (nodeType == "KisPaintLayer") {
722 } else if (nodeType == "KisSelectionMask" ||
723 nodeType == "KisFilterMask" ||
724 nodeType == "KisTransparencyMask") {
725
728
729 m_d->commandsAdapter.beginMacro(kundo2_i18n("Convert to a Selection Mask"));
730
731 bool result = false;
732
733 if (nodeType == "KisSelectionMask") {
734 result = !m_d->maskManager.createSelectionMask(activeNode, copyFrom, true).isNull();
735 } else if (nodeType == "KisFilterMask") {
736 result = !m_d->maskManager.createFilterMask(activeNode, copyFrom, false, true).isNull();
737 } else if (nodeType == "KisTransparencyMask") {
738 result = !m_d->maskManager.createTransparencyMask(activeNode, copyFrom, true).isNull();
739 }
740
742
743 if (!result) {
746 }
747 } else if (nodeType == "KisFileLayer") {
749 } else {
750 warnKrita << "Unsupported node conversion type:" << nodeType;
751 }
752}
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:87
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 935 of file kis_node_manager.cpp.

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

◆ copyLayersToClipboard

void KisNodeManager::copyLayersToClipboard ( )
slot

Definition at line 1583 of file kis_node_manager.cpp.

1584{
1585 KisNodeList nodes = this->selectedNodes();
1586 KisClipboard::instance()->setLayers(nodes, m_d->view->image(), true);
1587}
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 548 of file kis_node_manager.cpp.

549{
550 KUndo2MagicString actionName = kundo2_i18n("Copy Nodes");
551 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
552 juggler->copyNode(nodes, parent, aboveThis);
553}
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 691 of file kis_node_manager.cpp.

692{
694}
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 637 of file kis_node_manager.cpp.

638{
640 return 0;
641 }
642
644 if (!activeNode) {
645 activeNode = m_d->view->image()->root();
646 }
647
649
653
654 // XXX: make factories for this kind of stuff,
655 // with a registry
656
657 if (nodeType == "KisPaintLayer") {
659 } else if (nodeType == "KisGroupLayer") {
661 } else if (nodeType == "KisAdjustmentLayer") {
663 } else if (nodeType == "KisGeneratorLayer") {
665 } else if (nodeType == "KisShapeLayer") {
667 } else if (nodeType == "KisCloneLayer") {
668 KisNodeList nodes = selectedNodes();
669 if (nodes.isEmpty()) {
670 nodes.append(activeNode);
671 }
672 return m_d->layerManager.addCloneLayer(nodes);
673 } else if (nodeType == "KisTransparencyMask") {
674 return m_d->maskManager.createTransparencyMask(activeNode, copyFrom, false);
675 } else if (nodeType == "KisFilterMask") {
676 return m_d->maskManager.createFilterMask(activeNode, copyFrom, quiet, false);
677 } else if (nodeType == "FastColorOverlayFilterMask") {
679 } else if (nodeType == "KisColorizeMask") {
681 } else if (nodeType == "KisTransformMask") {
683 } else if (nodeType == "KisSelectionMask") {
684 return m_d->maskManager.createSelectionMask(activeNode, copyFrom, false);
685 } else if (nodeType == "KisFileLayer") {
687 }
688 return 0;
689}
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 703 of file kis_node_manager.cpp.

704{
705 KisNodeSP node = createNode("KisPaintLayer");
706 return dynamic_cast<KisLayer*>(node.data());
707}
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 1669 of file kis_node_manager.cpp.

1670{
1671 KUndo2MagicString actionName = kundo2_i18n("Quick Clipping Group");
1672 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1673
1675 KisNodeSP above;
1676
1677 KisImageSP image = m_d->view->image();
1678 if (createQuickGroupImpl(juggler, image->nextLayerName(i18nc("default name for a clipping group layer", "Clipping Group")), &parent, &above)) {
1679 KisPaintLayerSP maskLayer = new KisPaintLayer(image.data(), i18nc("default name for quick clip group mask layer", "Mask Layer"), OPACITY_OPAQUE_U8, image->colorSpace());
1680 maskLayer->disableAlphaChannel(true);
1681
1682 juggler->addNode(KisNodeList() << maskLayer, parent, above);
1683 }
1684}
const quint8 OPACITY_OPAQUE_U8
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:715
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 1658 of file kis_node_manager.cpp.

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

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 1619 of file kis_node_manager.cpp.

1623{
1624 KisNodeSP active = activeNode();
1625 if (!active) return false;
1626
1627 if (!canMoveLayer(active)) return false;
1628
1629 KisImageSP image = m_d->view->image();
1630 QString groupName = !overrideGroupName.isEmpty() ? overrideGroupName : image->nextLayerName(i18nc("A group of layers", "Group"));
1631 KisGroupLayerSP group = new KisGroupLayer(image.data(), groupName, OPACITY_OPAQUE_U8);
1632
1633 KisNodeList nodes1;
1634 nodes1 << group;
1635
1636 KisNodeList nodes2;
1639
1640 if (nodes2.size() == 0) return false;
1641
1642 if (KisLayerUtils::checkIsChildOf(active, nodes2)) {
1643 active = nodes2.first();
1644 }
1645
1646 KisNodeSP parent = active->parent();
1647 KisNodeSP aboveThis = active;
1648
1649 juggler->addNode(nodes1, parent, aboveThis);
1650 juggler->moveNode(nodes2, group, 0);
1651
1652 *newGroup = group;
1653 *newLastChild = nodes2.last();
1654
1655 return true;
1656}
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 754 of file kis_node_manager.cpp.

754 {
755 KisViewManager* m_view = m_d->view;
756 KisDocument *document = m_view->document();
757 KisCanvas2 *canvas = m_view->canvasBase();
758
759 const KisPaintDeviceSP paintDevice = fromLayer ? m_view->activeLayer()->projection()
760 : canvas->currentImage()->projection();
763 QScopedPointer<KisReferenceImage> reference(KisReferenceImage::fromQImage(*canvas->coordinatesConverter(), image));
765 if (reference) {
766 if (document->referenceImagesLayer()) {
767 reference->setZIndex(document->referenceImagesLayer()->shapes().size());
768 }
769 canvas->addCommand(KisReferenceImagesLayer::addReferenceImages(document, {reference.take()}));
770
771 KoToolManager::instance()->switchToolRequested("ToolReferenceImages");
772
773 } else {
774 if (canvas->canvasWidget()) {
775 QString strMessage = fromLayer ? i18nc("error dialog from the reference tool", "Could not create a reference image from the active layer.")
776 : i18nc("error dialog from the reference tool", "Could not create a reference image from the visible canvas.");
777
778 m_d->view->showFloatingMessage(strMessage, QIcon(), 5000, KisFloatingMessage::High, Qt::TextSingleLine);
779 }
780 }
781}
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:820

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 783 of file kis_node_manager.cpp.

783 {
785}
void createReferenceImage(bool fromLayer)

References createReferenceImage().

◆ createReferenceImageFromVisible

void KisNodeManager::createReferenceImageFromVisible ( )
slot

Definition at line 787 of file kis_node_manager.cpp.

787 {
789}

References createReferenceImage().

◆ cutLayersToClipboard

void KisNodeManager::cutLayersToClipboard ( )
slot

Definition at line 1560 of file kis_node_manager.cpp.

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

1056{
1057 KUndo2MagicString actionName = kundo2_i18n("Duplicate Nodes");
1058 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1059 juggler->duplicateNode(selectedNodes());
1060}
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 615 of file kis_node_manager.cpp.

616{
617 // It might be that we have multiple Krita windows open. In such a case
618 // only the currently active one should restart isolated mode
619 if (!m_d->view->mainWindowAsQWidget()->isActiveWindow()) return;
620
621 KisImageWSP image = m_d->view->image();
623
624 const bool isIsolatingLayer = image->isIsolatingLayer();
625 const bool isIsolatingGroup = image->isIsolatingGroup();
626
627 m_d->view->actionManager()->actionByName("isolate_active_layer")->setChecked(isIsolatingLayer);
628 m_d->view->actionManager()->actionByName("isolate_active_group")->setChecked(isIsolatingGroup);
629}
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 1007 of file kis_node_manager.cpp.

1008{
1009 if (node && node->isFakeNode()) {
1010 return true;
1011 }
1012
1013 if (isGlobalSelectionHidden && dynamic_cast<KisSelectionMask *>(node.data()) &&
1014 (!node->parent() || !node->parent()->parent())) {
1015 return true;
1016 }
1017
1018 return false;
1019}
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 1087 of file kis_node_manager.cpp.

1088{
1089 if (!canMoveLayers(selectedNodes())) return;
1090
1091 KUndo2MagicString actionName = kundo2_i18n("Lower Nodes");
1092 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1093 juggler->lowerNode(selectedNodes());
1094}
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 1149 of file kis_node_manager.cpp.

1150{
1151 KisNodeSP node = m_d->view->image()->root();
1152 mirrorNode(node, kundo2_i18n("Mirror All Layers Horizontally"),
1153 Qt::Horizontal, m_d->view->selection());
1154}
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 1156 of file kis_node_manager.cpp.

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

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 1240 of file kis_node_manager.cpp.

1244{
1245 KisNodeList nodes = {node};
1246 mirrorNodes(nodes, actionName, orientation, selection);
1247}
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 1249 of file kis_node_manager.cpp.

1253{
1254 Q_FOREACH(KisNodeSP node, nodes) {
1255 if (!canModifyLayer(node)) return;
1256 }
1257
1258 KisImageSignalVector emitSignals;
1259
1260 KisProcessingApplicator applicator(m_d->view->image(), nodes,
1262 emitSignals, actionName);
1263
1264 KisProcessingVisitorSP visitor;
1265
1266 if (selection) {
1267 visitor = new KisMirrorProcessingVisitor(selection, orientation);
1268 } else {
1269 visitor = new KisMirrorProcessingVisitor(m_d->view->image()->bounds(), orientation);
1270 }
1271
1272 if (!selection) {
1273 applicator.applyVisitorAllFrames(visitor, KisStrokeJobData::CONCURRENT);
1274 } else {
1275 applicator.applyVisitor(visitor, KisStrokeJobData::CONCURRENT);
1276 }
1277
1278 applicator.end();
1279
1280 nodesUpdated();
1281}
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 1121 of file kis_node_manager.cpp.

1122{
1123 KisNodeList nodes = selectedNodes();
1124
1125 KUndo2MagicString commandName;
1126 if (nodes.size() == 1 && nodes[0]->inherits("KisMask")) {
1127 commandName = kundo2_i18n("Mirror Mask Horizontally");
1128 }
1129 else {
1130 commandName = kundo2_i18np("Mirror Layer Horizontally", "Mirror %1 Layers Horizontally", nodes.size());
1131 }
1132 mirrorNodes(nodes, commandName, Qt::Horizontal, m_d->view->selection());
1133}
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 1135 of file kis_node_manager.cpp.

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

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 527 of file kis_node_manager.cpp.

528{
529 if (parent->allowAsChild(node)) {
530 if (node->inherits("KisSelectionMask") && parent->inherits("KisLayer")) {
531 KisSelectionMask *m = dynamic_cast<KisSelectionMask*>(node.data());
532 KisLayer *l = qobject_cast<KisLayer*>(parent.data());
533 if (m && m->active() && l && l->selectionMask()) {
534 l->selectionMask()->setActive(false);
535 }
536 }
537 m_d->commandsAdapter.moveNode(node, parent, index);
538 }
539}
void moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
virtual KisSelectionMaskSP selectionMask() const
Definition kis_layer.cc:498
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 541 of file kis_node_manager.cpp.

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

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

◆ nodeCompositeOpChanged

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

Definition at line 1048 of file kis_node_manager.cpp.

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

References activeNode(), and setNodeCompositeOp().

◆ nodeDisplayModeAdapter()

KisNodeDisplayModeAdapter * KisNodeManager::nodeDisplayModeAdapter ( ) const

Definition at line 1002 of file kis_node_manager.cpp.

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

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

◆ nodeInsertionAdapter()

KisNodeInsertionAdapter * KisNodeManager::nodeInsertionAdapter ( ) const

Definition at line 997 of file kis_node_manager.cpp.

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

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

◆ nodeOpacityChanged

void KisNodeManager::nodeOpacityChanged ( qreal opacity)
slot

Definition at line 1041 of file kis_node_manager.cpp.

1042{
1043 KisNodeSP node = activeNode();
1044
1045 setNodeOpacity(node, convertOpacityToInt(opacity));
1046}
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 902 of file kis_node_manager.cpp.

903{
904 if ((selectedNodes().size() > 1 && node->inherits("KisLayer")) || node->inherits("KisLayer")) {
906 }
907 else if (node->inherits("KisMask")) {
909 }
910}
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 912 of file kis_node_manager.cpp.

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

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 992 of file kis_node_manager.cpp.

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

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

◆ nodesUpdated

void KisNodeManager::nodesUpdated ( )
slot

Definition at line 878 of file kis_node_manager.cpp.

879{
880 KisNodeSP node = activeNode();
881 if (!node) return;
882
885
886 m_d->view->updateGUI();
888
889 {
891 m_d->pinToTimeline->setChecked(node->isPinnedToTimeline());
892 }
893}
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 1589 of file kis_node_manager.cpp.

1590{
1591 const QMimeData *data = KisClipboard::instance()->layersMimeData();
1592 if (!data) return;
1593
1595
1596 KisShapeController *shapeController = dynamic_cast<KisShapeController*>(m_d->imageView->document()->shapeController());
1597 Q_ASSERT(shapeController);
1598
1599 KisDummiesFacadeBase *dummiesFacade = dynamic_cast<KisDummiesFacadeBase*>(m_d->imageView->document()->shapeController());
1600 Q_ASSERT(dummiesFacade);
1601
1602 const bool copyNode = false;
1603 KisImageSP image = m_d->view->image();
1604 KisNodeDummy *parentDummy = dummiesFacade->dummyForNode(activeNode ? activeNode : image->root());
1605 KisNodeDummy *aboveThisDummy = parentDummy ? parentDummy->lastChild() : 0;
1606
1608 image,
1609 shapeController,
1610 parentDummy,
1611 aboveThisDummy,
1612 copyNode,
1614 changeOffset,
1615 offset,
1616 applicator);
1617}
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 1686 of file kis_node_manager.cpp.

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

1079{
1080 if (!canMoveLayers(selectedNodes())) return;
1081
1082 KUndo2MagicString actionName = kundo2_i18n("Raise Nodes");
1083 KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
1084 juggler->raiseNode(selectedNodes());
1085}
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 631 of file kis_node_manager.cpp.

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

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

◆ removeNode

void KisNodeManager::removeNode ( )
slot

Definition at line 1116 of file kis_node_manager.cpp.

1117{
1119}
void removeSelectedNodes(KisNodeList selectedNodes)

References removeSelectedNodes(), and selectedNodes().

◆ removeSelectedNodes()

void KisNodeManager::removeSelectedNodes ( KisNodeList selectedNodes)
private

Definition at line 1107 of file kis_node_manager.cpp.

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

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

◆ removeSingleNode()

void KisNodeManager::removeSingleNode ( KisNodeSP node)

Definition at line 1096 of file kis_node_manager.cpp.

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

References KisNode::parent, and removeSelectedNodes().

◆ saveNodeAsImage

void KisNodeManager::saveNodeAsImage ( )
slot

Definition at line 1324 of file kis_node_manager.cpp.

1325{
1326 KisNodeSP node = activeNode();
1327
1328 if (!node) {
1329 warnKrita << "BUG: Save Node As Image was called without any node selected";
1330 return;
1331 }
1332
1333 KisPaintDeviceSP saveDevice = node->projection();
1334
1335 if (!saveDevice) {
1336 m_d->view->showFloatingMessage(i18nc("warning message when trying to export a transform mask", "Layer has no pixel data"), QIcon());
1337 return;
1338 }
1339
1340 KisImageSP image = m_d->view->image();
1341 QRect saveRect = image->bounds() | node->exactBounds();
1342
1343 m_d->saveDeviceAsImage(saveDevice,
1344 node->name(),
1345 saveRect,
1346 image->xRes(), image->yRes(),
1347 node->opacity());
1348}
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 1352 of file kis_node_manager.cpp.

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

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

References selectLayersImpl().

◆ selectedNodes()

KisNodeList KisNodeManager::selectedNodes ( )

Definition at line 987 of file kis_node_manager.cpp.

988{
989 return m_d->selectedNodes;
990}

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

◆ selectInvisibleNodes

void KisNodeManager::selectInvisibleNodes ( )
slot

Definition at line 1789 of file kis_node_manager.cpp.

1790{
1791 KoProperties props;
1792 props.setProperty("visible", false);
1793
1794 KoProperties invertedProps;
1795 invertedProps.setProperty("visible", true);
1796
1797 selectLayersImpl(props, invertedProps);
1798}
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 1745 of file kis_node_manager.cpp.

1746{
1747 KisImageSP image = m_d->view->image();
1748 KisNodeList nodes = KisLayerUtils::findNodesWithProps(image->root(), props, true);
1749
1751
1753 nodes = KisLayerUtils::findNodesWithProps(image->root(), invertedProps, true);
1754 }
1755
1756 if (!nodes.isEmpty()) {
1757 slotImageRequestNodeReselection(nodes.last(), nodes);
1758 }
1759}
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 1778 of file kis_node_manager.cpp.

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

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

◆ selectUnlockedNodes

void KisNodeManager::selectUnlockedNodes ( )
slot

Definition at line 1800 of file kis_node_manager.cpp.

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

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

◆ selectVisibleNodes

void KisNodeManager::selectVisibleNodes ( )
slot

Definition at line 1767 of file kis_node_manager.cpp.

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

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

◆ setIsolateActiveGroupMode

void KisNodeManager::setIsolateActiveGroupMode ( bool checked)
slot

Definition at line 577 of file kis_node_manager.cpp.

578{
579 KisImageWSP image = m_d->view->image();
581
582 const bool layerIsolationState = image->isIsolatingLayer();
583 changeIsolationMode(layerIsolationState, checked);
584}
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 568 of file kis_node_manager.cpp.

569{
570 KisImageWSP image = m_d->view->image();
572
573 const bool groupIsolationState = image->isIsolatingGroup();
574 changeIsolationMode(checked, groupIsolationState);
575}

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 962 of file kis_node_manager.cpp.

964{
965 if (!node) return;
966 if (node->compositeOp() == compositeOp) return;
967
968 m_d->commandsAdapter.setCompositeOp(node, compositeOp);
969}
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 945 of file kis_node_manager.cpp.

946{
947 if (!node) return;
948 if (node->name() == name) return;
949
950 m_d->commandsAdapter.setNodeName(node, name);
951
952}
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 954 of file kis_node_manager.cpp.

955{
956 if (!node) return;
957 if (node->opacity() == opacity) return;
958
959 m_d->commandsAdapter.setOpacity(node, opacity);
960}
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("convert_to_animated", "animated");
404
405 CONVERT_NODE_ACTION_2("convert_to_file_layer", "KisFileLayer", QStringList() << "KisFileLayer" << "KisCloneLayer");
406
407 connect(&m_d->nodeConversionSignalMapper, SIGNAL(mapped(QString)),
408 this, SLOT(convertNode(QString)));
409
410 // Isolation Modes...
411 // Post Qt5.14 this can be replaced with QActionGroup + ExclusionPolicy::ExclusiveOptional.
412 action = actionManager->createAction("isolate_active_layer");
413 connect(action, SIGNAL(toggled(bool)), this, SLOT(setIsolateActiveLayerMode(bool)));
414 action = actionManager->createAction("isolate_active_group");
415 connect(action, SIGNAL(triggered(bool)), this, SLOT(setIsolateActiveGroupMode(bool)));
416 connect(this, SIGNAL(sigNodeActivated(KisNodeSP)), SLOT(changeIsolationRoot(KisNodeSP)));
417
418 action = actionManager->createAction("toggle_layer_visibility");
419 connect(action, SIGNAL(triggered()), this, SLOT(toggleVisibility()));
420
421 action = actionManager->createAction("toggle_layer_lock");
422 connect(action, SIGNAL(triggered()), this, SLOT(toggleLock()));
423
424 action = actionManager->createAction("toggle_layer_inherit_alpha");
425 connect(action, SIGNAL(triggered()), this, SLOT(toggleInheritAlpha()));
426
427 action = actionManager->createAction("toggle_layer_alpha_lock");
428 connect(action, SIGNAL(triggered()), this, SLOT(toggleAlphaLock()));
429
430 action = actionManager->createAction("split_alpha_into_mask");
431 connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaIntoMask()));
432
433 action = actionManager->createAction("split_alpha_write");
434 connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaWrite()));
435
436 // HINT: we can save even when the nodes are not editable
437 action = actionManager->createAction("split_alpha_save_merged");
438 connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaSaveMerged()));
439}
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 971 of file kis_node_manager.cpp.

972{
973 if (activeNode) {
975 }
976 if (!selectedNodes.isEmpty()) {
978 }
979}
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 815 of file kis_node_manager.cpp.

816{
817 // the node must still be in the graph, some asynchronous
818 // signals may easily break this requirement
819 if (node && !node->graphListener()) {
820 node = 0;
821 }
822
823 if (node == activeNode()) return;
824
826
827 if (node) {
828 bool toggled = m_d->view->actionCollection()->action("view_show_canvas_only")->isChecked();
829 if (toggled) {
830 m_d->view->showFloatingMessage( activeLayer()->name(), QIcon(), 1600, KisFloatingMessage::Medium, Qt::TextSingleLine);
831 }
832 }
833}
QAction * action(int index) const
KisLayerSP activeLayer()
void slotSomethingActivatedNodeImpl(KisNodeSP node)
virtual KisKActionCollection * actionCollection() const
KisNodeGraphListener * graphListener
Definition kis_node.cpp:87

References KisKActionCollection::action(), KisViewManager::actionCollection(), activeLayer(), activeNode(), KisNode::graphListener, m_d, KisFloatingMessage::Medium, KisViewManager::showFloatingMessage(), slotSomethingActivatedNodeImpl(), and KisNodeManager::Private::view.

◆ slotPinToTimeline

void KisNodeManager::slotPinToTimeline ( bool value)
slot

Definition at line 696 of file kis_node_manager.cpp.

697{
698 Q_FOREACH (KisNodeSP node, selectedNodes()) {
700 }
701}
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 981 of file kis_node_manager.cpp.

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

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

◆ slotSomethingActivatedNodeImpl()

void KisNodeManager::slotSomethingActivatedNodeImpl ( KisNodeSP node)
private

Definition at line 791 of file kis_node_manager.cpp.

792{
793 KisDummiesFacadeBase *dummiesFacade = dynamic_cast<KisDummiesFacadeBase*>(m_d->imageView->document()->shapeController());
794 KIS_SAFE_ASSERT_RECOVER_RETURN(dummiesFacade);
795
796 const bool nodeVisible = !isNodeHidden(node, !m_d->nodeDisplayModeAdapter->showGlobalSelectionMask());
797 if (!nodeVisible) {
798 return;
799 }
800
802 if (m_d->activateNodeImpl(node)) {
803 Q_EMIT sigUiNeedChangeActiveNode(node);
804 Q_EMIT sigNodeActivated(node);
805 nodesUpdated();
806 if (node) {
807 bool toggled = m_d->view->actionCollection()->action("view_show_canvas_only")->isChecked();
808 if (toggled) {
809 m_d->view->showFloatingMessage( activeLayer()->name(), QIcon(), 1600, KisFloatingMessage::Medium, Qt::TextSingleLine);
810 }
811 }
812 }
813}
void sigUiNeedChangeActiveNode(KisNodeSP node)
bool activateNodeImpl(KisNodeSP node)

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

◆ slotSplitAlphaIntoMask

void KisNodeManager::slotSplitAlphaIntoMask ( )
slot

Definition at line 1384 of file kis_node_manager.cpp.

1385{
1386 KisNodeSP node = activeNode();
1387 if (!canModifyLayer(node)) return;
1388
1389 // guaranteed by KisActionManager
1391
1392 KisLayerUtils::splitAlphaToMask(node->image(), node, m_d->maskManager.createMaskNameCommon(node, "KisTransparencyMask", i18n("Transparency Mask")));
1393}
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 1472 of file kis_node_manager.cpp.

1473{
1475}
void mergeTransparencyMaskAsAlpha(bool writeToLayers)

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

◆ slotSplitAlphaWrite

void KisNodeManager::slotSplitAlphaWrite ( )
slot

Definition at line 1467 of file kis_node_manager.cpp.

1468{
1470}

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 835 of file kis_node_manager.cpp.

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

1812{
1813 if (!sender()->property("node").isNull()) {
1814 QString name = sender()->property("node").toString();
1815 KisNodeSP node = KisLayerUtils::findNodeByName(m_d->imageView->image()->rootLayer(),name);
1816 if (node) {
1817 slotUiActivatedNode(node);
1818 }
1819 }
1820}
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 1503 of file kis_node_manager.cpp.

1504{
1505 KisNodeList nodes = this->selectedNodes();
1506 KisNodeSP active = activeNode();
1507 if (nodes.isEmpty() || !active) return;
1508
1509 auto layer = qobject_cast<KisPaintLayer*>(active.data());
1510 if (!layer) {
1511 return;
1512 }
1513
1514 bool isAlphaLocked = layer->alphaLocked();
1515 for (auto &node : nodes) {
1516 auto layer = qobject_cast<KisPaintLayer*>(node.data());
1517 if (layer) {
1519 }
1520 }
1521}
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 1523 of file kis_node_manager.cpp.

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

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 562 of file kis_node_manager.cpp.

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

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

◆ toggleLock

void KisNodeManager::toggleLock ( )
slot

Definition at line 1477 of file kis_node_manager.cpp.

1478{
1479 KisNodeList nodes = this->selectedNodes();
1480 KisNodeSP active = activeNode();
1481 if (nodes.isEmpty() || !active) return;
1482
1483 bool isLocked = active->userLocked();
1484
1485 for (auto &node : nodes) {
1487 }
1488}
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 1490 of file kis_node_manager.cpp.

1491{
1492 KisNodeList nodes = this->selectedNodes();
1493 KisNodeSP active = activeNode();
1494 if (nodes.isEmpty() || !active) return;
1495
1496 bool isVisible = active->visible();
1497
1498 for (auto &node : nodes) {
1500 }
1501}
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 1021 of file kis_node_manager.cpp.

1022{
1023 const KisPaintLayer *paintLayer = dynamic_cast<KisPaintLayer*>(node.data());
1024 if (paintLayer) {
1026
1027 if (properties.contains(onionSkinOn)) {
1028 const KisPaintDeviceSP &paintDevice = paintLayer->paintDevice();
1029 if (paintDevice && paintDevice->defaultPixel().opacityU8() == 255) {
1030 m_d->view->showFloatingMessage(i18n("Onion skins require a layer with transparent background."), QIcon());
1031 return false;
1032 }
1033 }
1034 }
1035
1037
1038 return true;
1039}
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: