Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_dummies_facade_base.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include <QMutex>
8#include <QMutexLocker>
10
11#include "kis_image.h"
13#include "kis_layer_utils.h"
15
17{
18public:
21
26
42};
43
44
54
59
61{
62 setImage(image, nullptr);
63}
64
66{
67 if (m_d->image) {
68 Q_EMIT sigActivateNode(0);
70 m_d->image->disconnect(this);
71 m_d->image->disconnect(&m_d->nodeChangedConnection);
72 m_d->image->disconnect(&m_d->activateNodeConnection);
73
74 KisNodeList nodesToRemove;
75
76 {
77 QMutexLocker l(&m_d->pendingNodeSetLock);
78 std::swap(nodesToRemove, m_d->pendingNodeSet);
79 m_d->pendingNodeSet.clear();
80 }
81
82 for (auto it = std::make_reverse_iterator(nodesToRemove.end());
83 it != std::make_reverse_iterator(nodesToRemove.begin());
84 ++it) {
85
86 m_d->removeNodeConnection.start(*it);
87 }
88 }
89
90 m_d->image = image;
91
92 if (image) {
94
95 connect(image, SIGNAL(sigNodeAddedAsync(KisNodeSP, KisNodeAdditionFlags)),
96 SLOT(slotNodeAdded(KisNodeSP, KisNodeAdditionFlags)), Qt::DirectConnection);
97 connect(image, SIGNAL(sigRemoveNodeAsync(KisNodeSP)),
98 SLOT(slotRemoveNode(KisNodeSP)), Qt::DirectConnection);
99 connect(image, SIGNAL(sigLayersChangedAsync()),
100 SLOT(slotLayersChanged()), Qt::DirectConnection);
101
104
105 if (!activeNode) {
106 activeNode = findFirstLayer(image->root());
107 }
108
110 }
111}
112
117
119{
120 return m_d->image;
121}
122
124{
125 KisNodeSP child = root->firstChild();
126 while(child && !child->inherits("KisLayer")) {
127 child = child->nextSibling();
128 }
129 return child;
130}
131
133{
134 KisNodeDummy *dummy = dummyForNode(node);
135
143
144 Q_EMIT sigDummyChanged(dummy);
145}
146
151
153{
154 if (flags.testFlag(KisNodeAdditionFlag::DontActivateNode)) return;
155
156 if (!node || !node->graphListener()) return;
157
158 if (!node->inherits("KisSelectionMask") &&
159 !node->inherits("KisReferenceImagesLayer") &&
160 !node->inherits("KisDecorationsWrapperLayer")) {
161
162 Q_EMIT sigActivateNode(node);
163 m_d->lastActivatedNode = node;
164 }
165}
166
167void KisDummiesFacadeBase::slotNodeAdded(KisNodeSP node, KisNodeAdditionFlags flags)
168{
169 Q_UNUSED(flags)
170
171 {
172 QMutexLocker l(&m_d->pendingNodeSetLock);
173 m_d->pendingNodeSet.append(node);
174 }
175
176 m_d->addNodeConnection.start(node, node->parent(), node->prevSibling());
177
178 KisNodeSP childNode = node->firstChild();
179 while (childNode) {
180 slotNodeAdded(childNode, flags);
181 childNode = childNode->nextSibling();
182 }
183}
184
186{
187 {
188 QMutexLocker l(&m_d->pendingNodeSetLock);
190 }
191
192 KisNodeSP childNode = node->lastChild();
193 while (childNode) {
194 slotRemoveNode(childNode);
195 childNode = childNode->prevSibling();
196 }
197
198 {
199 QMutexLocker l(&m_d->pendingNodeSetLock);
200 m_d->pendingNodeSet.removeOne(node);
201 }
202 m_d->removeNodeConnection.start(node);
203}
204
206{
207 KisNodeDummy *parentDummy = parent ? dummyForNode(parent) : 0;
208 KisNodeDummy *aboveThisDummy = aboveThis ? dummyForNode(aboveThis) : 0;
209 // Add one because this node does not exist yet
210 int index = parentDummy && aboveThisDummy ?
211 parentDummy->indexOf(aboveThisDummy) + 1 : 0;
212 Q_EMIT sigBeginInsertDummy(parentDummy, index, node->metaObject()->className());
213
214 addNodeImpl(node, parent, aboveThis);
215
216 Q_EMIT sigEndInsertDummy(dummyForNode(node));
217}
218
220{
221 KisNodeDummy *dummy = dummyForNode(node);
222 Q_EMIT sigBeginRemoveDummy(dummy);
223
224 removeNodeImpl(node);
225
226 Q_EMIT sigEndRemoveDummy();
227}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void slotRemoveNode(KisNodeSP node)
virtual void removeNodeImpl(KisNodeSP node)=0
void sigBeginInsertDummy(KisNodeDummy *parent, int index, const QString &metaObjectType)
KisDummiesFacadeBase(QObject *parent=0)
void sigEndInsertDummy(KisNodeDummy *dummy)
void slotNodeActivationRequested(KisNodeSP node, KisNodeAdditionFlags flags)
void sigBeginRemoveDummy(KisNodeDummy *dummy)
static KisNodeSP findFirstLayer(KisNodeSP root)
virtual KisNodeDummy * dummyForNode(KisNodeSP node) const =0
void setImage(KisImageWSP image)
void sigActivateNode(KisNodeSP node)
void slotNodeChanged(KisNodeSP node)
virtual void addNodeImpl(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)=0
void slotContinueRemoveNode(KisNodeSP node)
void slotContinueAddNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
void sigDummyChanged(KisNodeDummy *dummy)
void slotNodeAdded(KisNodeSP node, KisNodeAdditionFlags flags)
void sigNodeChanged(KisNodeSP node)
void sigNodeAddedAsync(KisNodeSP node, KisNodeAdditionFlags flags)
int indexOf(KisNodeDummy *child) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KisSynchronizedConnection< KisNodeSP > nodeChangedConnection
KisSynchronizedConnection< KisNodeSP, KisNodeAdditionFlags > activateNodeConnection
KisSynchronizedConnection< KisNodeSP > removeNodeConnection
KisSynchronizedConnection< KisNodeSP, KisNodeSP, KisNodeSP > addNodeConnection
KisNodeSP prevSibling() const
Definition kis_node.cpp:402
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP lastChild() const
Definition kis_node.cpp:367
KisNodeSP nextSibling() const
Definition kis_node.cpp:408
KisNodeGraphListener * graphListener
Definition kis_node.cpp:87