aboutsummaryrefslogtreecommitdiff
path: root/core/src/Model/Workflow.cpp
blob: 96031c108ec0a1fd8f81f97669860254545402ad (plain)
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;
}