diff options
author | rtk0c <[email protected]> | 2022-06-27 18:27:13 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-06-27 18:27:13 -0700 |
commit | 8f0dda5eab181b0f14f2652b4e984aaaae3f258c (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /core/src/UI/UI_Workflows.cpp | |
parent | fad6a88a13ab1f888ab25ad0aae19c1d63aa0623 (diff) |
Start from a clean slate
Diffstat (limited to 'core/src/UI/UI_Workflows.cpp')
-rw-r--r-- | core/src/UI/UI_Workflows.cpp | 293 |
1 files changed, 0 insertions, 293 deletions
diff --git a/core/src/UI/UI_Workflows.cpp b/core/src/UI/UI_Workflows.cpp deleted file mode 100644 index c85850a..0000000 --- a/core/src/UI/UI_Workflows.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#include "UI.hpp" - -#include "Model/GlobalStates.hpp" -#include "Model/Project.hpp" -#include "Model/Workflow/Nodes/DocumentNodes.hpp" -#include "Model/Workflow/Nodes/NumericNodes.hpp" -#include "Model/Workflow/Nodes/TextNodes.hpp" -#include "Model/Workflow/Nodes/UserInputNodes.hpp" -#include "Model/Workflow/Workflow.hpp" -#include "Utils/I18n.hpp" -#include "Utils/Macros.hpp" - -#include <IconsFontAwesome.h> -#include <imgui.h> -#include <imgui_node_editor.h> -#include <imgui_stdlib.h> -#include <memory> -#include <span> -#include <vector> - -namespace ImNodes = ax::NodeEditor; - -namespace CPLT_UNITY_ID { -class WorkflowUI -{ -private: - std::unique_ptr<Workflow> mWorkflow; - - ImNodes::EditorContext* mContext; - - ImNodes::NodeId mContextMenuNodeId = 0; - ImNodes::PinId mContextMenuPinId = 0; - ImNodes::LinkId mContextMenuLinkId = 0; - -public: - WorkflowUI(std::unique_ptr<Workflow> workflow) - : mWorkflow{ std::move(workflow) } - { - mContext = ImNodes::CreateEditor(); - } - - ~WorkflowUI() - { - ImNodes::DestroyEditor(mContext); - } - - void Display() - { - ImNodes::SetCurrentEditor(mContext); - ImNodes::Begin(""); - - // Defer creation of tooltip because within the node editor, cursor positioning is going to be off - const char* tooltipMessage = nullptr; - - for (auto& node : mWorkflow->GetNodes()) { - if (!node) continue; - - ImNodes::BeginNode(node->GetId()); - node->Draw(); - ImNodes::EndNode(); - } - - for (auto& conn : mWorkflow->GetConnections()) { - if (!conn.IsValid()) continue; - - auto srcId = mWorkflow->GetNodes()[conn.SourceNode]->GetOutputPinUniqueId(conn.SourcePin); - auto dstId = mWorkflow->GetNodes()[conn.DestinationNode]->GetInputPinUniqueId(conn.DestinationPin); - ImNodes::Link(conn.GetLinkId(), srcId, dstId); - } - - if (ImNodes::BeginCreate()) { - ImNodes::PinId src = 0, dst = 0; - if (ImNodes::QueryNewLink(&src, &dst)) { - if (!src || !dst) { - goto createError; - } - - auto [srcNode, srcPinId, srcIsOutput] = mWorkflow->DisassembleGlobalPinId(src); - auto [dstNode, dstPinId, dstIsOutput] = mWorkflow->DisassembleGlobalPinId(dst); - - if (srcNode == dstNode) { - ImNodes::RejectNewItem(); - goto createError; - } - - if (srcIsOutput == dstIsOutput) { - ImNodes::RejectNewItem(); - goto createError; - } - - auto srcPin = srcNode->GetOutputPin(srcPinId); - auto dstPin = dstNode->GetOutputPin(dstPinId); - - if (srcPin.MatchingType != dstPin.MatchingType) { - ImNodes::RejectNewItem(); - goto createError; - } - - if (ImNodes::AcceptNewItem()) { - mWorkflow->Connect(*srcNode, srcPinId, *dstNode, dstPinId); - } - } - - ImNodes::PinId newNodePin = 0; - if (ImNodes::QueryNewNode(&newNodePin)) { - auto [node, pinId, isOutput] = mWorkflow->DisassembleGlobalPinId(newNodePin); - - if ((isOutput && node->GetOutputPin(pinId).IsConnected()) || - (!isOutput && node->GetInputPin(pinId).IsConnected())) - { - ImNodes::RejectNewItem(); - goto createError; - } - - if (ImNodes::AcceptNewItem()) { - ImNodes::Suspend(); - ImGui::BeginPopup("CreateNodeCtxMenu"); - ImNodes::Resume(); - } - } - } - createError: - ImNodes::EndCreate(); - - if (ImNodes::BeginDelete()) { - ImNodes::LinkId deletedLinkId; - if (ImNodes::QueryDeletedLink(&deletedLinkId)) { - auto& conn = *mWorkflow->GetConnectionByLinkId(deletedLinkId); - mWorkflow->RemoveConnection(conn.Id); - } - - ImNodes::NodeId deletedNodeId; - if (ImNodes::QueryDeletedNode(&deletedNodeId)) { - auto node = mWorkflow->GetNodeByNodeId(deletedNodeId); - if (!node) { - ImNodes::RejectDeletedItem(); - goto deleteError; - } - - if (node->IsLocked()) { - ImNodes::RejectDeletedItem(); - goto deleteError; - } - } - } - deleteError: - ImNodes::EndDelete(); - - // Popups - ImNodes::Suspend(); - if (ImNodes::ShowNodeContextMenu(&mContextMenuNodeId)) { - ImGui::OpenPopup("NodeCtxMenu"); - } else if (ImNodes::ShowPinContextMenu(&mContextMenuPinId)) { - ImGui::OpenPopup("PinCtxMenu"); - } else if (ImNodes::ShowLinkContextMenu(&mContextMenuLinkId)) { - ImGui::OpenPopup("LinkCtxMenu"); - } - - if (ImGui::BeginPopup("NodeCtxMenu")) { - auto& node = *mWorkflow->GetNodeByNodeId(mContextMenuNodeId); - node.DrawDebugInfo(); - - if (ImGui::MenuItem(ICON_FA_TRASH " " I18N_TEXT("Delete", L10N_DELETE))) { - ImNodes::DeleteNode(mContextMenuNodeId); - } - - ImGui::EndPopup(); - } - - if (ImGui::BeginPopup("PinCtxMenu")) { - auto [node, pinId, isOutput] = mWorkflow->DisassembleGlobalPinId(mContextMenuPinId); - if (isOutput) { - node->DrawOutputPinDebugInfo(pinId); - } else { - node->DrawInputPinDebugInfo(pinId); - } - - if (ImGui::MenuItem(ICON_FA_UNLINK " " I18N_TEXT("Disconnect", L10N_DISCONNECT))) { - if (isOutput) { - auto& pin = node->GetOutputPin(pinId); - if (pin.IsConnected()) { - auto linkId = mWorkflow->GetConnectionById(pin.Connection)->GetLinkId(); - ImNodes::DeleteLink(linkId); - } - } else { - auto& pin = node->GetInputPin(pinId); - if (pin.IsConstantConnection()) { - // TODO - } else if (pin.IsConnected()) { - auto linkId = mWorkflow->GetConnectionById(pin.Connection)->GetLinkId(); - ImNodes::DeleteLink(linkId); - } - } - } - - ImGui::EndPopup(); - } - - if (ImGui::BeginPopup("LinkCtxMenu")) { - auto& conn = *mWorkflow->GetConnectionByLinkId(mContextMenuLinkId); - conn.DrawDebugInfo(); - - if (ImGui::MenuItem(ICON_FA_TRASH " " I18N_TEXT("Delete", L10N_DELETE))) { - ImNodes::DeleteLink(mContextMenuLinkId); - } - - ImGui::EndPopup(); - } - - if (ImGui::BeginPopup("CreateNodeCtxMenu")) { - for (int i = WorkflowNode::CG_Numeric; i < WorkflowNode::InvalidCategory; ++i) { - auto category = (WorkflowNode::Category)i; - auto members = WorkflowNode::QueryCategoryMembers(category); - - if (ImGui::BeginMenu(WorkflowNode::FormatCategory(category))) { - for (auto member : members) { - if (ImGui::MenuItem(WorkflowNode::FormatKind(member))) { - // Create node - auto uptr = WorkflowNode::CreateByKind(member); - mWorkflow->AddNode(std::move(uptr)); - } - } - ImGui::EndMenu(); - } - } - ImGui::EndPopup(); - } - - if (tooltipMessage) { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(tooltipMessage); - ImGui::EndTooltip(); - } - ImNodes::Resume(); - - ImNodes::End(); - } - - void Close() - { - // TODO - } -}; -} // namespace CPLT_UNITY_ID - -void UI::WorkflowsTab() -{ - auto& project = *GlobalStates::GetInstance().GetCurrentProject(); - - static std::unique_ptr<CPLT_UNITY_ID::WorkflowUI> openWorkflow; - static AssetList::ListState state; - bool openedDummy = true; - - // Toolbar item: close - if (ImGui::Button(ICON_FA_TIMES " " I18N_TEXT("Close", L10N_CLOSE), openWorkflow == nullptr)) { - openWorkflow->Close(); - openWorkflow = nullptr; - } - - // Toolbar item: open... - ImGui::SameLine(); - if (ImGui::Button((I18N_TEXT("Open asset...", L10N_ASSET_OPEN)))) { - ImGui::OpenPopup(I18N_TEXT("Open asset", L10N_ASSET_OPEN_DIALOG_TITLE)); - } - if (ImGui::BeginPopupModal(I18N_TEXT("Open asset", L10N_ASSET_OPEN_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { - if (ImGui::Button(ICON_FA_FOLDER_OPEN " " I18N_TEXT("Open", L10N_OPEN), state.SelectedAsset == nullptr)) { - ImGui::CloseCurrentPopup(); - - auto workflow = project.Workflows.Load(*state.SelectedAsset); - openWorkflow = std::make_unique<CPLT_UNITY_ID::WorkflowUI>(std::move(workflow)); - } - ImGui::SameLine(); - project.Workflows.DisplayControls(state); - project.Workflows.DisplayDetailsList(state); - - ImGui::EndPopup(); - } - - // Toolbar item: manage... - ImGui::SameLine(); - if (ImGui::Button(I18N_TEXT("Manage assets...", L10N_ASSET_MANAGE))) { - ImGui::OpenPopup(I18N_TEXT("Manage assets", L10N_ASSET_MANAGE_DIALOG_TITLE)); - } - if (ImGui::BeginPopupModal(I18N_TEXT("Manage assets", L10N_ASSET_MANAGE_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { - project.Workflows.DisplayControls(state); - project.Workflows.DisplayDetailsList(state); - ImGui::EndPopup(); - } - - if (openWorkflow) { - openWorkflow->Display(); - } -} |