diff options
-rw-r--r-- | core/locale/zh_CN.json | 5 | ||||
-rw-r--r-- | core/src/Model/Workflow/Nodes/NumericNodes.cpp | 2 | ||||
-rw-r--r-- | core/src/Model/Workflow/Workflow.hpp | 45 | ||||
-rw-r--r-- | core/src/Model/Workflow/Workflow_Main.cpp | 27 | ||||
-rw-r--r-- | core/src/Model/Workflow/Workflow_RTTI.cpp | 2 | ||||
-rw-r--r-- | core/src/UI/Localization.hpp | 8 | ||||
-rw-r--r-- | core/src/UI/UI_Workflows.cpp | 27 |
7 files changed, 74 insertions, 42 deletions
diff --git a/core/locale/zh_CN.json b/core/locale/zh_CN.json index 513ac7a..4c3db9a 100644 --- a/core/locale/zh_CN.json +++ b/core/locale/zh_CN.json @@ -4,6 +4,7 @@ "Generic.Add": "\uf067 新建", "Generic.Edit": "\uf044 编辑", "Generic.Delete": "\uf1f8 删除", + "Generic.Close": "\uf00d 关闭", "Generic.Dialog.Confirm": "确定", "Generic.Dialog.Cancel": "取消", "MainWindow.Tab.Settings": "\uf013 设置", @@ -58,4 +59,8 @@ "Item.Column.Price": "价格", "Item.EmptyNameError": "产品名不能为空", "Item.DuplicateNameError": "产品名已被占用", + "Workflow.Open": "打开工作流...", + "Workflow.Open.DialogTitle": "打开工作流", + "Workflow.Manage": "管理工作流...", + "Workflow.Manage.DialogTitle": "管理工作流", }
\ No newline at end of file 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 GraphUpdate_NoWorkToDo - { - }; - struct GraphUpdate_UnsatisfiedDependencies - { - std::vector<size_t> UnsatisfiedNodes; - }; - struct GraphUpdate_UnreachableNodes - { - std::vector<size_t> UnreachableNodes; - }; + struct Success + { + }; + + struct NoWorkToDo + { + }; + + struct UnsatisfiedDependencies + { + std::vector<size_t> UnsatisfiedNodes; + }; - using GraphUpdateResult = std::variant< - GraphUpdate_Success, - GraphUpdate_NoWorkToDo, - GraphUpdate_UnsatisfiedDependencies, - GraphUpdate_UnreachableNodes>; + struct UnreachableNodes + { + std::vector<size_t> UnreachableNodes; + }; + + using T = std::variant< + Success, + NoWorkToDo, + UnsatisfiedDependencies, + 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<size_t> 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> WorkflowNode::CreateByKind(WorkflowNode::Kind kind case KD_FormInput: return std::make_unique<FormInputNode>(); case KD_DatabaseRowsInput: return std::make_unique<DatabaseRowsInputNode>(); - case InvalidKind: return "<invalid kind>"; + 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<WorkflowUI> 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(); + } } |