Krita Source Code Documentation
Loading...
Searching...
No Matches
KisDummiesFacadeBase Class Referenceabstract

#include <kis_dummies_facade_base.h>

+ Inheritance diagram for KisDummiesFacadeBase:

Classes

struct  Private
 

Signals

void sigActivateNode (KisNodeSP node)
 
void sigBeginInsertDummy (KisNodeDummy *parent, int index, const QString &metaObjectType)
 
void sigBeginRemoveDummy (KisNodeDummy *dummy)
 
void sigDummyChanged (KisNodeDummy *dummy)
 
void sigEndInsertDummy (KisNodeDummy *dummy)
 
void sigEndRemoveDummy ()
 

Public Member Functions

virtual int dummiesCount () const =0
 
virtual KisNodeDummydummyForNode (KisNodeSP node) const =0
 
virtual bool hasDummyForNode (KisNodeSP node) const =0
 
 KisDummiesFacadeBase (QObject *parent=0)
 
KisNodeSP lastActivatedNode () const
 
virtual KisNodeDummyrootDummy () const =0
 
void setImage (KisImageWSP image)
 
virtual void setImage (KisImageWSP image, KisNodeSP activeNode)
 
void setLastActivatedNode (KisNodeSP node)
 
 ~KisDummiesFacadeBase () override
 

Protected Member Functions

virtual void addNodeImpl (KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)=0
 
KisImageWSP image () const
 
virtual void removeNodeImpl (KisNodeSP node)=0
 

Private Slots

void slotContinueAddNode (KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
 
void slotContinueRemoveNode (KisNodeSP node)
 
void slotLayersChanged ()
 
void slotNodeActivationRequested (KisNodeSP node, KisNodeAdditionFlags flags)
 
void slotNodeAdded (KisNodeSP node, KisNodeAdditionFlags flags)
 
void slotNodeChanged (KisNodeSP node)
 
void slotRemoveNode (KisNodeSP node)
 

Static Private Member Functions

static KisNodeSP findFirstLayer (KisNodeSP root)
 

Private Attributes

Private *const m_d
 

Detailed Description

Keeps track of the node stack and manages local (UI-wide) representation of the node stack. It uses KisNodeDummy objects to represent the stack. This is done to break synchronization tie between UI and Image threads, caused by the fact that KisNodeModel must be synchronously notified when a node is removed/deleted.

Definition at line 26 of file kis_dummies_facade_base.h.

Constructor & Destructor Documentation

◆ KisDummiesFacadeBase()

KisDummiesFacadeBase::KisDummiesFacadeBase ( QObject * parent = 0)

Definition at line 45 of file kis_dummies_facade_base.cpp.

46 : QObject(parent),
47 m_d(new Private())
48{
53}
void slotNodeActivationRequested(KisNodeSP node, KisNodeAdditionFlags flags)
void slotNodeChanged(KisNodeSP node)
void slotContinueRemoveNode(KisNodeSP node)
void slotContinueAddNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
KisSynchronizedConnection< KisNodeSP > nodeChangedConnection
KisSynchronizedConnection< KisNodeSP, KisNodeAdditionFlags > activateNodeConnection
KisSynchronizedConnection< KisNodeSP > removeNodeConnection
KisSynchronizedConnection< KisNodeSP, KisNodeSP, KisNodeSP > addNodeConnection

References KisDummiesFacadeBase::Private::activateNodeConnection, KisDummiesFacadeBase::Private::addNodeConnection, m_d, KisDummiesFacadeBase::Private::nodeChangedConnection, KisDummiesFacadeBase::Private::removeNodeConnection, slotContinueAddNode(), slotContinueRemoveNode(), slotNodeActivationRequested(), and slotNodeChanged().

◆ ~KisDummiesFacadeBase()

KisDummiesFacadeBase::~KisDummiesFacadeBase ( )
override

Definition at line 55 of file kis_dummies_facade_base.cpp.

56{
57 delete m_d;
58}

References m_d.

Member Function Documentation

◆ addNodeImpl()

virtual void KisDummiesFacadeBase::addNodeImpl ( KisNodeSP node,
KisNodeSP parent,
KisNodeSP aboveThis )
protectedpure virtual

Implemented in KisDummiesFacade, and KisShapeController.

◆ dummiesCount()

virtual int KisDummiesFacadeBase::dummiesCount ( ) const
pure virtual

Implemented in KisDummiesFacade, and KisShapeController.

◆ dummyForNode()

virtual KisNodeDummy * KisDummiesFacadeBase::dummyForNode ( KisNodeSP node) const
pure virtual

Implemented in KisShapeController, and KisDummiesFacade.

◆ findFirstLayer()

KisNodeSP KisDummiesFacadeBase::findFirstLayer ( KisNodeSP root)
staticprivate

Definition at line 128 of file kis_dummies_facade_base.cpp.

129{
130 KisNodeSP child = root->firstChild();
131 while(child && !child->inherits("KisLayer")) {
132 child = child->nextSibling();
133 }
134 return child;
135}
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References KisNode::firstChild(), and KisNode::nextSibling().

◆ hasDummyForNode()

virtual bool KisDummiesFacadeBase::hasDummyForNode ( KisNodeSP node) const
pure virtual

Implemented in KisDummiesFacade, and KisShapeController.

◆ image()

KisImageWSP KisDummiesFacadeBase::image ( ) const
protected

Definition at line 123 of file kis_dummies_facade_base.cpp.

124{
125 return m_d->image;
126}

References KisDummiesFacadeBase::Private::image, and m_d.

◆ lastActivatedNode()

KisNodeSP KisDummiesFacadeBase::lastActivatedNode ( ) const

Sometimes (e.g. on setImage() call) sigActivateNode() signal may be emitted while the dummies facade is not yet connected to the node managed. In this case, the activation signal would be lost. Hence we should provide the last emitted value, so that node manager could cold-initialize the current node value on connection.

Definition at line 113 of file kis_dummies_facade_base.cpp.

114{
115 return m_d->lastActivatedNode;
116}

References KisDummiesFacadeBase::Private::lastActivatedNode, and m_d.

◆ removeNodeImpl()

virtual void KisDummiesFacadeBase::removeNodeImpl ( KisNodeSP node)
protectedpure virtual

Implemented in KisDummiesFacade, and KisShapeController.

◆ rootDummy()

virtual KisNodeDummy * KisDummiesFacadeBase::rootDummy ( ) const
pure virtual

Return the root dummy of the graph. Since the call to setImage() causes an asynchronous update of the dummies graph, it may cause rootDummy() to be null at some moments, which is a valid state.

Implemented in KisDummiesFacade, and KisShapeController.

◆ setImage() [1/2]

void KisDummiesFacadeBase::setImage ( KisImageWSP image)

Definition at line 60 of file kis_dummies_facade_base.cpp.

61{
62 setImage(image, nullptr);
63}
void setImage(KisImageWSP image)

References image(), and setImage().

◆ setImage() [2/2]

void KisDummiesFacadeBase::setImage ( KisImageWSP image,
KisNodeSP activeNode )
virtual

Reimplemented in KisShapeController, and KisShapeController.

Definition at line 65 of file kis_dummies_facade_base.cpp.

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}
void slotRemoveNode(KisNodeSP node)
static KisNodeSP findFirstLayer(KisNodeSP root)
void sigActivateNode(KisNodeSP node)
void slotNodeAdded(KisNodeSP node, KisNodeAdditionFlags flags)
void sigNodeChanged(KisNodeSP node)
void sigNodeAddedAsync(KisNodeSP node, KisNodeAdditionFlags flags)

