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

190 : m_d(new Private(this, view))
191{
193}
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 195 of file kis_node_manager.cpp.

196{
197 delete m_d;
198}

References m_d.

Member Function Documentation

◆ activateNextNode

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

Definition at line 1160 of file kis_node_manager.cpp.

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

1191{
1192 activateNextNode(true);
1193}
void activateNextNode(bool siblingsOnly=false)

References activateNextNode().

◆ activatePreviousNode

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

Definition at line 1195 of file kis_node_manager.cpp.

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

1226{
1228}
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 458 of file kis_node_manager.cpp.

459{
462 } else {
463 Q_ASSERT(m_d->layerManager.activeLayer());
466 else
467 return m_d->view->image()->colorSpace();
468 }
469}
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 453 of file kis_node_manager.cpp.

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

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

446{
447 if (m_d->imageView) {
448 return m_d->imageView->currentNode();
449 }
450 return 0;
451}
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 552 of file kis_node_manager.cpp.

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

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

References canModifyLayers().

◆ canModifyLayers()

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

Definition at line 471 of file kis_node_manager.cpp.

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

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

References canMoveLayers().

◆ canMoveLayers()

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

Definition at line 501 of file kis_node_manager.cpp.

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

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

584{
585 KisImageWSP image = m_d->view->image();
588
589 if (isolateActiveLayer || isolateActiveGroup) {
590 if (image->startIsolatedMode(activeNode, isolateActiveLayer, isolateActiveGroup) == false) {
592 }
593 } else {
594 image->stopIsolatedMode();
595 }
596}
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 598 of file kis_node_manager.cpp.

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

1541{
1542 Q_ASSERT(node);
1543 KisLayerSP layer = qobject_cast<KisLayer*>(node.data());
1544 if (!layer) {
1545 return;
1546 }
1547
1548 KisFilterMaskSP mask = layer->colorOverlayMask();
1549 if (!mask) {
1550 // This layer does not use fast color overlay mask.
1551 return;
1552 }
1553
1555}
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 706 of file kis_node_manager.cpp.

707{
709 return;
710 }
711
713 if (!activeNode) return;
714
715 if (!canModifyLayer(activeNode)) return;
716
717 if (nodeType == "KisPaintLayer") {
719 } else if (nodeType == "KisSelectionMask" ||
720 nodeType == "KisFilterMask" ||
721 nodeType == "KisTransparencyMask") {
722
725
726 m_d->commandsAdapter.beginMacro(kundo2_i18n("Convert to a Selection Mask"));
727
728 bool result = false;
729
730 if (nodeType == "KisSelectionMask") {
731 result = !m_d->maskManager.createSelectionMask(activeNode, copyFrom, true).isNull();
732 } else if (nodeType == "KisFilterMask") {
733 result = !m_d->maskManager.createFilterMask(activeNode, copyFrom, false, true).isNull();
734 } else if (nodeType == "KisTransparencyMask") {
735 result = !m_d->maskManager.createTransparencyMask(activeNode, copyFrom, true).isNull();
736 }
737
739
740 if (!result) {
743 }
744 } else if (nodeType == "KisFileLayer") {
746 } else {
747 warnKrita << "Unsupported node conversion type:" << nodeType;
748 }
749}
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 932 of file kis_node_manager.cpp.

933{
939 return qMin(255, int(opacity * 2.55 + 0.5));
940}

◆ copyLayersToClipboard

void KisNodeManager::copyLayersToClipboard ( )
slot

Definition at line 1580 of file kis_node_manager.cpp.

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

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

689{
691}
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 634 of file kis_node_manager.cpp.

635{
637 return 0;
638 }
639
641 if (!activeNode) {
642 activeNode = m_d->view->image()->root();
643 }
644
646
650
651 // XXX: make factories for this kind of stuff,
652 // with a registry
653
654 if (nodeType == "KisPaintLayer") {
656 } else if (nodeType == "KisGroupLayer") {
658 } else if (nodeType == "KisAdjustmentLayer") {
660 } else if (nodeType == "KisGeneratorLayer") {
662 } else if (nodeType == "KisShapeLayer") {
664 } else if (nodeType == "KisCloneLayer") {
665 KisNodeList nodes = selectedNodes();
666 if (nodes.isEmpty()) {
667 nodes.append(activeNode);
668 }
669 return m_d->layerManager.addCloneLayer(nodes);
670 } else if (nodeType == "KisTransparencyMask") {
671 return m_d->maskManager.createTransparencyMask(activeNode, copyFrom, false);
672 } else if (nodeType == "KisFilterMask") {
673 return m_d->maskManager.createFilterMask(activeNode, copyFrom, quiet, false);
674 } else if (nodeType == "FastColorOverlayFilterMask") {
676 } else if (nodeType == "KisColorizeMask") {
678 } else if (nodeType == "KisTransformMask") {
680 } else if (nodeType == "KisSelectionMask") {
681 return m_d->maskManager.createSelectionMask(activeNode, copyFrom, false);
682 } else if (nodeType == "KisFileLayer") {
684 }
685 return 0;
686}
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 700 of file kis_node_manager.cpp.

