Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_image_layer_remove_command_impl.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
3 * SPDX-FileCopyrightText: 2007 Sven Langkamp <sven.langkamp@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9#include "kis_image.h"
10
11#include <klocalizedstring.h>
12#include "kis_layer.h"
13#include "kis_clone_layer.h"
14#include "kis_paint_layer.h"
15
33
35 : KisImageCommand(kundo2_i18n("Remove Layer"), image, parent),
36 m_d(new Private(this))
37{
38 m_d->node = node;
39 m_d->prevParent = node->parent();
40 m_d->prevAbove = node->prevSibling();
41}
42
47
49{
51 if (!image) {
52 return;
53 }
54 m_d->processClones(m_d->node);
55 image->removeNode(m_d->node);
56}
57
59{
61 if (!image) {
62 return;
63 }
64 m_d->restoreClones(); // so that we can get prevAbove back, if it is our clone
65 image->addNode(m_d->node, m_d->prevParent, m_d->prevAbove);
66}
67
68void KisImageLayerRemoveCommandImpl::Private::restoreClones()
69{
70 Q_ASSERT(reincarnatedNodes.size() == clonesList.size());
71 KisImageSP image = q->m_image.toStrongRef();
72 if (!image) {
73 return;
74 }
75 for (int i = 0; i < reincarnatedNodes.size(); i++) {
76 KisCloneLayerSP clone = clonesList[i];
77 KisLayerSP newNode = reincarnatedNodes[i];
78
79 image->addNode(clone, newNode->parent(), newNode);
80 moveChildren(newNode, clone);
81 moveClones(newNode, clone);
82 image->removeNode(newNode);
83 }
84}
85
86void KisImageLayerRemoveCommandImpl::Private::processClones(KisNodeSP node)
87{
88 KisLayerSP layer(qobject_cast<KisLayer*>(node.data()));
89 if(!layer || !layer->hasClones()) return;
90
91 if(reincarnatedNodes.isEmpty()) {
95 Q_FOREACH (KisCloneLayerWSP _clone, layer->registeredClones()) {
96 KisCloneLayerSP clone = _clone;
97 Q_ASSERT(clone);
98
99 clonesList.append(clone);
100 reincarnatedNodes.append(clone->reincarnateAsPaintLayer());
101 }
102 }
103
104 KisImageSP image = q->m_image.toStrongRef();
105 if (!image) {
106 return;
107 }
108
113 for (int i = 0; i < reincarnatedNodes.size(); i++) {
114 KisCloneLayerSP clone = clonesList[i];
115 KisLayerSP newNode = reincarnatedNodes[i];
116
117 image->addNode(newNode, clone->parent(), clone);
118 moveChildren(clone, newNode);
119 moveClones(clone, newNode);
120 image->removeNode(clone);
121 }
122}
123
124void KisImageLayerRemoveCommandImpl::Private::moveChildren(KisNodeSP src, KisNodeSP dst)
125{
126 KisImageSP image = q->m_image.toStrongRef();
127 if (!image) {
128 return;
129 }
130 KisNodeSP child = src->firstChild();
131 while(child) {
132 image->moveNode(child, dst, dst->lastChild());
133 child = child->nextSibling();
134 }
135}
136
137void KisImageLayerRemoveCommandImpl::Private::moveClones(KisLayerSP src, KisLayerSP dst)
138{
139 Q_FOREACH (KisCloneLayerWSP _clone, src->registeredClones()) {
140 KisCloneLayerSP clone = _clone;
141 Q_ASSERT(clone);
142
143 clone->setCopyFrom(dst);
144 }
145}
the base command for commands altering a KisImage
KisSharedPtr< T > toStrongRef() const
toStrongRef returns a KisSharedPtr which may be dereferenced.
KUndo2MagicString kundo2_i18n(const char *text)
Private(KisImageLayerRemoveCommandImpl *_q)
void moveChildren(KisNodeSP src, KisNodeSP dst)
void processClones(KisNodeSP node)
KisImageLayerRemoveCommandImpl(KisImageWSP image, KisNodeSP node, KUndo2Command *parent=0)
void moveClones(KisLayerSP src, KisLayerSP dst)
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
bool moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
bool removeNode(KisNodeSP node)
KisNodeSP prevSibling() const
Definition kis_node.cpp:402
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP lastChild() const
Definition kis_node.cpp:367
KisNodeSP nextSibling() const
Definition kis_node.cpp:408