References KisDummiesFacadeBase::Private::activateNodeConnection, findFirstLayer(), KisDummiesFacadeBase::Private::image, image(), KisDummiesFacadeBase::Private::lastActivatedNode, m_d, KisDummiesFacadeBase::Private::nodeChangedConnection, None, KisDummiesFacadeBase::Private::pendingNodeSet, KisDummiesFacadeBase::Private::pendingNodeSetLock, KisDummiesFacadeBase::Private::removeNodeConnection, KisNodeFacade::root, sigActivateNode(), KisImage::sigNodeAddedAsync(), KisImage::sigNodeChanged(), slotLayersChanged(), slotNodeAdded(), and slotRemoveNode().

◆ setLastActivatedNode()

void KisDummiesFacadeBase::setLastActivatedNode ( KisNodeSP node)

Definition at line 118 of file kis_dummies_facade_base.cpp.

119{
120 m_d->lastActivatedNode = node;
121}

References KisDummiesFacadeBase::Private::lastActivatedNode, and m_d.

◆ sigActivateNode

void KisDummiesFacadeBase::sigActivateNode ( KisNodeSP node)
signal

This signal is emitted when the shape controller wants to request the change of an active layer. E.g. when a new layer is added or when the root layer of the image is changed. It should be forwarded through a signal to allow queueing and synchronization of threads.

◆ sigBeginInsertDummy

void KisDummiesFacadeBase::sigBeginInsertDummy ( KisNodeDummy * parent,
int index,
const QString & metaObjectType )
signal

The signals for controlling the node model

◆ sigBeginRemoveDummy

void KisDummiesFacadeBase::sigBeginRemoveDummy ( KisNodeDummy * dummy)
signal

◆ sigDummyChanged

void KisDummiesFacadeBase::sigDummyChanged ( KisNodeDummy * dummy)
signal

