From 8b178424fcf7c452a7b5c14fb90b02487615ff70 Mon Sep 17 00:00:00 2001 From: Pascal Thomet Date: Thu, 10 Oct 2024 11:24:21 +0200 Subject: [PATCH] [Bundle] : call ImGuiContextHookType_Begin/EndWindow cf https://github.com/thedmd/imgui-node-editor/issues/242#issuecomment-1681806764 This helps fixing issues in popup positionning inside the node editor --- imgui_canvas.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ imgui_canvas.h | 7 +++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/imgui_canvas.cpp b/imgui_canvas.cpp index 8978eafd..a2296194 100644 --- a/imgui_canvas.cpp +++ b/imgui_canvas.cpp @@ -145,6 +145,60 @@ bool ImGuiEx::Canvas::Begin(ImGuiID id, const ImVec2& size) m_InBeginEnd = true; + // [ADAPT_IMGUI_BUNDLE]: added ImGuiContextHookType_BeginWindow, ImGuiContextHookType_EndWindow, cf https://github.com/thedmd/imgui-node-editor/issues/242#issuecomment-1681806764 + { + auto beginWindowHook = ImGuiContextHook{}; + beginWindowHook.UserData = this; + beginWindowHook.Type = ImGuiContextHookType_BeginWindow; + beginWindowHook.Callback = []( ImGuiContext * context, ImGuiContextHook * hook ) + { + //ImGui::SetNextWindowViewport( ImGui::GetCurrentWindow()->Viewport->ID ); + + auto canvas = reinterpret_cast< Canvas * >( hook->UserData ); + if ( canvas->m_SuspendCounter == 0 ) + { + if ( ( context->NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos ) != 0 ) + { + auto pos = canvas->FromLocal( context->NextWindowData.PosVal ); + ImGui::SetNextWindowPos( pos, context->NextWindowData.PosCond, context->NextWindowData.PosPivotVal ); + } + + if ( context->BeginPopupStack.size() ) + { + auto & popup = context->BeginPopupStack.back(); + popup.OpenPopupPos = canvas->FromLocal( popup.OpenPopupPos ); + popup.OpenMousePos = canvas->FromLocal( popup.OpenMousePos ); + } + + if ( context->OpenPopupStack.size() ) + { + auto & popup = context->OpenPopupStack.back(); + popup.OpenPopupPos = canvas->FromLocal( popup.OpenPopupPos ); + popup.OpenMousePos = canvas->FromLocal( popup.OpenMousePos ); + } + + } + canvas->m_BeginWindowCursorBackup = ImGui::GetCursorScreenPos(); + canvas->Suspend(); + }; + + m_beginWindowHook = ImGui::AddContextHook( ImGui::GetCurrentContext(), &beginWindowHook ); + + auto endWindowHook = ImGuiContextHook{}; + endWindowHook.UserData = this; + endWindowHook.Type = ImGuiContextHookType_EndWindow; + endWindowHook.Callback = []( ImGuiContext * ctx, ImGuiContextHook * hook ) + { + auto canvas = reinterpret_cast< Canvas * >( hook->UserData ); + canvas->Resume(); + ImGui::SetCursorScreenPos( canvas->m_BeginWindowCursorBackup ); + ImGui::GetCurrentWindow()->DC.IsSetPos = false; + }; + + m_endWindowHook = ImGui::AddContextHook( ImGui::GetCurrentContext(), &endWindowHook ); + } + // [/ADAPT_IMGUI_BUNDLE] + return true; } @@ -180,6 +234,14 @@ void ImGuiEx::Canvas::End() //m_DrawList->AddRect(m_WidgetPosition - ImVec2(1.0f, 1.0f), m_WidgetPosition + m_WidgetSize + ImVec2(1.0f, 1.0f), IM_COL32(196, 0, 0, 255)); m_InBeginEnd = false; + + // [ADAPT_IMGUI_BUNDLE]: added ImGuiContextHookType_BeginWindow, ImGuiContextHookType_EndWindow, cf https://github.com/thedmd/imgui-node-editor/issues/242#issuecomment-1681806764 + { + ImGui::RemoveContextHook( ImGui::GetCurrentContext(), m_beginWindowHook ); + ImGui::RemoveContextHook( ImGui::GetCurrentContext(), m_endWindowHook ); + } + // [/ADAPT_IMGUI_BUNDLE] + } void ImGuiEx::Canvas::SetView(const ImVec2& origin, float scale) diff --git a/imgui_canvas.h b/imgui_canvas.h index 2453dd87..8716304d 100644 --- a/imgui_canvas.h +++ b/imgui_canvas.h @@ -261,7 +261,12 @@ struct Canvas ImVec2 m_ViewportWorkPosBackup; ImVec2 m_ViewportWorkSizeBackup; # endif -}; + + // [ADAPT_IMGUI_BUNDLE]: added ImGuiContextHookType_BeginWindow, ImGuiContextHookType_EndWindow, cf https://github.com/thedmd/imgui-node-editor/issues/242#issuecomment-1681806764 + ImGuiID m_beginWindowHook, m_endWindowHook; + ImVec2 m_BeginWindowCursorBackup; + // [/ADAPT_IMGUI_BUNDLE] + }; } // namespace ImGuiEx