mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Refactor: moving ItemAdd() into a section abote ItemSize(). No logic change (part 2)
Diff not ideal (in Fork it looks like ItemSize is moved) but understandable at a glance.
This commit is contained in:
		
							
								
								
									
										159
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										159
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -9735,97 +9735,10 @@ void ImGui::KeepAliveID(ImGuiID id)
 | 
			
		||||
        g.ActiveIdPreviousFrameIsAlive = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
// 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)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
 | 
			
		||||
    ...
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// [SECTION] LAYOUT
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// - ItemSize()
 | 
			
		||||
// - SameLine()
 | 
			
		||||
// - GetCursorScreenPos()
 | 
			
		||||
// - SetCursorScreenPos()
 | 
			
		||||
// - GetCursorPos(), GetCursorPosX(), GetCursorPosY()
 | 
			
		||||
// - SetCursorPos(), SetCursorPosX(), SetCursorPosY()
 | 
			
		||||
// - GetCursorStartPos()
 | 
			
		||||
// - Indent()
 | 
			
		||||
// - Unindent()
 | 
			
		||||
// - SetNextItemWidth()
 | 
			
		||||
// - PushItemWidth()
 | 
			
		||||
// - PushMultiItemsWidths()
 | 
			
		||||
// - PopItemWidth()
 | 
			
		||||
// - CalcItemWidth()
 | 
			
		||||
// - CalcItemSize()
 | 
			
		||||
// - GetTextLineHeight()
 | 
			
		||||
// - GetTextLineHeightWithSpacing()
 | 
			
		||||
// - GetFrameHeight()
 | 
			
		||||
// - GetFrameHeightWithSpacing()
 | 
			
		||||
// - GetContentRegionMax()
 | 
			
		||||
// - GetContentRegionMaxAbs() [Internal]
 | 
			
		||||
// - GetContentRegionAvail(),
 | 
			
		||||
// - GetWindowContentRegionMin(), GetWindowContentRegionMax()
 | 
			
		||||
// - BeginGroup()
 | 
			
		||||
// - EndGroup()
 | 
			
		||||
// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Advance cursor given item size for layout.
 | 
			
		||||
// 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.
 | 
			
		||||
// THIS IS IN THE PERFORMANCE CRITICAL PATH.
 | 
			
		||||
void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
    if (window->SkipItems)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    // We increase the height in this function to accommodate for baseline offset.
 | 
			
		||||
    // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor,
 | 
			
		||||
    // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect.
 | 
			
		||||
    const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f;
 | 
			
		||||
 | 
			
		||||
    const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y;
 | 
			
		||||
    const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y);
 | 
			
		||||
 | 
			
		||||
    // Always align ourselves on pixel boundaries
 | 
			
		||||
    //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG]
 | 
			
		||||
    window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x;
 | 
			
		||||
    window->DC.CursorPosPrevLine.y = line_y1;
 | 
			
		||||
    window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);    // Next line
 | 
			
		||||
    window->DC.CursorPos.y = IM_TRUNC(line_y1 + line_height + g.Style.ItemSpacing.y);                       // Next line
 | 
			
		||||
    window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
 | 
			
		||||
    window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
 | 
			
		||||
    //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
 | 
			
		||||
 | 
			
		||||
    window->DC.PrevLineSize.y = line_height;
 | 
			
		||||
    window->DC.CurrLineSize.y = 0.0f;
 | 
			
		||||
    window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y);
 | 
			
		||||
    window->DC.CurrLineTextBaseOffset = 0.0f;
 | 
			
		||||
    window->DC.IsSameLine = window->DC.IsSetPos = false;
 | 
			
		||||
 | 
			
		||||
    // Horizontal layout mode
 | 
			
		||||
    if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
 | 
			
		||||
        SameLine();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
@@ -9910,6 +9823,78 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// [SECTION] LAYOUT
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// - ItemSize()
 | 
			
		||||
// - SameLine()
 | 
			
		||||
// - GetCursorScreenPos()
 | 
			
		||||
// - SetCursorScreenPos()
 | 
			
		||||
// - GetCursorPos(), GetCursorPosX(), GetCursorPosY()
 | 
			
		||||
// - SetCursorPos(), SetCursorPosX(), SetCursorPosY()
 | 
			
		||||
// - GetCursorStartPos()
 | 
			
		||||
// - Indent()
 | 
			
		||||
// - Unindent()
 | 
			
		||||
// - SetNextItemWidth()
 | 
			
		||||
// - PushItemWidth()
 | 
			
		||||
// - PushMultiItemsWidths()
 | 
			
		||||
// - PopItemWidth()
 | 
			
		||||
// - CalcItemWidth()
 | 
			
		||||
// - CalcItemSize()
 | 
			
		||||
// - GetTextLineHeight()
 | 
			
		||||
// - GetTextLineHeightWithSpacing()
 | 
			
		||||
// - GetFrameHeight()
 | 
			
		||||
// - GetFrameHeightWithSpacing()
 | 
			
		||||
// - GetContentRegionMax()
 | 
			
		||||
// - GetContentRegionMaxAbs() [Internal]
 | 
			
		||||
// - GetContentRegionAvail(),
 | 
			
		||||
// - GetWindowContentRegionMin(), GetWindowContentRegionMax()
 | 
			
		||||
// - BeginGroup()
 | 
			
		||||
// - EndGroup()
 | 
			
		||||
// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Advance cursor given item size for layout.
 | 
			
		||||
// 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.
 | 
			
		||||
// THIS IS IN THE PERFORMANCE CRITICAL PATH.
 | 
			
		||||
void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
    if (window->SkipItems)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    // We increase the height in this function to accommodate for baseline offset.
 | 
			
		||||
    // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor,
 | 
			
		||||
    // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect.
 | 
			
		||||
    const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f;
 | 
			
		||||
 | 
			
		||||
    const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y;
 | 
			
		||||
    const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y);
 | 
			
		||||
 | 
			
		||||
    // Always align ourselves on pixel boundaries
 | 
			
		||||
    //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG]
 | 
			
		||||
    window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x;
 | 
			
		||||
    window->DC.CursorPosPrevLine.y = line_y1;
 | 
			
		||||
    window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);    // Next line
 | 
			
		||||
    window->DC.CursorPos.y = IM_TRUNC(line_y1 + line_height + g.Style.ItemSpacing.y);                       // Next line
 | 
			
		||||
    window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
 | 
			
		||||
    window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
 | 
			
		||||
    //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
 | 
			
		||||
 | 
			
		||||
    window->DC.PrevLineSize.y = line_height;
 | 
			
		||||
    window->DC.CurrLineSize.y = 0.0f;
 | 
			
		||||
    window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y);
 | 
			
		||||
    window->DC.CurrLineTextBaseOffset = 0.0f;
 | 
			
		||||
    window->DC.IsSameLine = window->DC.IsSetPos = false;
 | 
			
		||||
 | 
			
		||||
    // Horizontal layout mode
 | 
			
		||||
    if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
 | 
			
		||||
        SameLine();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets back to previous line and continue with horizontal layout
 | 
			
		||||
//      offset_from_start_x == 0 : follow right after previous item
 | 
			
		||||
//      offset_from_start_x != 0 : align to specified x position (relative to window/group left)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user