◆ sigEndInsertDummy

void KisDummiesFacadeBase::sigEndInsertDummy ( KisNodeDummy * dummy)
signal

◆ sigEndRemoveDummy

void KisDummiesFacadeBase::sigEndRemoveDummy ( )
signal

◆ slotContinueAddNode

void KisDummiesFacadeBase::slotContinueAddNode ( KisNodeSP node,
KisNodeSP parent,
KisNodeSP aboveThis )
privateslot

Definition at line 210 of file kis_dummies_facade_base.cpp.

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}
void sigBeginInsertDummy(KisNodeDummy *parent, int index, const QString &metaObjectType)
void sigEndInsertDummy(KisNodeDummy *dummy)
virtual KisNodeDummy * dummyForNode(KisNodeSP node) const =0
virtual void addNodeImpl(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)=0
int indexOf(KisNodeDummy *child) const
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327

References addNodeImpl(), dummyForNode(), KisNodeDummy::indexOf(), sigBeginInsertDummy(), and sigEndInsertDummy().

◆ slotContinueRemoveNode

void KisDummiesFacadeBase::slotContinueRemoveNode ( KisNodeSP node)
privateslot

Definition at line 224 of file kis_dummies_facade_base.cpp.

225{
226 KisNodeDummy *dummy = dummyForNode(node);
227 Q_EMIT sigBeginRemoveDummy(dummy);
228
229 removeNodeImpl(node);
230
231 Q_EMIT sigEndRemoveDummy();
232}
virtual void removeNodeImpl(KisNodeSP node)=0
void sigBeginRemoveDummy(KisNodeDummy *dummy)

References dummyForNode(), removeNodeImpl(), sigBeginRemoveDummy(), and sigEndRemoveDummy().

◆ slotLayersChanged

void KisDummiesFacadeBase::slotLayersChanged ( )
privateslot

Definition at line 152 of file kis_dummies_facade_base.cpp.

153{
155}

References KisDummiesFacadeBase::Private::image, m_d, and setImage().

◆ slotNodeActivationRequested

void KisDummiesFacadeBase::slotNodeActivationRequested ( KisNodeSP node,
KisNodeAdditionFlags flags )
privateslot

Definition at line 157 of file kis_dummies_facade_base.cpp.

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}
KisNodeGraphListener * graphListener
Definition kis_node.cpp:87

References DontActivateNode, KisNode::graphListener, KisDummiesFacadeBase::Private::lastActivatedNode, m_d, and sigActivateNode().

◆ slotNodeAdded

void KisDummiesFacadeBase::slotNodeAdded ( KisNodeSP node,
KisNodeAdditionFlags flags )
privateslot

Definition at line 172 of file kis_dummies_facade_base.cpp.

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}
KisNodeSP prevSibling() const
Definition kis_node.cpp:402
KisNodeWSP parent
Definition kis_node.cpp:86

References KisDummiesFacadeBase::Private::addNodeConnection, KisNode::firstChild(), m_d, KisNode::nextSibling(), KisNode::parent, KisDummiesFacadeBase::Private::pendingNodeSet, KisDummiesFacadeBase::Private::pendingNodeSetLock, KisNode::prevSibling(), and slotNodeAdded().

◆ slotNodeChanged

void KisDummiesFacadeBase::slotNodeChanged ( KisNodeSP node)
privateslot

In some "buggy" code the node-changed signal may be emitted before the node will become a part of the node graph. It is a bug, we a really minor one. It should not cause any data losses to the user.

Definition at line 137 of file kis_dummies_facade_base.cpp.

138{
139 KisNodeDummy *dummy = dummyForNode(node);
140
148
149 Q_EMIT sigDummyChanged(dummy);
150}
void sigDummyChanged(KisNodeDummy *dummy)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References dummyForNode(), KIS_SAFE_ASSERT_RECOVER_RETURN, and sigDummyChanged().

◆ slotRemoveNode

void KisDummiesFacadeBase::slotRemoveNode ( KisNodeSP node)
privateslot

Definition at line 190 of file kis_dummies_facade_base.cpp.

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}
KisNodeSP lastChild() const
Definition kis_node.cpp:367

References KIS_SAFE_ASSERT_RECOVER_RETURN, KisNode::lastChild(), m_d, KisDummiesFacadeBase::Private::pendingNodeSet, KisDummiesFacadeBase::Private::pendingNodeSetLock, KisNode::prevSibling(), KisDummiesFacadeBase::Private::removeNodeConnection, and slotRemoveNode().

Member Data Documentation

◆ m_d

Private* const KisDummiesFacadeBase::m_d
private

Definition at line 102 of file kis_dummies_facade_base.h.


The documentation for this class was generated from the following files: