Skip to content

Commit

Permalink
Structure node editor code.
Browse files Browse the repository at this point in the history
  • Loading branch information
linuscu committed Sep 29, 2024
1 parent 4f4dd96 commit 3e2f594
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 92 deletions.
96 changes: 4 additions & 92 deletions packages/rendering/include/rendering/ui/UINodeEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,104 +19,18 @@ namespace l::ui {
class UINodeEditor : public UIBase {
public:
UINodeEditor(std::string_view editorName) : mUIWindow(editorName), mLinkIOVisitor(mUIManager), mSelectVisitor(mUIManager) {
mUIRoot = CreateContainer(mUIManager, l::ui::UIContainer_DragFlag | l::ui::UIContainer_ZoomFlag);

mUIWindow.SetContentWindow([&]() {
ImGui::PushItemWidth(400);

UIUpdate updateVisitor;
mDrawVisitor.SetDrawList(ImGui::GetWindowDrawList());
mUIRoot->SetLayoutSize(mUIWindow.GetSize());
mUIRoot->SetLayoutPosition(mUIWindow.GetPosition());
mUIRoot->Accept(updateVisitor, mUIInput, l::ui::UITraversalMode::BFS);
mUIRoot->Accept(mDrawVisitor, mUIInput, l::ui::UITraversalMode::BFS);

ImGui::PopItemWidth();

});

mUIWindow.SetPointerPopup([&]() {
ImGui::Text("Node picker");
ImGui::Separator();

if (mNGSchema == nullptr) {
return;
}

mNGSchema->ForEachNodeType([&](std::string_view typeName, const std::vector<l::nodegraph::UINodeDesc>& types) {
if (typeName.empty() || ImGui::TreeNode(typeName.data())) {
for (auto& it : types) {
if (ImGui::MenuItem(it.GetName().data())) {
ImVec2 p = ImVec2(mUIInput.mCurPos.x - mUIWindow.GetPosition().x, mUIInput.mCurPos.y - mUIWindow.GetPosition().y);
p.x -= mUIRoot->GetPosition().x;
p.y -= mUIRoot->GetPosition().y;
p.x /= mUIRoot->GetScale();
p.y /= mUIRoot->GetScale();
p.x -= 3.0f;
p.y -= 3.0f;
auto nodeId = mNGSchema->NewNode(it.GetId());
auto node = mNGSchema->GetNode(nodeId);
if (node != nullptr) {
auto uiNode = l::ui::CreateUINode(mUIManager, *node, p);
mUIRoot->Add(uiNode);
}
}
}
if (!typeName.empty()) {
ImGui::TreePop();
}
}
});
});
Init();
}

~UINodeEditor() = default;

void Init();
void Show() override;
bool IsShowing() override;
void Open();
void Close();

void SetNGSchema(l::nodegraph::NodeGraphSchema* ngSchema) {
mNGSchema = ngSchema;
mDrawVisitor.SetNGSchema(ngSchema);
mLinkIOVisitor.SetNGSchema(ngSchema);
mSelectVisitor.SetNGSchema(ngSchema);
mEditVisitor.SetNGSchema(ngSchema);
}

void Update() {

if (mUIWindow.IsShowing()) {
ImGuiIO& io = ImGui::GetIO();
io.ConfigWindowsMoveFromTitleBarOnly = true;

mUIInput.mCurPos = io.MousePos;
mUIInput.mPrevPos = io.MousePosPrev;
mUIInput.mScroll = io.MouseWheel;
mUIInput.mStarted = ImGui::IsMouseClicked(ImGuiMouseButton_Left);
mUIInput.mStopped = ImGui::IsMouseReleased(ImGuiMouseButton_Left);

if (mUIWindow.IsHovered()) {
if (mUIRoot->Accept(mLinkIOVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mEditVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mSelectVisitor, mUIInput, l::ui::UITraversalMode::BFS)) {
}
else if (mUIRoot->Accept(mResizeVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mMoveVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mZoomVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mDragVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
}
}
}


void SetNGSchema(l::nodegraph::NodeGraphSchema* ngSchema);
void Update();
protected:
UIWindow mUIWindow;
UIManager mUIManager;
Expand All @@ -133,7 +47,5 @@ namespace l::ui {
UIMove mMoveVisitor;
UIResize mResizeVisitor;
UIEdit mEditVisitor;

};

}
94 changes: 94 additions & 0 deletions packages/rendering/source/common/ui/UINodeEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,59 @@
#include <memory>

namespace l::ui {

void UINodeEditor::Init() {
mUIRoot = CreateContainer(mUIManager, l::ui::UIContainer_DragFlag | l::ui::UIContainer_ZoomFlag);

mUIWindow.SetContentWindow([&]() {
ImGui::PushItemWidth(400);

UIUpdate updateVisitor;
mDrawVisitor.SetDrawList(ImGui::GetWindowDrawList());
mUIRoot->SetLayoutSize(mUIWindow.GetSize());
mUIRoot->SetLayoutPosition(mUIWindow.GetPosition());
mUIRoot->Accept(updateVisitor, mUIInput, l::ui::UITraversalMode::BFS);
mUIRoot->Accept(mDrawVisitor, mUIInput, l::ui::UITraversalMode::BFS);

ImGui::PopItemWidth();

});

mUIWindow.SetPointerPopup([&]() {
ImGui::Text("Node picker");
ImGui::Separator();

if (mNGSchema == nullptr) {
return;
}

mNGSchema->ForEachNodeType([&](std::string_view typeName, const std::vector<l::nodegraph::UINodeDesc>& types) {
if (typeName.empty() || ImGui::TreeNode(typeName.data())) {
for (auto& it : types) {
if (ImGui::MenuItem(it.GetName().data())) {
ImVec2 p = ImVec2(mUIInput.mCurPos.x - mUIWindow.GetPosition().x, mUIInput.mCurPos.y - mUIWindow.GetPosition().y);
p.x -= mUIRoot->GetPosition().x;
p.y -= mUIRoot->GetPosition().y;
p.x /= mUIRoot->GetScale();
p.y /= mUIRoot->GetScale();
p.x -= 3.0f;
p.y -= 3.0f;
auto nodeId = mNGSchema->NewNode(it.GetId());
auto node = mNGSchema->GetNode(nodeId);
if (node != nullptr) {
auto uiNode = l::ui::CreateUINode(mUIManager, *node, p);
mUIRoot->Add(uiNode);
}
}
}
if (!typeName.empty()) {
ImGui::TreePop();
}
}
});
});
}

bool UINodeEditor::IsShowing() {
return mUIWindow.IsShowing();
}
Expand All @@ -18,4 +71,45 @@ namespace l::ui {
void UINodeEditor::Close() {
mUIWindow.Close();
}

void UINodeEditor::SetNGSchema(l::nodegraph::NodeGraphSchema* ngSchema) {
mNGSchema = ngSchema;
mDrawVisitor.SetNGSchema(ngSchema);
mLinkIOVisitor.SetNGSchema(ngSchema);
mSelectVisitor.SetNGSchema(ngSchema);
mEditVisitor.SetNGSchema(ngSchema);
}

void UINodeEditor::Update() {

if (mUIWindow.IsShowing()) {
ImGuiIO& io = ImGui::GetIO();
io.ConfigWindowsMoveFromTitleBarOnly = true;

mUIInput.mPrevPos.x = mUIInput.mCurPos.x;
mUIInput.mPrevPos.y = mUIInput.mCurPos.y;
mUIInput.mCurPos = io.MousePos;
mUIInput.mScroll = io.MouseWheel;
mUIInput.mStarted = ImGui::IsMouseClicked(ImGuiMouseButton_Left);
mUIInput.mStopped = ImGui::IsMouseReleased(ImGuiMouseButton_Left);

if (mUIWindow.IsHovered()) {
if (mUIRoot->Accept(mLinkIOVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mEditVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mSelectVisitor, mUIInput, l::ui::UITraversalMode::BFS)) {
}
else if (mUIRoot->Accept(mResizeVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mMoveVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mZoomVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
else if (mUIRoot->Accept(mDragVisitor, mUIInput, l::ui::UITraversalMode::DFS)) {
}
}
}
}

}

0 comments on commit 3e2f594

Please sign in to comment.