@ -9613,6 +9613,7 @@ void ImGuiStackSizes::CompareWithContextState(ImGuiContext* ctx)
// Advance cursor given item size for layout.
// Advance cursor given item size for layout.
// Register minimum needed size so it can extend the bounding box used for auto-fit calculation.
// Register minimum needed size so it can extend the bounding box used for auto-fit calculation.
// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different.
// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different.
// THIS IS IN THE PERFORMANCE CRITICAL PATH.
void ImGui : : ItemSize ( const ImVec2 & size , float text_baseline_y )
void ImGui : : ItemSize ( const ImVec2 & size , float text_baseline_y )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
@ -9652,6 +9653,7 @@ void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
// Declare item bounding box for clipping and interaction.
// Declare item bounding box for clipping and interaction.
// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface
// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface
// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction.
// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction.
// THIS IS IN THE PERFORMANCE CRITICAL PATH (UNTIL THE CLIPPING TEST AND EARLY-RETURN)
bool ImGui : : ItemAdd ( const ImRect & bb , ImGuiID id , const ImRect * nav_bb_arg , ImGuiItemFlags extra_flags )
bool ImGui : : ItemAdd ( const ImRect & bb , ImGuiID id , const ImRect * nav_bb_arg , ImGuiItemFlags extra_flags )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
@ -9666,11 +9668,11 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
g . LastItemData . StatusFlags = ImGuiItemStatusFlags_None ;
g . LastItemData . StatusFlags = ImGuiItemStatusFlags_None ;
// Note: we don't copy 'g.NextItemData.SelectionUserData' to an hypothetical g.LastItemData.SelectionUserData: since the former is not cleared.
// Note: we don't copy 'g.NextItemData.SelectionUserData' to an hypothetical g.LastItemData.SelectionUserData: since the former is not cleared.
// Directional navigation processing
if ( id ! = 0 )
if ( id ! = 0 )
{
{
KeepAliveID ( id ) ;
KeepAliveID ( id ) ;
// Directional navigation processing
// Runs prior to clipping early-out
// Runs prior to clipping early-out
// (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget
// (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget
// (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests
// (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests
@ -9689,12 +9691,9 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
if ( window = = g . NavWindow | | ( ( window - > Flags | g . NavWindow - > Flags ) & ImGuiWindowFlags_NavFlattened ) )
if ( window = = g . NavWindow | | ( ( window - > Flags | g . NavWindow - > Flags ) & ImGuiWindowFlags_NavFlattened ) )
NavProcessItem ( ) ;
NavProcessItem ( ) ;
}
}
// [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something".
// Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something".
// READ THE FAQ: https://dearimgui.com/faq
IM_ASSERT ( id ! = window - > ID & & " Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works! " ) ;
}
}
// Lightweight clear of SetNextItemXXX data.
g . NextItemData . Flags = ImGuiNextItemDataFlags_None ;
g . NextItemData . Flags = ImGuiNextItemDataFlags_None ;
g . NextItemData . ItemFlags = ImGuiItemFlags_None ;
g . NextItemData . ItemFlags = ImGuiItemFlags_None ;
@ -9704,7 +9703,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
# endif
# endif
// Clipping test
// Clipping test
// (FIXME: T his is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value)
// (t his is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value)
//const bool is_clipped = IsClippedEx(bb, id);
//const bool is_clipped = IsClippedEx(bb, id);
//if (is_clipped)
//if (is_clipped)
// return false;
// return false;
@ -9716,12 +9715,20 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
// [DEBUG]
// [DEBUG]
# ifndef IMGUI_DISABLE_DEBUG_TOOLS
# ifndef IMGUI_DISABLE_DEBUG_TOOLS
if ( id ! = 0 & & id = = g . DebugLocateId )
if ( id ! = 0 )
DebugLocateItemResolveWithLastItem ( ) ;
{
# endif
if ( id = = g . DebugLocateId )
DebugLocateItemResolveWithLastItem ( ) ;
// [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something".
// Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something".
// READ THE FAQ: https://dearimgui.com/faq
IM_ASSERT ( id ! = window - > ID & & " Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works! " ) ;
}
//if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG]
//if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG]
//if ((g.LastItemData.InFlags & ImGuiItemFlags_NoNav) == 0)
//if ((g.LastItemData.InFlags & ImGuiItemFlags_NoNav) == 0)
// window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG]
// window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG]
# endif
// We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them)
// We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them)
if ( is_rect_visible )
if ( is_rect_visible )