Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_layer_composition.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Sven Langkamp <sven.langkamp@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8#include "kis_node_visitor.h"
9#include "kis_group_layer.h"
12#include "kis_paint_layer.h"
14#include "kis_clone_layer.h"
15#include "kis_filter_mask.h"
16#include "kis_transform_mask.h"
18#include "kis_selection_mask.h"
20#include "kis_layer_utils.h"
21#include "kis_node_query_path.h"
22
23#include <QDomDocument>
24
26public:
27 enum Mode {
29 APPLY
30 };
31
33 : m_layerComposition(layerComposition)
34 , m_mode(mode)
35 {
36 }
37
38 bool visit(KisNode* node) override { return process(node); }
39 bool visit(KisGroupLayer* layer) override
40 {
41 bool result = visitAll(layer);
42 if(layer == layer->image()->rootLayer()) {
43 return result;
44 }
45 return result && process(layer);
46 }
47 bool visit(KisAdjustmentLayer* layer) override { return process(layer); }
48 bool visit(KisPaintLayer* layer) override { return process(layer); }
49 bool visit(KisExternalLayer* layer) override { return process(layer); }
50 bool visit(KisGeneratorLayer* layer) override { return process(layer); }
51 bool visit(KisCloneLayer* layer) override { return process(layer); }
52 bool visit(KisFilterMask* mask) override { return process(mask); }
53 bool visit(KisTransformMask* mask) override { return process(mask); }
54 bool visit(KisTransparencyMask* mask) override { return process(mask); }
55 bool visit(KisSelectionMask* mask) override { return process(mask); }
56 bool visit(KisColorizeMask* mask) override { return process(mask); }
57
58 bool process(KisNode* node) {
59 if (node->isFakeNode()) {
60 dbgKrita << "Compositions: Skipping over Fake Node" << node->uuid() << node->name();
61 return true;
62 }
63
64 bool result = visitAll(node);
65
66 if(m_mode == STORE) {
69 } else {
70 bool newState = false;
71 if(m_layerComposition->m_visibilityMap.contains(node->uuid())) {
72 newState = m_layerComposition->m_visibilityMap[node->uuid()];
73 }
74 if(node->visible() != newState) {
76 node->setDirty();
77 }
78 if(m_layerComposition->m_collapsedMap.contains(node->uuid())) {
80 }
81 }
82
83 return result;
84 }
85private:
88};
89
91 : m_image(image)
92 , m_name(name)
93 , m_exportEnabled(true)
94{
95
96}
97
102
104 : m_image(otherImage ? otherImage : rhs.m_image),
105 m_name(rhs.m_name),
106 m_exportEnabled(rhs.m_exportEnabled)
107{
108 {
109 auto it = rhs.m_visibilityMap.constBegin();
110 for (; it != rhs.m_visibilityMap.constEnd(); ++it) {
111 QUuid nodeUuid = it.key();
112 KisNodeSP node = KisLayerUtils::findNodeByUuid(rhs.m_image->root(), nodeUuid);
113 if (node) {
115 KisNodeSP newNode = path.queryUniqueNode(m_image);
116 KIS_ASSERT_RECOVER(newNode) { continue; }
117
118 m_visibilityMap.insert(newNode->uuid(), it.value());
119 }
120 }
121 }
122
123 {
124 auto it = rhs.m_collapsedMap.constBegin();
125 for (; it != rhs.m_collapsedMap.constEnd(); ++it) {
126 QUuid nodeUuid = it.key();
127 KisNodeSP node = KisLayerUtils::findNodeByUuid(rhs.m_image->root(), nodeUuid);
128 if (node) {
130 KisNodeSP newNode = path.queryUniqueNode(m_image);
131 KIS_ASSERT_RECOVER(newNode) { continue; }
132
133 m_collapsedMap.insert(newNode->uuid(), it.value());
134 }
135 }
136 }
137}
138
139void KisLayerComposition::setName(const QString& name)
140{
141 m_name = name;
142}
143
145{
146 return m_name;
147}
148
150{
151 if(m_image.isNull()) {
152 return;
153 }
155 m_image->rootLayer()->accept(visitor);
156}
157
159{
160 if (m_image.isNull()) {
161 return;
162 }
164 m_image->rootLayer()->accept(visitor);
165}
166
168{
169 m_exportEnabled = enabled;
170}
171
176
177void KisLayerComposition::setVisible(QUuid id, bool visible)
178{
179 m_visibilityMap[id] = visible;
180}
181
182void KisLayerComposition::setCollapsed ( QUuid id, bool collapsed )
183{
184 m_collapsedMap[id] = collapsed;
185}
186
187void KisLayerComposition::save(QDomDocument& doc, QDomElement& element)
188{
189 QDomElement compositionElement = doc.createElement("composition");
190 compositionElement.setAttribute("name", m_name);
191 compositionElement.setAttribute("exportEnabled", m_exportEnabled);
192 QMapIterator<QUuid, bool> iter(m_visibilityMap);
193 while (iter.hasNext()) {
194 iter.next();
195 QDomElement valueElement = doc.createElement("value");
196 dbgKrita << "uuid" << iter.key().toString() << "visible" << iter.value();
197 valueElement.setAttribute("uuid", iter.key().toString());
198 valueElement.setAttribute("visible", iter.value());
199 dbgKrita << "contains" << m_collapsedMap.contains(iter.key());
200 if (m_collapsedMap.contains(iter.key())) {
201 dbgKrita << "collapsed :" << m_collapsedMap[iter.key()];
202 valueElement.setAttribute("collapsed", m_collapsedMap[iter.key()]);
203 }
204 compositionElement.appendChild(valueElement);
205 }
206 element.appendChild(compositionElement);
207}
KisLayerComposition * m_layerComposition
bool visit(KisExternalLayer *layer) override
bool visit(KisCloneLayer *layer) override
bool visit(KisColorizeMask *mask) override
bool visit(KisSelectionMask *mask) override
bool visit(KisPaintLayer *layer) override
bool visit(KisNode *node) override
bool visit(KisTransformMask *mask) override
KisCompositionVisitor(KisLayerComposition *layerComposition, Mode mode)
bool visit(KisFilterMask *mask) override
bool visit(KisAdjustmentLayer *layer) override
bool visit(KisGroupLayer *layer) override
bool visit(KisGeneratorLayer *layer) override
bool visit(KisTransparencyMask *mask) override
KisGroupLayerSP rootLayer() const
QMap< QUuid, bool > m_visibilityMap
void setExportEnabled(bool enabled)
QMap< QUuid, bool > m_collapsedMap
void setName(const QString &name)
void setCollapsed(QUuid id, bool collapsed)
void save(QDomDocument &doc, QDomElement &element)
KisLayerComposition(KisImageWSP image, const QString &name)
void setVisible(QUuid id, bool visible)
bool visitAll(KisNode *node, bool breakOnFail=false)
bool isNull() const
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55
#define dbgKrita
Definition kis_debug.h:45
KisNodeSP findNodeByUuid(KisNodeSP root, const QUuid &uuid)
QUuid uuid() const
virtual void setVisible(bool visible, bool loading=false)
void setCollapsed(bool collapsed)
KisImageWSP image
QString name() const
virtual bool isFakeNode() const
virtual bool visible(bool recursive=false) const
bool accept(KisNodeVisitor &v) override
static KisNodeQueryPath absolutePath(KisNodeSP node)
virtual void setDirty()
Definition kis_node.cpp:577