@ -642,7 +642,6 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, I
static void SetWindowCollapsed ( ImGuiWindow * window , bool collapsed , ImGuiCond cond ) ;
static ImGuiWindow * FindHoveredWindow ( ImVec2 pos ) ;
static ImGuiWindow * CreateNewWindow ( const char * name , ImVec2 size , ImGuiWindowFlags flags ) ;
static void ClearSetNextWindowData ( ) ;
static void CheckStacksSize ( ImGuiWindow * window , bool write ) ;
static ImVec2 CalcNextScrollFromScrollTargetAndClamp ( ImGuiWindow * window ) ;
@ -2632,8 +2631,6 @@ void ImGui::Shutdown()
g . FontStack . clear ( ) ;
g . OpenPopupStack . clear ( ) ;
g . CurrentPopupStack . clear ( ) ;
g . NextWindow . SizeConstraintCallback = NULL ;
g . NextWindow . SizeConstraintCallbackUserData = NULL ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( g . RenderDrawLists ) ; i + + )
g . RenderDrawLists [ i ] . clear ( ) ;
g . OverlayDrawList . ClearFreeMemory ( ) ;
@ -3816,19 +3813,12 @@ void ImGui::CloseCurrentPopup()
ClosePopupToLevel ( popup_idx ) ;
}
static inline void ClearSetNextWindowData ( )
{
// FIXME-OPT
ImGuiContext & g = * GImGui ;
g . NextWindow . PosCond = g . NextWindow . SizeCond = g . NextWindow . ContentSizeCond = g . NextWindow . CollapsedCond = g . NextWindow . SizeConstraintCond = g . NextWindow . FocusCond = 0 ;
}
bool ImGui : : BeginPopupEx ( ImGuiID id , ImGuiWindowFlags extra_flags )
{
ImGuiContext & g = * GImGui ;
if ( ! IsPopupOpen ( id ) )
{
ClearSetNextWindowData ( ) ; // We behave like Begin() and need to consume those values
g . NextWindowData . Clear ( ) ; // We behave like Begin() and need to consume those values
return false ;
}
@ -3850,7 +3840,7 @@ bool ImGui::BeginPopup(const char* str_id)
ImGuiContext & g = * GImGui ;
if ( g . OpenPopupStack . Size < = g . CurrentPopupStack . Size ) // Early out for performance
{
ClearSetNextWindowData ( ) ; // We behave like Begin() and need to consume those values
g. NextWindowData . Clear ( ) ; // We behave like Begin() and need to consume those values
return false ;
}
return BeginPopupEx ( g . CurrentWindow - > GetID ( str_id ) , ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings ) ;
@ -3875,12 +3865,12 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags ext
const ImGuiID id = window - > GetID ( name ) ;
if ( ! IsPopupOpen ( id ) )
{
ClearSetNextWindowData ( ) ; // We behave like Begin() and need to consume those values
g. NextWindowData . Clear ( ) ; // We behave like Begin() and need to consume those values
return false ;
}
// Center modal windows by default
if ( g . NextWindow . PosCond = = 0 )
if ( g . NextWindow Data . PosCond = = 0 )
SetNextWindowPos ( g . IO . DisplaySize * 0.5f , ImGuiCond_Appearing , ImVec2 ( 0.5f , 0.5f ) ) ;
ImGuiWindowFlags flags = extra_flags | ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings ;
@ -4192,20 +4182,20 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
static ImVec2 CalcSizeAfterConstraint ( ImGuiWindow * window , ImVec2 new_size )
{
ImGuiContext & g = * GImGui ;
if ( g . NextWindow . SizeConstraintCond ! = 0 )
if ( g . NextWindow Data . SizeConstraintCond ! = 0 )
{
// Using -1,-1 on either X/Y axis to preserve the current size.
ImRect cr = g . NextWindow . SizeConstraintRect ;
ImRect cr = g . NextWindow Data . SizeConstraintRect ;
new_size . x = ( cr . Min . x > = 0 & & cr . Max . x > = 0 ) ? ImClamp ( new_size . x , cr . Min . x , cr . Max . x ) : window - > SizeFull . x ;
new_size . y = ( cr . Min . y > = 0 & & cr . Max . y > = 0 ) ? ImClamp ( new_size . y , cr . Min . y , cr . Max . y ) : window - > SizeFull . y ;
if ( g . NextWindow . SizeConstraintCallback )
if ( g . NextWindow Data . SizeConstraintCallback )
{
ImGuiSizeConstraintCallbackData data ;
data . UserData = g . NextWindow . SizeConstraintCallbackUserData ;
data . UserData = g . NextWindow Data . SizeConstraintCallbackUserData ;
data . Pos = window - > Pos ;
data . CurrentSize = window - > SizeFull ;
data . DesiredSize = new_size ;
g . NextWindow . SizeConstraintCallback ( & data ) ;
g . NextWindow Data . SizeConstraintCallback ( & data ) ;
new_size = data . DesiredSize ;
}
}
@ -4351,7 +4341,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
ImGuiWindow * window = FindWindowByName ( name ) ;
if ( ! window )
{
ImVec2 size_on_first_use = ( g . NextWindow . SizeCond ! = 0 ) ? g . NextWindow . SizeVal : ImVec2 ( 0.0f , 0.0f ) ; // Any condition flag will do since we are creating a new window here.
ImVec2 size_on_first_use = ( g . NextWindow Data . SizeCond ! = 0 ) ? g . NextWindow Data . SizeVal : ImVec2 ( 0.0f , 0.0f ) ; // Any condition flag will do since we are creating a new window here.
window = CreateNewWindow ( name , size_on_first_use , flags ) ;
}
@ -4396,50 +4386,50 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Process SetNextWindow***() calls
bool window_pos_set_by_api = false ;
bool window_size_x_set_by_api = false , window_size_y_set_by_api = false ;
if ( g . NextWindow . PosCond )
if ( g . NextWindow Data . PosCond )
{
window_pos_set_by_api = ( window - > SetWindowPosAllowFlags & g . NextWindow . PosCond ) ! = 0 ;
if ( window_pos_set_by_api & & ImLengthSqr ( g . NextWindow . PosPivotVal ) > 0.00001f )
window_pos_set_by_api = ( window - > SetWindowPosAllowFlags & g . NextWindow Data . PosCond ) ! = 0 ;
if ( window_pos_set_by_api & & ImLengthSqr ( g . NextWindow Data . PosPivotVal ) > 0.00001f )
{
// May be processed on the next frame if this is our first frame and we are measuring size
// FIXME: Look into removing the branch so everything can go through this same code path for consistency.
window - > SetWindowPosVal = g . NextWindow . PosVal ;
window - > SetWindowPosPivot = g . NextWindow . PosPivotVal ;
window - > SetWindowPosVal = g . NextWindow Data . PosVal ;
window - > SetWindowPosPivot = g . NextWindow Data . PosPivotVal ;
window - > SetWindowPosAllowFlags & = ~ ( ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing ) ;
}
else
{
SetWindowPos ( window , g . NextWindow . PosVal , g . NextWindow . PosCond ) ;
SetWindowPos ( window , g . NextWindow Data . PosVal , g . NextWindow Data . PosCond ) ;
}
g . NextWindow . PosCond = 0 ;
g . NextWindow Data . PosCond = 0 ;
}
if ( g . NextWindow . SizeCond )
if ( g . NextWindow Data . SizeCond )
{
window_size_x_set_by_api = ( window - > SetWindowSizeAllowFlags & g . NextWindow . SizeCond ) ! = 0 & & ( g . NextWindow . SizeVal . x > 0.0f ) ;
window_size_y_set_by_api = ( window - > SetWindowSizeAllowFlags & g . NextWindow . SizeCond ) ! = 0 & & ( g . NextWindow . SizeVal . y > 0.0f ) ;
SetWindowSize ( window , g . NextWindow . SizeVal , g . NextWindow . SizeCond ) ;
g . NextWindow . SizeCond = 0 ;
window_size_x_set_by_api = ( window - > SetWindowSizeAllowFlags & g . NextWindow Data . SizeCond ) ! = 0 & & ( g . NextWindow Data . SizeVal . x > 0.0f ) ;
window_size_y_set_by_api = ( window - > SetWindowSizeAllowFlags & g . NextWindow Data . SizeCond ) ! = 0 & & ( g . NextWindow Data . SizeVal . y > 0.0f ) ;
SetWindowSize ( window , g . NextWindow Data . SizeVal , g . NextWindow Data . SizeCond ) ;
g . NextWindow Data . SizeCond = 0 ;
}
if ( g . NextWindow . ContentSizeCond )
if ( g . NextWindow Data . ContentSizeCond )
{
// Adjust passed "client size" to become a "window size"
window - > SizeContentsExplicit = g . NextWindow . ContentSizeVal ;
window - > SizeContentsExplicit = g . NextWindow Data . ContentSizeVal ;
window - > SizeContentsExplicit . y + = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
g . NextWindow . ContentSizeCond = 0 ;
g . NextWindow Data . ContentSizeCond = 0 ;
}
else if ( first_begin_of_the_frame )
{
window - > SizeContentsExplicit = ImVec2 ( 0.0f , 0.0f ) ;
}
if ( g . NextWindow . CollapsedCond )
if ( g . NextWindow Data . CollapsedCond )
{
SetWindowCollapsed ( window , g . NextWindow . CollapsedVal , g . NextWindow . CollapsedCond ) ;
g . NextWindow . CollapsedCond = 0 ;
SetWindowCollapsed ( window , g . NextWindow Data . CollapsedVal , g . NextWindow Data . CollapsedCond ) ;
g . NextWindow Data . CollapsedCond = 0 ;
}
if ( g . NextWindow . FocusCond )
if ( g . NextWindow Data . FocusCond )
{
SetWindowFocus ( ) ;
g . NextWindow . FocusCond = 0 ;
g . NextWindow Data . FocusCond = 0 ;
}
if ( window - > Appearing )
SetWindowConditionAllowFlags ( window , ImGuiCond_Appearing , false ) ;
@ -4939,7 +4929,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > WriteAccessed = false ;
window - > BeginCount + + ;
g . NextWindow . SizeConstraintCond = 0 ;
g . NextWindow Data . SizeConstraintCond = 0 ;
// Child window can be out of sight and have "negative" clip windows.
// Mark them as collapsed so commands are skipped earlier (we can't manually collapse because they have no title bar).
@ -5701,45 +5691,45 @@ void ImGui::SetWindowFocus(const char* name)
void ImGui : : SetNextWindowPos ( const ImVec2 & pos , ImGuiCond cond , const ImVec2 & pivot )
{
ImGuiContext & g = * GImGui ;
g . NextWindow . PosVal = pos ;
g . NextWindow . PosPivotVal = pivot ;
g . NextWindow . PosCond = cond ? cond : ImGuiCond_Always ;
g . NextWindow Data . PosVal = pos ;
g . NextWindow Data . PosPivotVal = pivot ;
g . NextWindow Data . PosCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : SetNextWindowSize ( const ImVec2 & size , ImGuiCond cond )
{
ImGuiContext & g = * GImGui ;
g . NextWindow . SizeVal = size ;
g . NextWindow . SizeCond = cond ? cond : ImGuiCond_Always ;
g . NextWindow Data . SizeVal = size ;
g . NextWindow Data . SizeCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : SetNextWindowSizeConstraints ( const ImVec2 & size_min , const ImVec2 & size_max , ImGuiSizeConstraintCallback custom_callback , void * custom_callback_user_data )
{
ImGuiContext & g = * GImGui ;
g . NextWindow . SizeConstraintCond = ImGuiCond_Always ;
g . NextWindow . SizeConstraintRect = ImRect ( size_min , size_max ) ;
g . NextWindow . SizeConstraintCallback = custom_callback ;
g . NextWindow . SizeConstraintCallbackUserData = custom_callback_user_data ;
g . NextWindow Data . SizeConstraintCond = ImGuiCond_Always ;
g . NextWindow Data . SizeConstraintRect = ImRect ( size_min , size_max ) ;
g . NextWindow Data . SizeConstraintCallback = custom_callback ;
g . NextWindow Data . SizeConstraintCallbackUserData = custom_callback_user_data ;
}
void ImGui : : SetNextWindowContentSize ( const ImVec2 & size )
{
ImGuiContext & g = * GImGui ;
g . NextWindow . ContentSizeVal = size ; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value.
g . NextWindow . ContentSizeCond = ImGuiCond_Always ;
g . NextWindow Data . ContentSizeVal = size ; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value.
g . NextWindow Data . ContentSizeCond = ImGuiCond_Always ;
}
void ImGui : : SetNextWindowCollapsed ( bool collapsed , ImGuiCond cond )
{
ImGuiContext & g = * GImGui ;
g . NextWindow . CollapsedVal = collapsed ;
g . NextWindow . CollapsedCond = cond ? cond : ImGuiCond_Always ;
g . NextWindow Data . CollapsedVal = collapsed ;
g . NextWindow Data . CollapsedCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : SetNextWindowFocus ( )
{
ImGuiContext & g = * GImGui ;
g . NextWindow . FocusCond = ImGuiCond_Always ;
g . NextWindow Data . FocusCond = ImGuiCond_Always ;
}
// In window space (not screen space!)
@ -9162,8 +9152,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
{
// Always consume the SetNextWindowSizeConstraint() call in our early return paths
ImGuiContext & g = * GImGui ;
ImGuiCond backup_next_window_size_constraint = g . NextWindow . SizeConstraintCond ;
g . NextWindow . SizeConstraintCond = 0 ;
ImGuiCond backup_next_window_size_constraint = g . NextWindow Data . SizeConstraintCond ;
g . NextWindow Data . SizeConstraintCond = 0 ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
@ -9205,8 +9195,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
if ( backup_next_window_size_constraint )
{
g . NextWindow . SizeConstraintCond = backup_next_window_size_constraint ;
g . NextWindow . SizeConstraintRect . Min . x = ImMax ( g . NextWindow . SizeConstraintRect . Min . x , w ) ;
g . NextWindow Data . SizeConstraintCond = backup_next_window_size_constraint ;
g . NextWindow Data . SizeConstraintRect . Min . x = ImMax ( g . NextWindow Data . SizeConstraintRect . Min . x , w ) ;
}
else
{
@ -9268,7 +9258,7 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
items_getter ( data , * current_item , & preview_text ) ;
// The old Combo() API exposed "popup_max_height_in_items", however the new more general BeginCombo() API doesn't, so we emulate it here.
if ( popup_max_height_in_items ! = - 1 & & ! g . NextWindow . SizeConstraintCond )
if ( popup_max_height_in_items ! = - 1 & & ! g . NextWindow Data . SizeConstraintCond )
{
float popup_max_height = CalcMaxPopupHeightFromItemCount ( popup_max_height_in_items ) ;
SetNextWindowSizeConstraints ( ImVec2 ( 0 , 0 ) , ImVec2 ( FLT_MAX , popup_max_height ) ) ;