Skip to content

Commit

Permalink
[Bundle] : call ImGuiContextHookType_Begin/EndWindow
Browse files Browse the repository at this point in the history
cf thedmd#242 (comment)

This helps fixing issues in popup positionning inside the node editor
  • Loading branch information
pthom committed Oct 10, 2024
1 parent 8584d97 commit 8b17842
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
62 changes: 62 additions & 0 deletions imgui_canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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)
Expand Down
7 changes: 6 additions & 1 deletion imgui_canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 8b17842

Please sign in to comment.