forked from paceholder/nodeeditor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAbstractGraphModel.cpp
More file actions
109 lines (77 loc) · 3.42 KB
/
AbstractGraphModel.cpp
File metadata and controls
109 lines (77 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "AbstractGraphModel.hpp"
#include <QtNodes/ConnectionIdUtils>
namespace QtNodes {
void AbstractGraphModel::portsAboutToBeDeleted(NodeId const nodeId,
PortType const portType,
PortIndex const first,
PortIndex const last)
{
_shiftedByDynamicPortsConnections.clear();
auto portCountRole = portType == PortType::In ? NodeRole::InPortCount : NodeRole::OutPortCount;
unsigned int portCount = nodeData(nodeId, portCountRole).toUInt();
if (first > portCount - 1)
return;
if (last < first)
return;
auto clampedLast = std::min(last, portCount - 1);
for (PortIndex portIndex = first; portIndex <= clampedLast; ++portIndex) {
std::unordered_set<ConnectionId> conns = connections(nodeId, portType, portIndex);
for (auto connectionId : conns) {
deleteConnection(connectionId);
}
}
std::size_t const nRemovedPorts = clampedLast - first + 1;
for (PortIndex portIndex = clampedLast + 1; portIndex < portCount; ++portIndex) {
std::unordered_set<ConnectionId> conns = connections(nodeId, portType, portIndex);
for (auto connectionId : conns) {
// Erases the information about the port on one side;
auto c = makeIncompleteConnectionId(connectionId, portType);
c = makeCompleteConnectionId(c,
nodeId,
portIndex - static_cast<QtNodes::PortIndex>(nRemovedPorts));
_shiftedByDynamicPortsConnections.push_back(c);
deleteConnection(connectionId);
}
}
}
void AbstractGraphModel::portsDeleted()
{
for (auto const connectionId : _shiftedByDynamicPortsConnections) {
addConnection(connectionId);
}
_shiftedByDynamicPortsConnections.clear();
}
void AbstractGraphModel::portsAboutToBeInserted(NodeId const nodeId,
PortType const portType,
PortIndex const first,
PortIndex const last)
{
_shiftedByDynamicPortsConnections.clear();
auto portCountRole = portType == PortType::In ? NodeRole::InPortCount : NodeRole::OutPortCount;
unsigned int portCount = nodeData(nodeId, portCountRole).toUInt();
if (first > portCount)
return;
if (last < first)
return;
std::size_t const nNewPorts = last - first + 1;
for (PortIndex portIndex = first; portIndex < portCount; ++portIndex) {
std::unordered_set<ConnectionId> conns = connections(nodeId, portType, portIndex);
for (auto connectionId : conns) {
// Erases the information about the port on one side;
auto c = makeIncompleteConnectionId(connectionId, portType);
c = makeCompleteConnectionId(c,
nodeId,
portIndex + static_cast<QtNodes::PortIndex>(nNewPorts));
_shiftedByDynamicPortsConnections.push_back(c);
deleteConnection(connectionId);
}
}
}
void AbstractGraphModel::portsInserted()
{
for (auto const connectionId : _shiftedByDynamicPortsConnections) {
addConnection(connectionId);
}
_shiftedByDynamicPortsConnections.clear();
}
} // namespace QtNodes