#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; }