701{
702 KisNodeSP node = createNode("KisPaintLayer");
703 return dynamic_cast<KisLayer*>(node.data());
704}
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 1666 of file kis_node_manager.cpp.

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

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

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

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

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

780 {
782}
void createReferenceImage(bool fromLayer)

References createReferenceImage().

◆ createReferenceImageFromVisible

void KisNodeManager::createReferenceImageFromVisible ( )
slot

Definition at line 784 of file kis_node_manager.cpp.

784 {
786}

References createReferenceImage().

◆ cutLayersToClipboard

void KisNodeManager::cutLayersToClipboard ( )
slot

Definition at line 1557 of file kis_node_manager.cpp.

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

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

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

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

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

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

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

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

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

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

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

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

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

525{
526 if (parent->allowAsChild(node)) {
527 if (node->inherits("KisSelectionMask") && parent->inherits("KisLayer")) {
528 KisSelectionMask *m = dynamic_cast<KisSelectionMask*>(node.data());
529 KisLayer *l = qobject_cast<KisLayer*>(parent.data());
530 if (m && m->active() && l && l->selectionMask()) {
531 l->selectionMask()->setActive(false);
532 }
533 }
534 m_d->commandsAdapter.moveNode(node, parent, index);
535 }
536}
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 538 of file kis_node_manager.cpp.

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

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

◆ nodeCompositeOpChanged

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

Definition at line 1045 of file kis_node_manager.cpp.

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

References activeNode(), and setNodeCompositeOp().

◆ nodeDisplayModeAdapter()

KisNodeDisplayModeAdapter * KisNodeManager::nodeDisplayModeAdapter ( ) const

Definition at line 999 of file kis_node_manager.cpp.

1000{
1001 return m_d->nodeDisplayModeAdapter.data();
1002}

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

◆ nodeInsertionAdapter()

KisNodeInsertionAdapter * KisNodeManager::nodeInsertionAdapter ( ) const

Definition at line 994 of file kis_node_manager.cpp.

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

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

◆ nodeOpacityChanged

void KisNodeManager::nodeOpacityChanged ( qreal opacity)
slot

Definition at line 1038 of file kis_node_manager.cpp.

1039{
1040 KisNodeSP node = activeNode();
1041
1042 setNodeOpacity(node, convertOpacityToInt(opacity));
1043}
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 899 of file kis_node_manager.cpp.

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

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

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

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

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

◆ nodesUpdated

void KisNodeManager::nodesUpdated ( )
slot

Definition at line 875 of file kis_node_manager.cpp.

876{
877 KisNodeSP node = activeNode();
878 if (!node) return;
879
882
883 m_d->view->updateGUI();
885
886 {
888 m_d->pinToTimeline->setChecked(node->isPinnedToTimeline());
889 }
890}
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 1586 of file kis_node_manager.cpp.

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

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

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

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

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

◆ removeNode

void KisNodeManager::removeNode ( )
slot

Definition at line 1113 of file kis_node_manager.cpp.

1114{
1116}
void removeSelectedNodes(KisNodeList selectedNodes)

References removeSelectedNodes(), and selectedNodes().

◆ removeSelectedNodes()

void KisNodeManager::removeSelectedNodes ( KisNodeList selectedNodes)
private

Definition at line 1104 of file kis_node_manager.cpp.

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

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

◆ removeSingleNode()

void KisNodeManager::removeSingleNode ( KisNodeSP node)

Definition at line 1093 of file kis_node_manager.cpp.

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

References KisNode::parent, and removeSelectedNodes().

◆ saveNodeAsImage

void KisNodeManager::saveNodeAsImage ( )
slot

Definition at line 1321 of file kis_node_manager.cpp.

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

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

1759{
1760 KoProperties props;
1761 selectLayersImpl(props, props);
1762}
void selectLayersImpl(const KoProperties &props, const KoProperties &invertedProps)

