aboutsummaryrefslogtreecommitdiff
path: root/core/src/Model/Workflow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Model/Workflow.cpp')
-rw-r--r--core/src/Model/Workflow.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/core/src/Model/Workflow.cpp b/core/src/Model/Workflow.cpp
new file mode 100644
index 0000000..96031c1
--- /dev/null
+++ b/core/src/Model/Workflow.cpp
@@ -0,0 +1,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;
+}