118 lines
4.2 KiB
Plaintext
118 lines
4.2 KiB
Plaintext
#include "gui_internal.hpp"
|
|
#include "../../dependencies/imgui_node_editor/imgui_node_editor.h"
|
|
namespace NE = ax::NodeEditor;
|
|
|
|
NE::EditorContext* editor_context=nullptr;
|
|
const char* editor_title;
|
|
|
|
void draw_example_node(const char* title);
|
|
|
|
|
|
void node_editor_create(const char* title){
|
|
NE::Config config;
|
|
config.SettingsFile = "node_editor.json";
|
|
editor_context=NE::CreateEditor(&config);
|
|
editor_title=title;
|
|
//NE::Style& style=NE::GetStyle();
|
|
}
|
|
|
|
void node_editor_destroy(){
|
|
NE::DestroyEditor(editor_context);
|
|
editor_context=nullptr;
|
|
}
|
|
|
|
u32 node_id_next;
|
|
u32 pin_id_next;
|
|
u32 link_id_next;
|
|
|
|
void draw_node_editor(){
|
|
if(editor_context==nullptr)
|
|
return;
|
|
|
|
node_id_next=0;
|
|
pin_id_next=0;
|
|
link_id_next=0;
|
|
ImGui::Begin(editor_title);
|
|
ImGui::SetWindowSizeMin(300,300);
|
|
NE::SetCurrentEditor(editor_context);
|
|
NE::Begin(editor_title);
|
|
// Start drawing nodes.
|
|
draw_example_node("node A");
|
|
// ImVec2 node_pos=NE::GetNodePosition(node_id_next-1);
|
|
// NE::SetNodePosition(node_id_next, ImVec2Add(node_pos, ImVec2(50, 20)));
|
|
draw_example_node("node B");
|
|
|
|
|
|
// Handle creation action, returns true if editor want to create new object (node or link)
|
|
if (NE::BeginCreate())
|
|
{
|
|
NE::PinId inputPinId, outputPinId;
|
|
if (NE::QueryNewLink(&inputPinId, &outputPinId))
|
|
{
|
|
// QueryNewLink returns true if editor want to create new link between pins.
|
|
//
|
|
// Link can be created only for two valid pins, it is up to you to
|
|
// validate if connection make sense. Editor is happy to make any.
|
|
//
|
|
// Link always goes from input to output. User may choose to drag
|
|
// link from output pin or input pin. This determine which pin ids
|
|
// are valid and which are not:
|
|
// * input valid, output invalid - user started to drag new ling from input pin
|
|
// * input invalid, output valid - user started to drag new ling from output pin
|
|
// * input valid, output valid - user dragged link over other pin, can be validated
|
|
|
|
if (inputPinId && outputPinId) // both are valid, let's accept link
|
|
{
|
|
// NE::AcceptNewItem() return true when user release mouse button.
|
|
if (NE::AcceptNewItem())
|
|
{
|
|
// Draw new link.
|
|
NE::Link(link_id_next++, inputPinId, outputPinId);
|
|
}
|
|
|
|
// You may choose to reject connection between these nodes
|
|
// by calling NE::RejectNewItem(). This will allow editor to give
|
|
// visual feedback by changing link thickness and color.
|
|
}
|
|
}
|
|
}
|
|
NE::EndCreate(); // Wraps up object creation action handling.
|
|
|
|
|
|
// Handle deletion action
|
|
if (NE::BeginDelete())
|
|
{
|
|
// There may be many links marked for deletion, let's loop over them.
|
|
NE::LinkId deletedLinkId;
|
|
while (NE::QueryDeletedLink(&deletedLinkId))
|
|
{
|
|
// If you agree that link can be deleted, accept deletion.
|
|
if (NE::AcceptDeletedItem())
|
|
{
|
|
}
|
|
|
|
// You may reject link deletion by calling:
|
|
// NE::RejectDeletedItem();
|
|
}
|
|
}
|
|
NE::EndDelete(); // Wrap up deletion action
|
|
|
|
|
|
NE::End();
|
|
NE::SetCurrentEditor(nullptr);
|
|
ImGui::End();
|
|
}
|
|
|
|
void draw_example_node(const char* title){
|
|
NE::BeginNode(node_id_next++);
|
|
ImGui::Text(title);
|
|
NE::BeginPin(pin_id_next++, NE::PinKind::Input);
|
|
ImGui::Text("-> In");
|
|
NE::EndPin();
|
|
ImGui::SameLine();
|
|
NE::BeginPin(pin_id_next++, NE::PinKind::Output);
|
|
ImGui::Text("Out ->");
|
|
NE::EndPin();
|
|
NE::EndNode();
|
|
}
|