References selectLayersImpl().

◆ selectedNodes()

KisNodeList KisNodeManager::selectedNodes ( )

Definition at line 984 of file kis_node_manager.cpp.

985{
986 return m_d->selectedNodes;
987}

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

◆ selectInvisibleNodes

void KisNodeManager::selectInvisibleNodes ( )
slot

Definition at line 1786 of file kis_node_manager.cpp.

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

1743{
1744 KisImageSP image = m_d->view->image();
1745 KisNodeList nodes = KisLayerUtils::findNodesWithProps(image->root(), props, true);
1746
1748
1750 nodes = KisLayerUtils::findNodesWithProps(image->root(), invertedProps, true);
1751 }
1752
1753 if (!nodes.isEmpty()) {
1754 slotImageRequestNodeReselection(nodes.last(), nodes);
1755 }
1756}
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 1775 of file kis_node_manager.cpp.

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

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

◆ selectUnlockedNodes

void KisNodeManager::selectUnlockedNodes ( )
slot

Definition at line 1797 of file kis_node_manager.cpp.

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

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

◆ selectVisibleNodes

void KisNodeManager::selectVisibleNodes ( )
slot

Definition at line 1764 of file kis_node_manager.cpp.

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

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

◆ setIsolateActiveGroupMode

void KisNodeManager::setIsolateActiveGroupMode ( bool checked)
slot

Definition at line 574 of file kis_node_manager.cpp.

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

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

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

961{
962 if (!node) return;
963 if (node->compositeOp() == compositeOp) return;
964
965 m_d->commandsAdapter.setCompositeOp(node, compositeOp);
966}
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 942 of file kis_node_manager.cpp.

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

952{
953 if (!node) return;
954 if (node->opacity() == opacity) return;
955
956 m_d->commandsAdapter.setOpacity(node, opacity);
957}
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 271 of file kis_node_manager.cpp.

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

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

References KisNodeManager::Private::activateNodeConnection, connect(), 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 968 of file kis_node_manager.cpp.

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

813{
814 // the node must still be in the graph, some asynchronous
815 // signals may easily break this requirement
816 if (node && !node->graphListener()) {
817 node = 0;
818 }
819
820 if (node == activeNode()) return;
821
823
824 if (node) {
825 bool toggled = m_d->view->actionCollection()->action("view_show_canvas_only")->isChecked();
826 if (toggled) {
827 m_d->view->showFloatingMessage( activeLayer()->name(), QIcon(), 1600, KisFloatingMessage::Medium, Qt::TextSingleLine);
828 }
829 }
830}
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 693 of file kis_node_manager.cpp.

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

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

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

◆ slotSomethingActivatedNodeImpl()

void KisNodeManager::slotSomethingActivatedNodeImpl ( KisNodeSP node)
private

Definition at line 788 of file kis_node_manager.cpp.

789{
790 KisDummiesFacadeBase *dummiesFacade = dynamic_cast<KisDummiesFacadeBase*>(m_d->imageView->document()->shapeController());
791 KIS_SAFE_ASSERT_RECOVER_RETURN(dummiesFacade);
792
793 const bool nodeVisible = !isNodeHidden(node, !m_d->nodeDisplayModeAdapter->showGlobalSelectionMask());
794 if (!nodeVisible) {
795 return;
796 }
797
799 if (m_d->activateNodeImpl(node)) {
800 Q_EMIT sigUiNeedChangeActiveNode(node);
801 Q_EMIT sigNodeActivated(node);
802 nodesUpdated();
803 if (node) {
804 bool toggled = m_d->view->actionCollection()->action("view_show_canvas_only")->isChecked();
805 if (toggled) {
806 m_d->view->showFloatingMessage( activeLayer()->name(), QIcon(), 1600, KisFloatingMessage::Medium, Qt::TextSingleLine);
807 }
808 }
809 }
810}
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 1381 of file kis_node_manager.cpp.

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

1470{
1472}
void mergeTransparencyMaskAsAlpha(bool writeToLayers)

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

◆ slotSplitAlphaWrite

void KisNodeManager::slotSplitAlphaWrite ( )
slot

Definition at line 1464 of file kis_node_manager.cpp.

1465{
1467}

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

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

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

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

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

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

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

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

◆ toggleLock

void KisNodeManager::toggleLock ( )
slot

Definition at line 1474 of file kis_node_manager.cpp.

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

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

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