Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_node_dummies_graph.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
8#include "kis_node_shape.h"
10
11
12/********************************************************************/
13/* KisNodeDummy */
14/********************************************************************/
15
17 : m_nodeShape(nodeShape),
18 m_node(node)
19{
20}
21
23{
24 qDeleteAll(m_children);
25}
26
28{
29 return !m_children.isEmpty() ? m_children.first() : 0;
30}
31
33{
34 return !m_children.isEmpty() ? m_children.last() : 0;
35}
36
38{
39 if(!parent()) return 0;
40
41 int index = parent()->m_children.indexOf(const_cast<KisNodeDummy*>(this));
42 Q_ASSERT(index >= 0);
43
44 index++;
45 return index < parent()->m_children.size() ?
46 parent()->m_children[index] : 0;
47}
48
50{
51 if(!parent()) return 0;
52
53 int index = parent()->m_children.indexOf(const_cast<KisNodeDummy*>(this));
54 Q_ASSERT(index >= 0);
55
56 index--;
57 return index >= 0 ? parent()->m_children[index] : 0;
58}
59
61{
62 return qobject_cast<KisNodeDummy*>(QObject::parent());
63}
64
69
71{
72 return m_node;
73}
74
75bool KisNodeDummy::isGUIVisible(bool showGlobalSelection) const
76{
77 if (!showGlobalSelection &&
78 parent() && !parent()->parent() &&
79 dynamic_cast<const KisSelectionMask*>(m_node.data())) {
80
81 return false;
82 }
83
84 return parent() && !m_node->isFakeNode();
85}
86
88{
89 return m_children.at(index);
90}
91
93{
94 return m_children.size();
95}
96
98{
99 return m_children.indexOf(child);
100}
101
102/********************************************************************/
103/* KisNodeDummiesGraph */
104/********************************************************************/
105
107 : m_rootDummy(0)
108{
109}
110
115
117{
118 Q_ASSERT(!containsNode(node->node()));
119
120 node->setParent(parent);
121
122 Q_ASSERT_X(parent || !m_rootDummy, "KisNodeDummiesGraph::addNode", "Trying to add second root dummy");
123 Q_ASSERT_X(!parent || m_rootDummy, "KisNodeDummiesGraph::addNode", "Trying to add non-orphan child with no root dummy set");
124
125 if(!parent) {
126 m_rootDummy = node;
127 }
128 else {
129 int insertionIndex = parent->m_children.size();
130
131 insertionIndex = aboveThis ?
132 parent->m_children.indexOf(aboveThis) + 1: 0;
133
134 Q_ASSERT(!aboveThis || parent->m_children.indexOf(aboveThis) >= 0);
135
136 parent->m_children.insert(insertionIndex, node);
137 }
138
139 m_dummiesMap[node->node()] = node;
140}
141
143{
144 Q_ASSERT(containsNode(node->node()));
146
147 KisNodeDummy *parent = node->parent();
148 Q_ASSERT_X(m_rootDummy, "KisNodeDummiesGraph::removeNode", "Trying to remove a dummy with no root dummy");
149
150 if(!parent) {
151 m_rootDummy = 0;
152 }
153 else {
154 parent->m_children.removeOne(node);
155 }
156}
157
159{
160 m_dummiesMap.remove(dummy->node());
161
162 KisNodeDummy *child = dummy->firstChild();
163 while(child) {
165 child = child->nextSibling();
166 }
167}
168
169
171{
172 removeNode(node);
173 addNode(node, parent, aboveThis);
174}
175
177{
178 return m_dummiesMap.contains(node);
179}
180
182{
183 return m_dummiesMap.size();
184}
185
187{
188 if (!m_dummiesMap.contains(node)) {
189 return 0;
190 }
191
192 return m_dummiesMap[node];
193}
void removeNode(KisNodeDummy *node)
void addNode(KisNodeDummy *node, KisNodeDummy *parent, KisNodeDummy *aboveThis)
void unmapDummyRecursively(KisNodeDummy *dummy)
KisNodeDummy * nodeToDummy(KisNodeSP node)
void moveNode(KisNodeDummy *node, KisNodeDummy *parent, KisNodeDummy *aboveThis)
KisNodeDummy * rootDummy() const
bool containsNode(KisNodeSP node) const
KisNodeDummy * at(int index) const
KisNodeDummy * firstChild() const
bool isGUIVisible(bool showGlobalSelection) const
KisNodeShape * nodeShape() const
KisNodeDummy * lastChild() const
KisNodeSP node() const
QList< KisNodeDummy * > m_children
KisNodeDummy * parent() const
KisNodeDummy(KisNodeShape *nodeShape, KisNodeSP node)
int indexOf(KisNodeDummy *child) const
KisNodeShape * m_nodeShape
KisNodeDummy * nextSibling() const
KisNodeDummy * prevSibling() const
virtual bool isFakeNode() const