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

Public Member Functions

 CleanUpNodes (MergeDownInfoBaseSP info, KisNodeSP putAfter, bool relinkClones=false)
 
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 ()
 

Static Public Member Functions

static void findPerfectParent (KisNodeList nodesToDelete, KisNodeSP &putAfter, KisNodeSP &parent)
 

Private Member Functions

void addCommandImpl (KUndo2Command *cmd) override
 
- Private Member Functions inherited from KisLayerUtils::RemoveNodeHelper
virtual ~RemoveNodeHelper ()
 
void safeRemoveMultipleNodes (KisNodeList nodes, KisImageSP image)
 
void safeReplaceMultipleNodes (KisNodeList removedNodes, KisImageSP image, std::optional< ReplacementNode > replacementNode)
 

Private Attributes

MergeDownInfoBaseSP m_info
 
KisNodeSP m_putAfter
 
bool m_relinkClones {false}
 

Additional Inherited Members

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

Detailed Description

Definition at line 1154 of file kis_layer_utils.cpp.

Constructor & Destructor Documentation

◆ CleanUpNodes()

KisLayerUtils::CleanUpNodes::CleanUpNodes ( MergeDownInfoBaseSP info,
KisNodeSP putAfter,
bool relinkClones = false )
inline

Definition at line 1155 of file kis_layer_utils.cpp.

1156 : m_info(info), m_putAfter(putAfter), m_relinkClones(relinkClones) {}

Member Function Documentation

◆ addCommandImpl()

void KisLayerUtils::CleanUpNodes::addCommandImpl ( KUndo2Command * cmd)
inlineoverrideprivatevirtual

Implements KisLayerUtils::RemoveNodeHelper.

Definition at line 1260 of file kis_layer_utils.cpp.

1260 {
1261 addCommand(cmd);
1262 }
void addCommand(KUndo2Command *cmd)

◆ findPerfectParent()

static void KisLayerUtils::CleanUpNodes::findPerfectParent ( KisNodeList nodesToDelete,
KisNodeSP & putAfter,
KisNodeSP & parent )
inlinestatic

Definition at line 1158 of file kis_layer_utils.cpp.

1158 {
1159 if (!putAfter) {
1160 putAfter = nodesToDelete.last();
1161 }
1162
1163 // Add the new merged node on top of the active node
1164 // -- checking all parents if they are included in nodesToDelete
1165 // Not every descendant is included in nodesToDelete even if in fact
1166 // they are going to be deleted, so we need to check it.
1167 // If we consider the path from root to the putAfter node,
1168 // if there are any nodes marked for deletion, any node afterwards
1169 // is going to be deleted, too.
1170 // example: root . . . . . ! ! . . ! ! ! ! . . . . putAfter
1171 // it should be: root . . . . . ! ! ! ! ! ! ! ! ! ! ! ! !putAfter
1172 // and here: root . . . . X ! ! . . ! ! ! ! . . . . putAfter
1173 // you can see which node is "the perfect ancestor"
1174 // (marked X; called "parent" in the function arguments).
1175 // and here: root . . . . . O ! . . ! ! ! ! . . . . putAfter
1176 // you can see which node is "the topmost deleted ancestor" (marked 'O')
1177
1178 KisNodeSP node = putAfter->parent();
1179 bool foundDeletedAncestor = false;
1180 KisNodeSP topmostAncestorToDelete = nullptr;
1181
1182 while (node) {
1183
1184 if (nodesToDelete.contains(node)
1185 && !nodesToDelete.contains(node->parent())) {
1186 foundDeletedAncestor = true;
1187 topmostAncestorToDelete = node;
1188 // Here node is to be deleted and its parent is not,
1189 // so its parent is the one of the first not deleted (="perfect") ancestors.
1190 // We need the one that is closest to the top (root)
1191 }
1192
1193 node = node->parent();
1194 }
1195
1196 if (foundDeletedAncestor) {
1197 parent = topmostAncestorToDelete->parent();
1198 putAfter = topmostAncestorToDelete;
1199 }
1200 else {
1201 parent = putAfter->parent(); // putAfter (and none of its ancestors) is to be deleted, so its parent is the first not deleted ancestor
1202 }
1203
1204 }
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
KisNodeWSP parent
Definition kis_node.cpp:86

References KisNode::parent.

◆ populateChildCommands()

void KisLayerUtils::CleanUpNodes::populateChildCommands ( )
inlineoverridevirtual

Implements KisCommandUtils::AggregateCommand.

Definition at line 1206 of file kis_layer_utils.cpp.

1206 {
1207 KisNodeList nodesToDelete = m_info->allSrcNodes();
1208
1210 findPerfectParent(nodesToDelete, m_putAfter, parent);
1211
1212 if (!parent) {
1213 KisNodeSP oldRoot = m_info->image->root();
1214 KisNodeSP newRoot(new KisGroupLayer(m_info->image, "root", OPACITY_OPAQUE_U8));
1215
1216 // copy all fake nodes into the new image
1217 KisLayerUtils::recursiveApplyNodes(oldRoot, [this, oldRoot, newRoot] (KisNodeSP node) {
1218 if (node->isFakeNode() && node->parent() == oldRoot) {
1219 addCommand(new KisImageLayerAddCommand(m_info->image,
1220 node->clone(),
1221 newRoot,
1222 KisNodeSP(),
1223 false, false));
1224
1225 }
1226 });
1227
1229 m_info->dstNode,
1230 newRoot,
1231 KisNodeSP(),
1232 true, false));
1233 addCommand(new KisImageChangeLayersCommand(m_info->image, oldRoot, newRoot));
1234
1235 }
1236 else {
1237 KisNodeList safeNodesToDelete = m_info->allSrcNodes();
1238 KisNodeList safeNodesToHide;
1239
1240 splitNonRemovableNodes(safeNodesToDelete, safeNodesToHide);
1241
1242 Q_FOREACH(KisNodeSP node, safeNodesToHide) {
1244 }
1245
1246 safeReplaceMultipleNodes(safeNodesToDelete, m_info->image,
1247 std::make_optional<ReplacementNode>(
1248 {m_info->dstNode,
1249 parent,
1250 m_putAfter,
1251 true, false,
1252 m_info->selectionMasks,
1253 m_relinkClones}));
1254 }
1255
1256
1257 }
const quint8 OPACITY_OPAQUE_U8
The command for adding a layer.
void safeReplaceMultipleNodes(KisNodeList removedNodes, KisImageSP image, std::optional< ReplacementNode > replacementNode)
void recursiveApplyNodes(NodePointer node, Functor func)
void splitNonRemovableNodes(KisNodeList &nodesToRemove, KisNodeList &_nodesToHide)
virtual bool isFakeNode() const
static void findPerfectParent(KisNodeList nodesToDelete, KisNodeSP &putAfter, KisNodeSP &parent)

References KisBaseNode::image, KisBaseNode::isFakeNode(), OPACITY_OPAQUE_U8, KisNode::parent, KisLayerUtils::recursiveApplyNodes(), KisNodeFacade::root, and KisLayerUtils::splitNonRemovableNodes().

Member Data Documentation

◆ m_info

MergeDownInfoBaseSP KisLayerUtils::CleanUpNodes::m_info
private

Definition at line 1265 of file kis_layer_utils.cpp.

◆ m_putAfter

KisNodeSP KisLayerUtils::CleanUpNodes::m_putAfter
private

Definition at line 1266 of file kis_layer_utils.cpp.

◆ m_relinkClones

bool KisLayerUtils::CleanUpNodes::m_relinkClones {false}
private

Definition at line 1267 of file kis_layer_utils.cpp.

1267{false};

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