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)
 
 ~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 123 of file kis_dummies_facade_base.cpp.

124{
125 KisNodeSP child = root->firstChild();
126 while(child && !child->inherits("KisLayer")) {
127 child = child->nextSibling();
128 }
129 return child;
130}
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 118 of file kis_dummies_facade_base.cpp.

119{
120 return m_d->image;
121}

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}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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, connect(), 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().

◆ 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 205 of file kis_dummies_facade_base.cpp.

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}
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 219 of file kis_dummies_facade_base.cpp.

220{
221 KisNodeDummy *dummy = dummyForNode(node);
222 Q_EMIT sigBeginRemoveDummy(dummy);
223
224 removeNodeImpl(node);
225
226 Q_EMIT sigEndRemoveDummy();
227}
virtual void removeNodeImpl(KisNodeSP node)=0
void sigBeginRemoveDummy(KisNodeDummy *dummy)

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

◆ slotLayersChanged

void KisDummiesFacadeBase::slotLayersChanged ( )
privateslot

Definition at line 147 of file kis_dummies_facade_base.cpp.

148{
150}

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

◆ slotNodeActivationRequested

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

Definition at line 152 of file kis_dummies_facade_base.cpp.

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}
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 167 of file kis_dummies_facade_base.cpp.

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}
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 132 of file kis_dummies_facade_base.cpp.

133{
134 KisNodeDummy *dummy = dummyForNode(node);
135
143
144 Q_EMIT sigDummyChanged(dummy);
145}
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 185 of file kis_dummies_facade_base.cpp.

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}
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 101 of file kis_dummies_facade_base.h.


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