aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/locale/zh_CN.json5
-rw-r--r--core/src/Model/Workflow/Nodes/NumericNodes.cpp2
-rw-r--r--core/src/Model/Workflow/Workflow.hpp45
-rw-r--r--core/src/Model/Workflow/Workflow_Main.cpp27
-rw-r--r--core/src/Model/Workflow/Workflow_RTTI.cpp2
-rw-r--r--core/src/UI/Localization.hpp8
-rw-r--r--core/src/UI/UI_Workflows.cpp27
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();
+ }
}