@ -249,6 +249,7 @@
Here is a change - log of API breaking changes , if you are using one of the functions listed , expect to have to fix some code .
Also read releases logs https : //github.com/ocornut/imgui/releases for more details.
- 2018 / 01 / 03 ( 1.54 ) - renamed ImGuiSizeConstraintCallback to ImGuiSizeCallback , ImGuiSizeConstraintCallbackData to ImGuiSizeCallbackData .
- 2017 / 12 / 29 ( 1.54 ) - removed CalcItemRectClosestPoint ( ) which was weird and not really used by anyone except demo code . If you need it it ' s easy to replicate on your side .
- 2017 / 12 / 24 ( 1.53 ) - renamed the emblematic ShowTestWindow ( ) function to ShowDemoWindow ( ) . Kept redirection function ( will obsolete ) .
- 2017 / 12 / 21 ( 1.53 ) - ImDrawList : renamed style . AntiAliasedShapes to style . AntiAliasedFill for consistency and as a way to explicitly break code that manipulate those flag at runtime . You can now manipulate ImDrawList : : Flags
@ -680,7 +681,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 ) ;
@ -3439,8 +3439,6 @@ void ImGui::Shutdown()
g . FontStack . clear ( ) ;
g . OpenPopupStack . clear ( ) ;
g . CurrentPopupStack . clear ( ) ;
g . SetNextWindowSizeConstraintCallback = NULL ;
g . SetNextWindowSizeConstraintCallbackUserData = NULL ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( g . RenderDrawLists ) ; i + + )
g . RenderDrawLists [ i ] . clear ( ) ;
g . OverlayDrawList . ClearFreeMemory ( ) ;
@ -4682,20 +4680,12 @@ void ImGui::CloseCurrentPopup()
ClosePopupToLevel ( popup_idx ) ;
}
static inline void ClearSetNextWindowData ( )
{
// FIXME-OPT
ImGuiContext & g = * GImGui ;
g . SetNextWindowPosCond = g . SetNextWindowSizeCond = g . SetNextWindowContentSizeCond = g . SetNextWindowCollapsedCond = 0 ;
g . SetNextWindowSizeConstraint = g . SetNextWindowFocus = false ;
}
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 ;
}
@ -4717,7 +4707,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 ) ;
@ -4742,12 +4732,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 . Set NextWindowPosCond = = 0 )
if ( g . NextWindowData . 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 ;
@ -5094,20 +5084,20 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
static ImVec2 CalcSizeAfterConstraint ( ImGuiWindow * window , ImVec2 new_size )
{
ImGuiContext & g = * GImGui ;
if ( g . Set NextWindowSizeConstraint)
if ( g . NextWindowData . SizeConstraintCond ! = 0 )
{
// Using -1,-1 on either X/Y axis to preserve the current size.
ImRect cr = g . Set NextWindowSizeConstraintRect;
ImRect cr = g . NextWindowData . 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 . SetNextWindowSizeConstraint Callback)
if ( g . NextWindowData . Size Callback)
{
ImGuiSizeConstraintC allbackData data ;
data . UserData = g . SetNextWindowSizeConstraint CallbackUserData;
ImGuiSizeCallbackData data ;
data . UserData = g . NextWindowData . Size CallbackUserData;
data . Pos = window - > Pos ;
data . CurrentSize = window - > SizeFull ;
data . DesiredSize = new_size ;
g . SetNextWindowSizeConstraint Callback( & data ) ;
g . NextWindowData . Size Callback( & data ) ;
new_size = data . DesiredSize ;
}
}
@ -5256,7 +5246,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
ImGuiWindow * window = FindWindowByName ( name ) ;
if ( ! window )
{
ImVec2 size_on_first_use = ( g . Set NextWindowSizeCond ! = 0 ) ? g . Set NextWindowSizeVal : ImVec2 ( 0.0f , 0.0f ) ; // Any condition flag will do since we are creating a new window here.
ImVec2 size_on_first_use = ( g . NextWindowData . SizeCond ! = 0 ) ? g . NextWindowData . 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 ) ;
}
@ -5304,50 +5294,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 . Set NextWindowPosCond)
if ( g . NextWindowData . PosCond )
{
window_pos_set_by_api = ( window - > SetWindowPosAllowFlags & g . Set NextWindowPosCond) ! = 0 ;
if ( window_pos_set_by_api & & ImLengthSqr ( g . Set NextWindowPosPivot) > 0.00001f )
window_pos_set_by_api = ( window - > SetWindowPosAllowFlags & g . NextWindowData . PosCond ) ! = 0 ;
if ( window_pos_set_by_api & & ImLengthSqr ( g . NextWindowData . 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 . Set NextWindowPosVal;
window - > SetWindowPosPivot = g . Set NextWindowPosPivot;
window - > SetWindowPosVal = g . NextWindowData . PosVal ;
window - > SetWindowPosPivot = g . NextWindowData . PosPivotVal ;
window - > SetWindowPosAllowFlags & = ~ ( ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing ) ;
}
else
{
SetWindowPos ( window , g . Set NextWindowPosVal, g . Set NextWindowPosCond) ;
SetWindowPos ( window , g . NextWindowData . PosVal , g . NextWindowData . PosCond ) ;
}
g . Set NextWindowPosCond = 0 ;
g . NextWindowData . PosCond = 0 ;
}
if ( g . Set NextWindowSizeCond)
if ( g . NextWindowData . SizeCond )
{
window_size_x_set_by_api = ( window - > SetWindowSizeAllowFlags & g . Set NextWindowSizeCond) ! = 0 & & ( g . Set NextWindowSizeVal. x > 0.0f ) ;
window_size_y_set_by_api = ( window - > SetWindowSizeAllowFlags & g . Set NextWindowSizeCond) ! = 0 & & ( g . Set NextWindowSizeVal. y > 0.0f ) ;
SetWindowSize ( window , g . Set NextWindowSizeVal, g . Set NextWindowSizeCond) ;
g . Set NextWindowSizeCond = 0 ;
window_size_x_set_by_api = ( window - > SetWindowSizeAllowFlags & g . NextWindowData . SizeCond ) ! = 0 & & ( g . NextWindowData . SizeVal . x > 0.0f ) ;
window_size_y_set_by_api = ( window - > SetWindowSizeAllowFlags & g . NextWindowData . SizeCond ) ! = 0 & & ( g . NextWindowData . SizeVal . y > 0.0f ) ;
SetWindowSize ( window , g . NextWindowData . SizeVal , g . NextWindowData . SizeCond ) ;
g . NextWindowData . SizeCond = 0 ;
}
if ( g . Set NextWindowContentSizeCond)
if ( g . NextWindowData . ContentSizeCond )
{
// Adjust passed "client size" to become a "window size"
window - > SizeContentsExplicit = g . Set NextWindowContentSizeVal;
window - > SizeContentsExplicit = g . NextWindowData . ContentSizeVal ;
window - > SizeContentsExplicit . y + = window - > TitleBarHeight ( ) + window - > MenuBarHeight ( ) ;
g . Set NextWindowContentSizeCond = 0 ;
g . NextWindowData . ContentSizeCond = 0 ;
}
else if ( first_begin_of_the_frame )
{
window - > SizeContentsExplicit = ImVec2 ( 0.0f , 0.0f ) ;
}
if ( g . Set NextWindowCollapsedCond)
if ( g . NextWindowData . CollapsedCond )
{
SetWindowCollapsed ( window , g . Set NextWindowCollapsedVal, g . Set NextWindowCollapsedCond) ;
g . Set NextWindowCollapsedCond = 0 ;
SetWindowCollapsed ( window , g . NextWindowData . CollapsedVal , g . NextWindowData . CollapsedCond ) ;
g . NextWindowData . CollapsedCond = 0 ;
}
if ( g . Set NextWindowFocus)
if ( g . NextWindowData . FocusCond )
{
SetWindowFocus ( ) ;
g . SetNextWindowFocus = false ;
g . NextWindowData . FocusCond = 0 ;
}
if ( window - > Appearing )
SetWindowConditionAllowFlags ( window , ImGuiCond_Appearing , false ) ;
@ -5899,7 +5889,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > WriteAccessed = false ;
window - > BeginCount + + ;
g . SetNextWindowSizeConstraint = false ;
g . NextWindowData . 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).
@ -6679,45 +6669,45 @@ void ImGui::SetWindowFocus(const char* name)
void ImGui : : SetNextWindowPos ( const ImVec2 & pos , ImGuiCond cond , const ImVec2 & pivot )
{
ImGuiContext & g = * GImGui ;
g . Set NextWindowPosVal = pos ;
g . Set NextWindowPosPivot = pivot ;
g . Set NextWindowPosCond = cond ? cond : ImGuiCond_Always ;
g . NextWindowData . PosVal = pos ;
g . NextWindowData . PosPivotVal = pivot ;
g . NextWindowData . PosCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : SetNextWindowSize ( const ImVec2 & size , ImGuiCond cond )
{
ImGuiContext & g = * GImGui ;
g . Set NextWindowSizeVal = size ;
g . Set NextWindowSizeCond = cond ? cond : ImGuiCond_Always ;
g . NextWindowData . SizeVal = size ;
g . NextWindowData . SizeCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : SetNextWindowSizeConstraints ( const ImVec2 & size_min , const ImVec2 & size_max , ImGuiSizeConstraintC allback custom_callback , void * custom_callback_user_data )
void ImGui : : SetNextWindowSizeConstraints ( const ImVec2 & size_min , const ImVec2 & size_max , ImGuiSizeCallback custom_callback , void * custom_callback_user_data )
{
ImGuiContext & g = * GImGui ;
g . SetNextWindowSizeConstraint = true ;
g . Set NextWindowSizeConstraintRect = ImRect ( size_min , size_max ) ;
g . SetNextWindowSizeConstraint Callback = custom_callback ;
g . SetNextWindowSizeConstraint CallbackUserData = custom_callback_user_data ;
g . NextWindowData . SizeConstraintCond = ImGuiCond_Always ;
g . NextWindowData . SizeConstraintRect = ImRect ( size_min , size_max ) ;
g . NextWindowData . Size Callback = custom_callback ;
g . NextWindowData . Size CallbackUserData = custom_callback_user_data ;
}
void ImGui : : SetNextWindowContentSize ( const ImVec2 & size )
{
ImGuiContext & g = * GImGui ;
g . Set NextWindowContentSizeVal = size ; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value.
g . Set NextWindowContentSizeCond = ImGuiCond_Always ;
g . NextWindowData . ContentSizeVal = size ; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value.
g . NextWindowData . ContentSizeCond = ImGuiCond_Always ;
}
void ImGui : : SetNextWindowCollapsed ( bool collapsed , ImGuiCond cond )
{
ImGuiContext & g = * GImGui ;
g . Set NextWindowCollapsedVal = collapsed ;
g . Set NextWindowCollapsedCond = cond ? cond : ImGuiCond_Always ;
g . NextWindowData . CollapsedVal = collapsed ;
g . NextWindowData . CollapsedCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : SetNextWindowFocus ( )
{
ImGuiContext & g = * GImGui ;
g . SetNextWindowFocus = true ;
g . NextWindowData . FocusCond = ImGuiCond_Always ;
}
// In window space (not screen space!)
@ -7656,11 +7646,11 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
ImGuiStorage * storage = window - > DC . StateStorage ;
bool is_open ;
if ( g . Set NextTreeNodeOpenCond ! = 0 )
if ( g . NextTreeNodeOpenCond ! = 0 )
{
if ( g . Set NextTreeNodeOpenCond & ImGuiCond_Always )
if ( g . NextTreeNodeOpenCond & ImGuiCond_Always )
{
is_open = g . Set NextTreeNodeOpenVal;
is_open = g . NextTreeNodeOpenVal ;
storage - > SetInt ( id , is_open ) ;
}
else
@ -7669,7 +7659,7 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
const int stored_value = storage - > GetInt ( id , - 1 ) ;
if ( stored_value = = - 1 )
{
is_open = g . Set NextTreeNodeOpenVal;
is_open = g . NextTreeNodeOpenVal ;
storage - > SetInt ( id , is_open ) ;
}
else
@ -7677,7 +7667,7 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
is_open = stored_value ! = 0 ;
}
}
g . Set NextTreeNodeOpenCond = 0 ;
g . NextTreeNodeOpenCond = 0 ;
}
else
{
@ -7963,8 +7953,8 @@ void ImGui::SetNextTreeNodeOpen(bool is_open, ImGuiCond cond)
ImGuiContext & g = * GImGui ;
if ( g . CurrentWindow - > SkipItems )
return ;
g . Set NextTreeNodeOpenVal = is_open ;
g . Set NextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always ;
g . NextTreeNodeOpenVal = is_open ;
g . NextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always ;
}
void ImGui : : PushID ( const char * str_id )
@ -10268,8 +10258,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 ;
bool backup_has _next_window_size_constraint = g . Set NextWindowSizeConstraint;
g . SetNextWindowSizeConstraint = false ;
ImGuiCond backup _next_window_size_constraint = g . NextWindowData . SizeConstraintCond ;
g . NextWindowData . SizeConstraintCond = 0 ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
@ -10312,10 +10302,10 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
if ( ! popup_open )
return false ;
if ( backup_has_ next_window_size_constraint )
if ( backup_next_window_size_constraint )
{
g . SetNextWindowSizeConstraint = true ;
g . Set NextWindowSizeConstraintRect. Min . x = ImMax ( g . Set NextWindowSizeConstraintRect. Min . x , w ) ;
g . NextWindowData . SizeConstraintCond = backup_next_window_size_constraint ;
g . NextWindowData . SizeConstraintRect . Min . x = ImMax ( g . NextWindowData . SizeConstraintRect . Min . x , w ) ;
}
else
{
@ -10377,7 +10367,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 . Set NextWindowSizeConstraint)
if ( popup_max_height_in_items ! = - 1 & & ! g . NextWindowData . SizeConstraintCond )
{
float popup_max_height = CalcMaxPopupHeightFromItemCount ( popup_max_height_in_items ) ;
SetNextWindowSizeConstraints ( ImVec2 ( 0 , 0 ) , ImVec2 ( FLT_MAX , popup_max_height ) ) ;