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
122
124{
125 return m_d->image;
126}
127
129{
130 KisNodeSP child = root->firstChild();
131 while(child && !child->inherits("KisLayer")) {
132 child = child->nextSibling();
133 }
134 return child;
135}
136
138{
139 KisNodeDummy *dummy = dummyForNode(node);
140
148
149 Q_EMIT sigDummyChanged(dummy);
150}
151
156
158{
159 if (flags.testFlag(KisNodeAdditionFlag::DontActivateNode)) return;
160
161 if (!node || !node->graphListener()) return;
162
163 if (!node->inherits("KisSelectionMask") &&
164 !node->inherits("KisReferenceImagesLayer") &&
165 !node->inherits("KisDecorationsWrapperLayer")) {
166
167 Q_EMIT sigActivateNode(node);
168 m_d->lastActivatedNode = node;
169 }
170}
171
172void KisDummiesFacadeBase::slotNodeAdded(KisNodeSP node, KisNodeAdditionFlags flags)
173{
174 Q_UNUSED(flags)
175
176 {
177 QMutexLocker l(&m_d->pendingNodeSetLock);
178 m_d->pendingNodeSet.append(node);
179 }
180
181 m_d->addNodeConnection.start(node, node->parent(), node->prevSibling());
182
183 KisNodeSP childNode = node->firstChild();
184 while (childNode) {
185 slotNodeAdded(childNode, flags);
186 childNode = childNode->nextSibling();
187 }
188}
189
191{
192 {
193 QMutexLocker l(&m_d->pendingNodeSetLock);
195 }
196
197 KisNodeSP childNode = node->lastChild();
198 while (childNode) {
199 slotRemoveNode(childNode);
200 childNode = childNode->prevSibling();
201 }
202
203 {
204 QMutexLocker l(&m_d->pendingNodeSetLock);
205 m_d->pendingNodeSet.removeOne(node);
206 }
207 m_d->removeNodeConnection.start(node);
208}
209
211{
212 KisNodeDummy *parentDummy = parent ? dummyForNode(parent) : 0;
213 KisNodeDummy *aboveThisDummy = aboveThis ? dummyForNode(aboveThis) : 0;
214 // Add one because this node does not exist yet
215 int index = parentDummy && aboveThisDummy ?
216 parentDummy->indexOf(aboveThisDummy) + 1 : 0;
217 Q_EMIT sigBeginInsertDummy(parentDummy, index, node->metaObject()->className());
218
219 addNodeImpl(node, parent, aboveThis);
220
221 Q_EMIT sigEndInsertDummy(dummyForNode(node));
222}
223
225{
226 KisNodeDummy *dummy = dummyForNode(node);
227 Q_EMIT sigBeginRemoveDummy(dummy);
228
229 removeNodeImpl(node);
230
231 Q_EMIT sigEndRemoveDummy();
232}
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 setLastActivatedNode(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