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
|
#include "Workflow.hpp"
bool WorkflowStep::InputNode::IsConnected() const {
return ConnectedNodeIndex != -1;
}
bool WorkflowStep::OutputNode::IsConnected() const {
return ConnectedNodeIndex != -1;
}
size_t WorkflowStep::GetId() const {
return mId;
}
void WorkflowStep::ConnectInput(int nodeId, size_t outputId, int outputNodeId) {
mWorkflow->Connect(mId, nodeId, outputId, outputNodeId);
}
void WorkflowStep::DisconnectInput(int nodeId) {
mWorkflow->DisconnectByDestination(mId, nodeId);
}
bool WorkflowStep::IsInputConnected(int nodeId) const {
return mInputs[nodeId].IsConnected();
}
void WorkflowStep::ConnectOutput(int nodeId, size_t inputId, int inputNodeId) {
mWorkflow->Connect(inputId, inputNodeId, mId, nodeId);
}
void WorkflowStep::DisconnectOutput(int nodeId) {
mWorkflow->DisconnectBySource(mId, nodeId);
}
bool WorkflowStep::IsOutputConnected(int nodeId) const {
return mOutputs[nodeId].IsConnected();
}
WorkflowConnection* Workflow::GetConnectionById(size_t id) {
return &mConnections[id];
}
WorkflowStep* Workflow::GetStepById(size_t id) {
return mSteps[id].get();
}
void WorkflowStep::OnIOAboutToChange() {
// TODO more robust solution that handles changes incrementally
for (size_t i = 0; i < mInputs.size(); ++i) {
DisconnectInput(i);
}
for (size_t i = 0; i < mOutputs.size(); ++i) {
DisconnectOutput(i);
}
}
void WorkflowStep::OnIOChanged() {
}
void Workflow::Connect(size_t source, int sourceNode, size_t destination, int destinationNode) {
auto& src = *mSteps[source];
auto& o = src.mInputs[sourceNode];
if (o.IsConnected()) {
DisconnectBySource(source, sourceNode);
}
o.ConnectedStep = destination;
o.ConnectedNodeIndex = destinationNode;
auto& dst = *mSteps[destination];
auto& i = dst.mInputs[destinationNode];
i.ConnectedStep = source;
i.ConnectedNodeIndex = sourceNode;
}
void Workflow::DisconnectBySource(size_t source, int sourceNode) {
auto& src = *mSteps[source];
auto& o = src.mOutputs[sourceNode];
if (!o.IsConnected()) return;
auto& i = mSteps[o.ConnectedStep]->mInputs[o.ConnectedNodeIndex];
i.ConnectedStep = WorkflowStep::kInvalidId;
i.ConnectedNodeIndex = -1;
o.ConnectedStep = WorkflowStep::kInvalidId;
o.ConnectedNodeIndex = -1;
}
void Workflow::DisconnectByDestination(size_t destination, int destinationNode) {
auto& dst = *mSteps[destination];
auto& i = dst.mInputs[destinationNode];
if (!i.IsConnected()) return;
auto& o = mSteps[i.ConnectedStep]->mOutputs[i.ConnectedNodeIndex];
i.ConnectedStep = WorkflowStep::kInvalidId;
i.ConnectedNodeIndex = -1;
o.ConnectedStep = WorkflowStep::kInvalidId;
o.ConnectedNodeIndex = -1;
}
|