From 80d8ae5a6fef6c9a34e81e240539cb655dd99851 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Wed, 14 Apr 2021 15:09:13 -0700 Subject: Initial work on workflows --- core/src/Model/Workflow.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 core/src/Model/Workflow.cpp (limited to 'core/src/Model/Workflow.cpp') 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; +} -- cgit v1.2.3-70-g09d2