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 KUndo2Command * child (int index) const
 
int childCount () const
 
virtual QTime endTime () const
 
KUndo2CommandExtraData * extraData () 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: