Krita Source Code Documentation
Loading...
Searching...
No Matches
DuplicateLayers Struct Reference
+ Inheritance diagram for DuplicateLayers:

Public Types

enum  Mode { MOVE , COPY , ADD }
 

Public Member Functions

 DuplicateLayers (BatchMoveUpdateDataSP updateData, KisImageSP image, const KisNodeList &nodes, KisNodeSP dstParent, KisNodeSP dstAbove, KisNodeSP activeNode, Mode mode)
 
void populateChildCommands () override
 
- Public Member Functions inherited from KisCommandUtils::AggregateCommand
 AggregateCommand (const KUndo2MagicString &text, KUndo2Command *parent=0)
 
 AggregateCommand (KUndo2Command *parent=0)
 
void redo () override
 
void undo () override
 
- Public Member Functions inherited from KUndo2Command
QString actionText () const
 
virtual bool canAnnihilateWith (const KUndo2Command *other) const
 
const KUndo2Commandchild (int index) const
 
int childCount () const
 
virtual QTime endTime () const
 
KUndo2CommandExtraDataextraData () const
 
bool hasParent () const
 
virtual int id () const
 
virtual bool isMerged () const
 
 KUndo2Command (const KUndo2MagicString &text, KUndo2Command *parent=0)
 
 KUndo2Command (KUndo2Command *parent=0)
 
virtual QVector< KUndo2Command * > mergeCommandsVector () const
 
virtual bool mergeWith (const KUndo2Command *other)
 
virtual void redoMergedCommands ()
 
void setEndTime ()
 
virtual void setEndTime (const QTime &time)
 
void setExtraData (KUndo2CommandExtraData *data)
 
void setText (const KUndo2MagicString &text)
 
void setTime ()
 
virtual void setTime (const QTime &time)
 
virtual void setTimedID (int timedID)
 
KUndo2MagicString text () const
 
virtual QTime time () const
 
virtual int timedId () const
 
virtual bool timedMergeWith (KUndo2Command *other)
 
virtual void undoMergedCommands ()
 
virtual ~KUndo2Command ()
 

Private Member Functions

QList< KisSelectionMaskSPfindActiveSelectionMasks (KisNodeList nodes)
 
KisSelectionMaskSP toActiveSelectionMask (KisNodeSP node)
 

Private Attributes

KisNodeSP m_activeNode
 
KisNodeSP m_dstAbove
 
KisNodeSP m_dstParent
 
KisImageSP m_image
 
Mode m_mode
 
KisNodeList m_nodes
 
BatchMoveUpdateDataSP m_updateData
 

Additional Inherited Members

- Protected Member Functions inherited from KisCommandUtils::AggregateCommand
void addCommand (KUndo2Command *cmd)
 

Detailed Description

Definition at line 469 of file kis_node_juggler_compressed.cpp.

Member Enumeration Documentation

◆ Mode

Constructor & Destructor Documentation

◆ DuplicateLayers()

DuplicateLayers::DuplicateLayers ( BatchMoveUpdateDataSP updateData,
KisImageSP image,
const KisNodeList & nodes,
KisNodeSP dstParent,
KisNodeSP dstAbove,
KisNodeSP activeNode,
Mode mode )
inline

Definition at line 476 of file kis_node_juggler_compressed.cpp.

483 : m_updateData(updateData),
484 m_image(image),
485 m_nodes(nodes),
486 m_dstParent(dstParent),
487 m_dstAbove(dstAbove),
488 m_activeNode(activeNode),
489 m_mode(mode) {}
BatchMoveUpdateDataSP m_updateData

Member Function Documentation

◆ findActiveSelectionMasks()

QList< KisSelectionMaskSP > DuplicateLayers::findActiveSelectionMasks ( KisNodeList nodes)
inlineprivate

Definition at line 617 of file kis_node_juggler_compressed.cpp.

617 {
619 foreach (KisNodeSP node, nodes) {
621 if (mask) {
622 masks << mask;
623 }
624 }
625 return masks;
626 }
KisSelectionMaskSP toActiveSelectionMask(KisNodeSP node)

References toActiveSelectionMask().

◆ populateChildCommands()

void DuplicateLayers::populateChildCommands ( )
inlineoverridevirtual

We should first disable the currently active masks, after the operation completed their cloned counterparts will be activated instead.

HINT: we should deactivate the masks before cloning, because otherwise KisGroupLayer::allowAsChild() will not let the second mask to be added to the list of child nodes. See bug 382315.

Activate the cloned counterparts of the masks after the operation is complete.

Implements KisCommandUtils::AggregateCommand.

Definition at line 491 of file kis_node_juggler_compressed.cpp.

491 {
493
494 if (filteredNodes.isEmpty()) return;
495
496 KisNodeSP newAbove = filteredNodes.last();
497
498 // make sure we don't add the new layer into a locked group
499 while (newAbove->parent() && !newAbove->parent()->isEditable(false)) {
500 newAbove = newAbove->parent();
501 }
502
503 KisNodeSP newParent = newAbove->parent();
504
505 // override parent if provided externally
506 if (m_dstParent) {
507 newAbove = m_dstAbove;
508 newParent = m_dstParent;
509 }
510
511 const int indexOfActiveNode = filteredNodes.indexOf(m_activeNode);
512 QList<KisSelectionMaskSP> activeMasks = findActiveSelectionMasks(filteredNodes);
513
514 // we will deactivate the masks before processing, so we should
515 // save their list in a convenient form
516 QSet<KisNodeSP> activeMaskNodes;
517 Q_FOREACH (KisSelectionMaskSP mask, activeMasks) {
518 activeMaskNodes.insert(mask);
519 }
520
521 const bool haveActiveMasks = !activeMasks.isEmpty();
522
523 if (!newParent) return;
524
527 m_image, false));
528
529 if (haveActiveMasks) {
541 false));
542 }
543
544 KisNodeList newNodes;
545 QList<KisSelectionMaskSP> newActiveMasks;
546 KisNodeSP currentAbove = newAbove;
547 Q_FOREACH (KisNodeSP node, filteredNodes) {
548 if (m_mode == COPY || m_mode == ADD) {
549 KisNodeSP newNode;
550
551 if (m_mode == COPY) {
552 newNode = node->clone();
554 } else {
555 newNode = node;
556 }
557
558 newNodes << newNode;
559 if (haveActiveMasks && activeMaskNodes.contains(node)) {
560 KisSelectionMaskSP mask = dynamic_cast<KisSelectionMask*>(newNode.data());
561 newActiveMasks << mask;
562 }
563
564 MoveNodeStructSP moveStruct = toQShared(new MoveNodeStruct(m_image, newNode, newParent, currentAbove));
565 m_updateData->addInitialUpdate(moveStruct);
566
568 newParent,
569 currentAbove,
570 false, false));
571
572 currentAbove = newNode;
573 } else if (m_mode == MOVE) {
574 KisNodeSP newNode = node;
575
576 newNodes << newNode;
577 if (haveActiveMasks && activeMaskNodes.contains(node)) {
578 KisSelectionMaskSP mask = dynamic_cast<KisSelectionMask*>(newNode.data());
579 newActiveMasks << mask;
580 }
581
582 MoveNodeStructSP moveStruct = toQShared(new MoveNodeStruct(m_image, newNode, newParent, currentAbove));
583 m_updateData->addInitialUpdate(moveStruct);
584
586 newParent,
587 currentAbove,
588 false));
589 currentAbove = newNode;
590 }
591 }
592
593
594 if (haveActiveMasks) {
600 newActiveMasks,
601 true));
602 }
603
604 KisNodeSP newActiveNode = newNodes[qBound(0, indexOfActiveNode, newNodes.size() - 1)];
605
607 KisNodeSP(), newActiveNode,
608 m_image, true));
609 }
The command for adding a layer.
The command for layer moves inside the layer stack.
QSharedPointer< T > toQShared(T *ptr)
QList< KisNodeSP > KisNodeList
Definition kis_types.h:264
KisSharedPtr< KisNode > KisNodeSP
Definition kis_types.h:86
void addCopyOfNameTag(KisNodeSP node)
KisNodeList sortAndFilterAnyMergeableNodesSafe(const KisNodeList &nodes, KisImageSP image)
QList< KisSelectionMaskSP > findActiveSelectionMasks(KisNodeList nodes)
bool isEditable(bool checkVisibility=true) const
void addCommand(KUndo2Command *cmd)
virtual KisNodeSP clone() const =0
KisNodeWSP parent
Definition kis_node.cpp:86

References ADD, KisCommandUtils::AggregateCommand::addCommand(), KisLayerUtils::addCopyOfNameTag(), KisNode::clone(), COPY, KisSharedPtr< T >::data(), findActiveSelectionMasks(), KisBaseNode::isEditable(), m_activeNode, m_dstAbove, m_dstParent, m_image, m_mode, m_nodes, m_updateData, MOVE, KisNode::parent, KisLayerUtils::sortAndFilterAnyMergeableNodesSafe(), and toQShared().

◆ toActiveSelectionMask()

KisSelectionMaskSP DuplicateLayers::toActiveSelectionMask ( KisNodeSP node)
inlineprivate

Definition at line 611 of file kis_node_juggler_compressed.cpp.

611 {
612 KisSelectionMask *mask = dynamic_cast<KisSelectionMask*>(node.data());
613 return mask && mask->active() ? mask : 0;
614 }

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

Member Data Documentation

◆ m_activeNode

KisNodeSP DuplicateLayers::m_activeNode
private

Definition at line 633 of file kis_node_juggler_compressed.cpp.

◆ m_dstAbove

KisNodeSP DuplicateLayers::m_dstAbove
private

Definition at line 632 of file kis_node_juggler_compressed.cpp.

◆ m_dstParent

KisNodeSP DuplicateLayers::m_dstParent
private

Definition at line 631 of file kis_node_juggler_compressed.cpp.

◆ m_image

KisImageSP DuplicateLayers::m_image
private

Definition at line 629 of file kis_node_juggler_compressed.cpp.

◆ m_mode

Mode DuplicateLayers::m_mode
private

Definition at line 634 of file kis_node_juggler_compressed.cpp.

◆ m_nodes

KisNodeList DuplicateLayers::m_nodes
private

Definition at line 630 of file kis_node_juggler_compressed.cpp.

◆ m_updateData

BatchMoveUpdateDataSP DuplicateLayers::m_updateData
private

Definition at line 628 of file kis_node_juggler_compressed.cpp.


The documentation for this struct was generated from the following file: