imnodes
This commit is contained in:
@@ -43,9 +43,9 @@ void main_window_destroy();
|
||||
void draw_debug_window(ImGuiIO& io, bool* main_loop_wait_for_input);
|
||||
void draw_bg_window();
|
||||
|
||||
void node_editor_open(const char* title);
|
||||
void node_editor_create(const char* title);
|
||||
void draw_node_editor();
|
||||
void node_editor_close();
|
||||
void node_editor_destroy();
|
||||
|
||||
//////////////////////////////////////
|
||||
// Macros //
|
||||
|
||||
@@ -72,7 +72,7 @@ Maybe main_window_open(const char* window_title){
|
||||
io.FontDefault=ImFont_LoadEmbedded(default_font_name, default_font_size);
|
||||
ImFont_LoadEmbedded(font_Cousine_Regular, default_font_size);
|
||||
|
||||
node_editor_open("node editor");
|
||||
node_editor_create("node editor");
|
||||
return MaybeNull;
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ Maybe main_window_close(){
|
||||
}
|
||||
|
||||
void main_window_destroy(){
|
||||
node_editor_close();
|
||||
node_editor_destroy();
|
||||
ImGui_ImplOpenGL3_Shutdown();
|
||||
ImGui_ImplSDL2_Shutdown();
|
||||
ImGui::DestroyContext();
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#include "gui_internal.hpp"
|
||||
#include "../../imgui-node-editor/imgui_node_editor.h"
|
||||
namespace NE = ax::NodeEditor;
|
||||
|
||||
NE::EditorContext* editor_context=nullptr;
|
||||
const char* editor_title;
|
||||
|
||||
void draw_example_node();
|
||||
|
||||
|
||||
void node_editor_open(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_close(){
|
||||
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();
|
||||
ImVec2 node_pos=NE::GetNodePosition(node_id_next-1);
|
||||
NE::SetNodePosition(node_id_next, ImVec2Add(node_pos, ImVec2(50, 20)));
|
||||
draw_example_node();
|
||||
NE::End();
|
||||
NE::SetCurrentEditor(nullptr);
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void draw_example_node(){
|
||||
NE::BeginNode(node_id_next++);
|
||||
ImGui::Text("Node A");
|
||||
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();
|
||||
}
|
||||
117
src/gui/node_editor.cpp_
Normal file
117
src/gui/node_editor.cpp_
Normal file
@@ -0,0 +1,117 @@
|
||||
#include "gui_internal.hpp"
|
||||
#include "../../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();
|
||||
}
|
||||
81
src/gui/node_editor2.cpp
Normal file
81
src/gui/node_editor2.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "gui_internal.hpp"
|
||||
#include "../../imnodes/imnodes.h"
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
struct Link {
|
||||
int id;
|
||||
int in_attr_id;
|
||||
int out_attr_id;
|
||||
};
|
||||
|
||||
const char* editor_title=nullptr;
|
||||
bool editor_open=false;
|
||||
ImNodesContext* editor_context=nullptr;
|
||||
int next_id=1;
|
||||
std::vector<Link> links;
|
||||
|
||||
void node_editor_create(const char* title){
|
||||
editor_title=title;
|
||||
editor_open=true;
|
||||
editor_context=ImNodes::CreateContext();
|
||||
ImNodes::StyleColorsDark();
|
||||
links=std::vector<Link>();
|
||||
}
|
||||
|
||||
void node_editor_destroy(){
|
||||
editor_open=false;
|
||||
ImNodes::DestroyContext(editor_context);
|
||||
links.clear();
|
||||
}
|
||||
|
||||
void draw_example_node(const char* node_title){
|
||||
ImNodes::BeginNode(next_id++);
|
||||
ImNodes::BeginNodeTitleBar();
|
||||
ImGui::TextUnformatted(node_title);
|
||||
ImNodes::EndNodeTitleBar();
|
||||
ImNodes::BeginInputAttribute(next_id++);
|
||||
ImGui::Text("input");
|
||||
ImNodes::EndInputAttribute();
|
||||
ImNodes::BeginOutputAttribute(next_id++);
|
||||
ImGui::Indent(40);
|
||||
ImGui::Text("output");
|
||||
ImNodes::EndOutputAttribute();
|
||||
ImNodes::EndNode();
|
||||
}
|
||||
|
||||
void draw_node_editor(){
|
||||
if(!editor_open)
|
||||
return;
|
||||
next_id=1;
|
||||
ImGui::Begin(editor_title, &editor_open);
|
||||
ImGui::SetWindowSizeMin(300,300);
|
||||
ImNodes::BeginNodeEditor();
|
||||
draw_example_node("node A");
|
||||
draw_example_node("node B");
|
||||
for(const Link& link : links){
|
||||
|
||||
}
|
||||
ImNodes::EndNodeEditor();
|
||||
|
||||
Link link;
|
||||
if (ImNodes::IsLinkCreated(&link.in_attr_id, &link.out_attr_id))
|
||||
{
|
||||
link.id=next_id++;
|
||||
links.push_back(link);
|
||||
}
|
||||
|
||||
|
||||
int link_id;
|
||||
if (ImNodes::IsLinkDestroyed(&link_id))
|
||||
{
|
||||
auto iter = std::find_if(links.begin(), links.end(),
|
||||
[link_id](const Link& link) -> bool {
|
||||
return link.id == link_id;
|
||||
});
|
||||
assert(iter != links.end());
|
||||
links.erase(iter);
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
Reference in New Issue
Block a user