Skip to content

Commit 950eb21

Browse files
committed
Create CMakeLists.txt and Updated Canvas Clipping added drgdropTraget to grid
1 parent 9eb4094 commit 950eb21

4 files changed

Lines changed: 68 additions & 9 deletions

File tree

CMakeLists.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
3+
set(TARGET_NAME ImNodeFlow)
4+
find_package(imgui CONFIG REQUIRED)
5+
6+
set(IMNODEFLOW_SOURCES
7+
${CMAKE_CURRENT_SOURCE_DIR}/src/ImNodeFlow.cpp
8+
)
9+
10+
add_library(${TARGET_NAME} STATIC ${IMNODEFLOW_SOURCES})
11+
add_library(${TARGET_NAME}::${TARGET_NAME} ALIAS ${TARGET_NAME})
12+
13+
target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
14+
target_link_libraries(${TARGET_NAME} PUBLIC imgui)
15+
target_compile_definitions(${TARGET_NAME} PUBLIC _CRT_SECURE_NO_WARNINGS PUBLIC IMGUI_DEFINE_MATH_OPERATORS)

include/ImNodeFlow.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ namespace ImFlow
310310
template<typename T, typename... Params>
311311
std::shared_ptr<T> addNode(const ImVec2& pos, Params&&... args);
312312

313+
void addNode(const ImVec2& pos, const std::shared_ptr<BaseNode>& node);
314+
313315
private:
314316
/**
315317
* @brief <BR>Helper struct for creating a node struct from a lambda
@@ -385,6 +387,13 @@ namespace ImFlow
385387
*/
386388
void rightClickPopUpContent(std::function<void(BaseNode* node)> content) { m_rightClickPopUp = std::move(content); }
387389

390+
/**
391+
* @brief <BR>Pop-up when drag_dropping
392+
* @details Sets the node pos when drag dropping a node to the grid
393+
* @param content Function or Lambda containing only the pos of the mouse when clicked
394+
*/
395+
void dragDropTarget(std::function<void(const ImVec2 &)> content) { m_dragdropTarget = std::move(content); }
396+
388397
/**
389398
* @brief <BR>Get mouse clicking status
390399
* @return [TRUE] if mouse is clicked and click hasn't been consumed
@@ -522,6 +531,7 @@ namespace ImFlow
522531
ImGuiKey m_droppedLinkPupUpComboKey = ImGuiKey_None;
523532
Pin* m_droppedLinkLeft = nullptr;
524533
std::function<void(BaseNode* node)> m_rightClickPopUp;
534+
std::function<void(const ImVec2 &)> m_dragdropTarget;
525535
BaseNode* m_hoveredNodeAux = nullptr;
526536

527537
BaseNode* m_hoveredNode = nullptr;

src/ImNodeFlow.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,18 @@ namespace ImFlow {
239239
m_links.push_back(link);
240240
}
241241

242+
void ImNodeFlow::addNode(const ImVec2& pos, const std::shared_ptr<BaseNode>& n)
243+
{
244+
n->setPos(pos);
245+
n->setHandler(this);
246+
if (!n->getStyle())
247+
n->setStyle(NodeStyle::cyan());
248+
249+
auto uid = reinterpret_cast<uintptr_t>(n.get());
250+
n->setUID(uid);
251+
m_nodes[uid] = n;
252+
}
253+
242254
void ImNodeFlow::update() {
243255
// Updating looping stuff
244256
m_hovering = nullptr;
@@ -335,5 +347,13 @@ namespace ImFlow {
335347
m_pinRecursionBlacklist.clear();
336348

337349
m_context.end();
350+
351+
if (ImGui::BeginDragDropTarget())
352+
{
353+
if (m_dragdropTarget)
354+
m_dragdropTarget(screen2grid(ImGui::GetMousePos()));
355+
356+
ImGui::EndDragDropTarget();
357+
}
338358
}
339359
}

src/context_wrapper.h

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ inline void ContainedContext::setFontDensity()
112112

113113
inline void ContainedContext::begin()
114114
{
115+
auto window = ImGui::GetCurrentWindow();
116+
115117
ImGui::PushID(this);
116118
ImGui::PushStyleColor(ImGuiCol_ChildBg, m_config.color);
117119
ImGui::BeginChild("view_port", m_config.size, 0, ImGuiWindowFlags_NoMove);
@@ -143,19 +145,31 @@ inline void ContainedContext::begin()
143145

144146
ImGui::NewFrame();
145147

146-
if (!m_config.extra_window_wrapper)
147-
return;
148-
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Appearing);
149-
ImGui::SetNextWindowSize(ImGui::GetMainViewport()->WorkSize);
150-
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
151-
ImGui::Begin("viewport_container", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoMove
152-
| ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
153-
setFontDensity();
154-
ImGui::PopStyleVar();
148+
if (m_config.extra_window_wrapper)
149+
{
150+
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Appearing);
151+
ImGui::SetNextWindowSize(ImGui::GetMainViewport()->WorkSize);
152+
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
153+
ImGui::Begin("viewport_container", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoMove
154+
| ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
155+
setFontDensity();
156+
ImGui::PopStyleVar();
157+
}
158+
159+
160+
auto clip_rect = window->ClipRect;
161+
ImVec2 canvas_p0 = clip_rect.Min;
162+
ImVec2 canvas_p1 = clip_rect.Max;
163+
canvas_p0 = (canvas_p0 - m_origin) / m_scale;
164+
canvas_p1 = (canvas_p1 - m_origin) / m_scale;
165+
166+
ImGui::PushClipRect(canvas_p0, canvas_p1, false);
155167
}
156168

157169
inline void ContainedContext::end()
158170
{
171+
ImGui::PopClipRect();
172+
159173
m_anyWindowHovered = ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow);
160174
if (m_config.extra_window_wrapper && ImGui::IsWindowHovered())
161175
m_anyWindowHovered = false;

0 commit comments

Comments
 (0)