From a96761a29e9ff67b1756020f87deabc79f635b79 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 9 May 2021 16:37:42 -0700 Subject: Work on workflow module --- core/src/Model/Workflow/Nodes/NumericNodes.cpp | 2 ++ core/src/Model/Workflow/Workflow.hpp | 45 ++++++++++++++------------ core/src/Model/Workflow/Workflow_Main.cpp | 27 ++++------------ core/src/Model/Workflow/Workflow_RTTI.cpp | 2 +- core/src/UI/Localization.hpp | 8 +++++ core/src/UI/UI_Workflows.cpp | 27 +++++++++++++++- 6 files changed, 69 insertions(+), 42 deletions(-) (limited to 'core/src') diff --git a/core/src/Model/Workflow/Nodes/NumericNodes.cpp b/core/src/Model/Workflow/Nodes/NumericNodes.cpp index 7893377..083172e 100644 --- a/core/src/Model/Workflow/Nodes/NumericNodes.cpp +++ b/core/src/Model/Workflow/Nodes/NumericNodes.cpp @@ -15,6 +15,7 @@ WorkflowNode::Kind NumericOperationNode::OperationTypeToNodeKind(OperationType t case Subtraction: return KD_NumericSubtraction; case Multiplication: return KD_NumericMultiplication; case Division: return KD_NumericDivision; + default: return InvalidKind; } } @@ -25,6 +26,7 @@ NumericOperationNode::OperationType NumericOperationNode::NodeKindToOperationTyp case KD_NumericSubtraction: return Subtraction; case KD_NumericMultiplication: return Multiplication; case KD_NumericDivision: return Division; + default: return InvalidType; } } diff --git a/core/src/Model/Workflow/Workflow.hpp b/core/src/Model/Workflow/Workflow.hpp index f26fff9..cf3e2f9 100644 --- a/core/src/Model/Workflow/Workflow.hpp +++ b/core/src/Model/Workflow/Workflow.hpp @@ -217,29 +217,34 @@ public: /* Graph rebuild */ - struct GraphUpdate_Success + struct GraphUpdateResult { + struct Success + { + }; + + struct NoWorkToDo + { + }; + + struct UnsatisfiedDependencies + { + std::vector UnsatisfiedNodes; + }; + + struct UnreachableNodes + { + std::vector UnreachableNodes; + }; + + using T = std::variant< + Success, + NoWorkToDo, + UnsatisfiedDependencies, + UnreachableNodes>; }; - struct GraphUpdate_NoWorkToDo - { - }; - struct GraphUpdate_UnsatisfiedDependencies - { - std::vector UnsatisfiedNodes; - }; - struct GraphUpdate_UnreachableNodes - { - std::vector UnreachableNodes; - }; - - using GraphUpdateResult = std::variant< - GraphUpdate_Success, - GraphUpdate_NoWorkToDo, - GraphUpdate_UnsatisfiedDependencies, - GraphUpdate_UnreachableNodes>; - /// When `getInfo == false, the corresponding error code is returned but without/with empty payloads. - GraphUpdateResult UpdateGraph(bool getInfo = true); + GraphUpdateResult::T UpdateGraph(); /* Serialization */ diff --git a/core/src/Model/Workflow/Workflow_Main.cpp b/core/src/Model/Workflow/Workflow_Main.cpp index c3e3791..a108dc7 100644 --- a/core/src/Model/Workflow/Workflow_Main.cpp +++ b/core/src/Model/Workflow/Workflow_Main.cpp @@ -631,10 +631,10 @@ bool Workflow::DisconnectByDestination(WorkflowNode& destinationNode, int destin return true; } -Workflow::GraphUpdateResult Workflow::UpdateGraph(bool getInfo) +Workflow::GraphUpdateResult::T Workflow::UpdateGraph() { if (!mDepthsDirty) { - return GraphUpdate_NoWorkToDo{}; + return GraphUpdateResult::NoWorkToDo{}; } // Terminology: @@ -672,7 +672,7 @@ Workflow::GraphUpdateResult Workflow::UpdateGraph(bool getInfo) if (!node) continue; if (!CheckNodeDependencies(*node)) { - if (getInfo) unsatisfiedNodes.push_back(i); + unsatisfiedNodes.push_back(i); } node->mDepth = -1; @@ -684,15 +684,10 @@ Workflow::GraphUpdateResult Workflow::UpdateGraph(bool getInfo) } if (!unsatisfiedNodes.empty()) { - return GraphUpdate_UnsatisfiedDependencies{ std::move(unsatisfiedNodes) }; + return GraphUpdateResult::UnsatisfiedDependencies{ std::move(unsatisfiedNodes) }; } } - auto HasCyclicReference = [&](WorkflowNode& node) -> bool { - // TODO - return false; - }; - auto ProcessNode = [&](WorkflowNode& node) -> void { for (auto& pin : node.mOutputs) { if (!pin.IsConnected()) continue; @@ -702,11 +697,6 @@ Workflow::GraphUpdateResult Workflow::UpdateGraph(bool getInfo) auto& wn = workingNodes[point.Node]; auto& n = *mNodes[point.Node].get(); - if (HasCyclicReference(n)) { - // TODO - break; - } - wn.FulfilledInputCount++; wn.MaximumDepth = std::max(node.mDepth, wn.MaximumDepth); @@ -730,10 +720,7 @@ Workflow::GraphUpdateResult Workflow::UpdateGraph(bool getInfo) } if (processedNodes < mNodes.size()) { - // There is unreachable nodes - if (!getInfo) { - return GraphUpdate_UnreachableNodes{}; - } + // There is unreachable nodes, collect them and report to the caller std::vector unreachableNodes; for (size_t i = 0; i < mNodes.size(); ++i) { @@ -746,10 +733,10 @@ Workflow::GraphUpdateResult Workflow::UpdateGraph(bool getInfo) unreachableNodes.push_back(i); } - return GraphUpdate_UnreachableNodes{ std::move(unreachableNodes) }; + return GraphUpdateResult::UnreachableNodes{ std::move(unreachableNodes) }; } - return GraphUpdate_Success{}; + return GraphUpdateResult::Success{}; } Workflow::ReadResult Workflow::ReadFrom(std::istream& stream) diff --git a/core/src/Model/Workflow/Workflow_RTTI.cpp b/core/src/Model/Workflow/Workflow_RTTI.cpp index c16b8d1..34347b1 100644 --- a/core/src/Model/Workflow/Workflow_RTTI.cpp +++ b/core/src/Model/Workflow/Workflow_RTTI.cpp @@ -48,6 +48,6 @@ std::unique_ptr WorkflowNode::CreateByKind(WorkflowNode::Kind kind case KD_FormInput: return std::make_unique(); case KD_DatabaseRowsInput: return std::make_unique(); - case InvalidKind: return ""; + case InvalidKind: return nullptr; } } diff --git a/core/src/UI/Localization.hpp b/core/src/UI/Localization.hpp index 46cf740..65fcdfd 100644 --- a/core/src/UI/Localization.hpp +++ b/core/src/UI/Localization.hpp @@ -19,6 +19,7 @@ public: BasicTranslation Add{ "Generic.Add"sv }; BasicTranslation Edit{ "Generic.Edit"sv }; BasicTranslation Delete{ "Generic.Delete"sv }; + BasicTranslation Close{ "Generic.Close"sv }; BasicTranslation DialogConfirm{ "Generic.Dialog.Confirm"sv }; BasicTranslation DialogCancel{ "Generic.Dialog.Cancel"sv }; @@ -100,4 +101,11 @@ public: BasicTranslation EmptyItemNameError{ "Item.EmptyNameError"sv }; BasicTranslation DuplicateItemNameError{ "Item.DuplicateNameError"sv }; + + /* Workflow tab */ + + BasicTranslation OpenWorkflow{ "Workflow.Open"sv }; + BasicTranslation OpenWorkflowDialogTitle{ "Workflow.Open.DialogTitle"sv }; + BasicTranslation ManageWorkflows{ "Workflow.Manage"sv }; + BasicTranslation ManageWorkflowsDialogTitle{ "Workflow.Manage.DialogTitle"sv }; }; diff --git a/core/src/UI/UI_Workflows.cpp b/core/src/UI/UI_Workflows.cpp index 108410c..f9857a1 100644 --- a/core/src/UI/UI_Workflows.cpp +++ b/core/src/UI/UI_Workflows.cpp @@ -178,6 +178,31 @@ public: void UI::WorkflowsTab() { + auto ls = LocaleStrings::Instance.get(); + static std::unique_ptr openWorkflow; - // TODO + + if (ImGui::Button(ls->Close.Get(), openWorkflow == nullptr)) { + openWorkflow = nullptr; + } + ImGui::SameLine(); + if (ImGui::Button(ls->OpenWorkflow.Get())) { + ImGui::OpenPopup(ls->OpenWorkflowDialogTitle.Get()); + } + if (ImGui::BeginPopupModal(ls->OpenWorkflowDialogTitle.Get())) { + // TODO + ImGui::EndPopup(); + } + ImGui::SameLine(); + if (ImGui::Button(ls->ManageWorkflows.Get())) { + ImGui::OpenPopup(ls->ManageWorkflowsDialogTitle.Get()); + } + if (ImGui::BeginPopupModal(ls->ManageWorkflowsDialogTitle.Get())) { + // TODO + ImGui::EndPopup(); + } + + if (openWorkflow) { + openWorkflow->Draw(); + } } -- cgit v1.2.3-70-g09d2