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 1185 of file kis_layer_utils.cpp.

Constructor & Destructor Documentation

◆ CleanUpNodes()

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

Definition at line 1186 of file kis_layer_utils.cpp.

1187 : 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 1291 of file kis_layer_utils.cpp.

1291 {
1292 addCommand(cmd);
1293 }
void addCommand(KUndo2Command *cmd)

◆ findPerfectParent()

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

Definition at line 1189 of file kis_layer_utils.cpp.

1189 {
1190 if (!putAfter) {
1191 putAfter = nodesToDelete.last();
1192 }
1193
1194 // Add the new merged node on top of the active node
1195 // -- checking all parents if they are included in nodesToDelete
1196 // Not every descendant is included in nodesToDelete even if in fact
1197 // they are going to be deleted, so we need to check it.
1198 // If we consider the path from root to the putAfter node,
1199 // if there are any nodes marked for deletion, any node afterwards
1200 // is going to be deleted, too.
1201 // example: root . . . . . ! ! . . ! ! ! ! . . . . putAfter
1202 // it should be: root . . . . . ! ! ! ! ! ! ! ! ! ! ! ! !putAfter
1203 // and here: root . . . . X ! ! . . ! ! ! ! . . . . putAfter
1204 // you can see which node is "the perfect ancestor"
1205 // (marked X; called "parent" in the function arguments).
1206 // and here: root . . . . . O ! . . ! ! ! ! . . . . putAfter
1207 // you can see which node is "the topmost deleted ancestor" (marked 'O')
1208
1209 KisNodeSP node = putAfter->parent();
1210 bool foundDeletedAncestor = false;
1211 KisNodeSP topmostAncestorToDelete = nullptr;
1212
1213 while (node) {
1214
1215 if (nodesToDelete.contains(node)
1216 && !nodesToDelete.contains(node->parent())) {
1217 foundDeletedAncestor = true;
1218 topmostAncestorToDelete = node;
1219 // Here node is to be deleted and its parent is not,
1220 // so its parent is the one of the first not deleted (="perfect") ancestors.
1221 // We need the one that is closest to the top (root)
1222 }
1223
1224 node = node->parent();
1225 }
1226
1227 if (foundDeletedAncestor) {
1228 parent = topmostAncestorToDelete->parent();
1229 putAfter = topmostAncestorToDelete;
1230 }
1231 else {
1232 parent = putAfter->parent(); // putAfter (and none of its ancestors) is to be deleted, so its parent is the first not deleted ancestor
1233 }
1234
1235 }
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 1237 of file kis_layer_utils.cpp.

1237 {
1238 KisNodeList nodesToDelete = m_info->allSrcNodes();
1239
1241 findPerfectParent(nodesToDelete, m_putAfter, parent);
1242
1243 if (!parent) {
1244 KisNodeSP oldRoot = m_info->image->root();
1245 KisNodeSP newRoot(new KisGroupLayer(m_info->image, "root", OPACITY_OPAQUE_U8));
1246
1247 // copy all fake nodes into the new image
1248 KisLayerUtils::recursiveApplyNodes(oldRoot, [this, oldRoot, newRoot] (KisNodeSP node) {
1249 if (node->isFakeNode() && node->parent() == oldRoot) {
1250 addCommand(new KisImageLayerAddCommand(m_info->image,
1251 node->clone(),
1252 newRoot,
1253 KisNodeSP(),
1254 false, false));
1255
1256 }
1257 });
1258
1260 m_info->dstNode,
1261 newRoot,
1262 KisNodeSP(),
1263 true, false));
1264 addCommand(new KisImageChangeLayersCommand(m_info->image, oldRoot, newRoot));
1265
1266 }
1267 else {
1268 KisNodeList safeNodesToDelete = m_info->allSrcNodes();
1269 KisNodeList safeNodesToHide;
1270
1271 splitNonRemovableNodes(safeNodesToDelete, safeNodesToHide);
1272
1273 Q_FOREACH(KisNodeSP node, safeNodesToHide) {
1275 }
1276
1277 safeReplaceMultipleNodes(safeNodesToDelete, m_info->image,
1278 std::make_optional<ReplacementNode>(
1279 {m_info->dstNode,
1280 parent,
1281 m_putAfter,
1282 true, false,
1283 m_info->selectionMasks,
1284 m_relinkClones}));
1285 }
1286
1287
1288 }
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 1296 of file kis_layer_utils.cpp.

◆ m_putAfter

KisNodeSP KisLayerUtils::CleanUpNodes::m_putAfter
private

Definition at line 1297 of file kis_layer_utils.cpp.

◆ m_relinkClones

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

Definition at line 1298 of file kis_layer_utils.cpp.

1298{false};

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