@ -6145,88 +6145,6 @@ void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWind
FocusWindow ( NULL ) ;
FocusWindow ( NULL ) ;
}
}
void ImGui : : SetNextItemWidth ( float item_width )
{
ImGuiContext & g = * GImGui ;
g . NextItemData . Flags | = ImGuiNextItemDataFlags_HasWidth ;
g . NextItemData . Width = item_width ;
}
void ImGui : : PushItemWidth ( float item_width )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
window - > DC . ItemWidth = ( item_width = = 0.0f ? window - > ItemWidthDefault : item_width ) ;
window - > DC . ItemWidthStack . push_back ( window - > DC . ItemWidth ) ;
g . NextItemData . Flags & = ~ ImGuiNextItemDataFlags_HasWidth ;
}
void ImGui : : PushMultiItemsWidths ( int components , float w_full )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
const ImGuiStyle & style = g . Style ;
const float w_item_one = ImMax ( 1.0f , IM_FLOOR ( ( w_full - ( style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , IM_FLOOR ( w_full - ( w_item_one + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
window - > DC . ItemWidthStack . push_back ( w_item_last ) ;
for ( int i = 0 ; i < components - 1 ; i + + )
window - > DC . ItemWidthStack . push_back ( w_item_one ) ;
window - > DC . ItemWidth = window - > DC . ItemWidthStack . back ( ) ;
g . NextItemData . Flags & = ~ ImGuiNextItemDataFlags_HasWidth ;
}
void ImGui : : PopItemWidth ( )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
window - > DC . ItemWidthStack . pop_back ( ) ;
window - > DC . ItemWidth = window - > DC . ItemWidthStack . empty ( ) ? window - > ItemWidthDefault : window - > DC . ItemWidthStack . back ( ) ;
}
// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth().
// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags()
float ImGui : : CalcItemWidth ( )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
float w ;
if ( g . NextItemData . Flags & ImGuiNextItemDataFlags_HasWidth )
w = g . NextItemData . Width ;
else
w = window - > DC . ItemWidth ;
if ( w < 0.0f )
{
float region_max_x = GetContentRegionMaxAbs ( ) . x ;
w = ImMax ( 1.0f , region_max_x - window - > DC . CursorPos . x + w ) ;
}
w = IM_FLOOR ( w ) ;
return w ;
}
// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth().
// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical.
// Note that only CalcItemWidth() is publicly exposed.
// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable)
ImVec2 ImGui : : CalcItemSize ( ImVec2 size , float default_w , float default_h )
{
ImGuiWindow * window = GImGui - > CurrentWindow ;
ImVec2 region_max ;
if ( size . x < 0.0f | | size . y < 0.0f )
region_max = GetContentRegionMaxAbs ( ) ;
if ( size . x = = 0.0f )
size . x = default_w ;
else if ( size . x < 0.0f )
size . x = ImMax ( 4.0f , region_max . x - window - > DC . CursorPos . x + size . x ) ;
if ( size . y = = 0.0f )
size . y = default_h ;
else if ( size . y < 0.0f )
size . y = ImMax ( 4.0f , region_max . y - window - > DC . CursorPos . y + size . y ) ;
return size ;
}
void ImGui : : SetCurrentFont ( ImFont * font )
void ImGui : : SetCurrentFont ( ImFont * font )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
@ -6913,6 +6831,12 @@ static void ImGui::ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool
// - GetCursorStartPos()
// - GetCursorStartPos()
// - Indent()
// - Indent()
// - Unindent()
// - Unindent()
// - SetNextItemWidth()
// - PushItemWidth()
// - PushMultiItemsWidths()
// - PopItemWidth()
// - CalcItemWidth()
// - CalcItemSize()
// - BeginGroup()
// - BeginGroup()
// - EndGroup()
// - EndGroup()
// Also see in imgui_widgets: tab bars, columns.
// Also see in imgui_widgets: tab bars, columns.
@ -7118,6 +7042,89 @@ void ImGui::Unindent(float indent_w)
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
window - > DC . CursorPos . x = window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ;
}
}
// Affect large frame+labels widgets only.
void ImGui : : SetNextItemWidth ( float item_width )
{
ImGuiContext & g = * GImGui ;
g . NextItemData . Flags | = ImGuiNextItemDataFlags_HasWidth ;
g . NextItemData . Width = item_width ;
}
void ImGui : : PushItemWidth ( float item_width )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
window - > DC . ItemWidth = ( item_width = = 0.0f ? window - > ItemWidthDefault : item_width ) ;
window - > DC . ItemWidthStack . push_back ( window - > DC . ItemWidth ) ;
g . NextItemData . Flags & = ~ ImGuiNextItemDataFlags_HasWidth ;
}
void ImGui : : PushMultiItemsWidths ( int components , float w_full )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
const ImGuiStyle & style = g . Style ;
const float w_item_one = ImMax ( 1.0f , IM_FLOOR ( ( w_full - ( style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , IM_FLOOR ( w_full - ( w_item_one + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
window - > DC . ItemWidthStack . push_back ( w_item_last ) ;
for ( int i = 0 ; i < components - 1 ; i + + )
window - > DC . ItemWidthStack . push_back ( w_item_one ) ;
window - > DC . ItemWidth = window - > DC . ItemWidthStack . back ( ) ;
g . NextItemData . Flags & = ~ ImGuiNextItemDataFlags_HasWidth ;
}
void ImGui : : PopItemWidth ( )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
window - > DC . ItemWidthStack . pop_back ( ) ;
window - > DC . ItemWidth = window - > DC . ItemWidthStack . empty ( ) ? window - > ItemWidthDefault : window - > DC . ItemWidthStack . back ( ) ;
}
// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth().
// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags()
float ImGui : : CalcItemWidth ( )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
float w ;
if ( g . NextItemData . Flags & ImGuiNextItemDataFlags_HasWidth )
w = g . NextItemData . Width ;
else
w = window - > DC . ItemWidth ;
if ( w < 0.0f )
{
float region_max_x = GetContentRegionMaxAbs ( ) . x ;
w = ImMax ( 1.0f , region_max_x - window - > DC . CursorPos . x + w ) ;
}
w = IM_FLOOR ( w ) ;
return w ;
}
// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth().
// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical.
// Note that only CalcItemWidth() is publicly exposed.
// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable)
ImVec2 ImGui : : CalcItemSize ( ImVec2 size , float default_w , float default_h )
{
ImGuiWindow * window = GImGui - > CurrentWindow ;
ImVec2 region_max ;
if ( size . x < 0.0f | | size . y < 0.0f )
region_max = GetContentRegionMaxAbs ( ) ;
if ( size . x = = 0.0f )
size . x = default_w ;
else if ( size . x < 0.0f )
size . x = ImMax ( 4.0f , region_max . x - window - > DC . CursorPos . x + size . x ) ;
if ( size . y = = 0.0f )
size . y = default_h ;
else if ( size . y < 0.0f )
size . y = ImMax ( 4.0f , region_max . y - window - > DC . CursorPos . y + size . y ) ;
return size ;
}
// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
void ImGui : : BeginGroup ( )
void ImGui : : BeginGroup ( )
{
{