@ -3299,7 +3299,7 @@ void ImGui::NewFrame()
// No window should be open at the beginning of the frame.
// But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear.
g . CurrentWindowStack . resize ( 0 ) ;
g . Current PopupStack. resize ( 0 ) ;
g . Begin PopupStack. resize ( 0 ) ;
ClosePopupsOverWindow ( g . NavWindow ) ;
// Create implicit/fallback window - which we will only render it if the user has added something to it.
@ -3373,7 +3373,7 @@ void ImGui::Shutdown(ImGuiContext* context)
g . StyleModifiers . clear ( ) ;
g . FontStack . clear ( ) ;
g . OpenPopupStack . clear ( ) ;
g . Current PopupStack. clear ( ) ;
g . Begin PopupStack. clear ( ) ;
g . DrawDataBuilder . ClearFreeMemory ( ) ;
g . OverlayDrawList . ClearFreeMemory ( ) ;
g . PrivateClipboard . clear ( ) ;
@ -3942,8 +3942,8 @@ ImVec2 ImGui::GetMousePos()
ImVec2 ImGui : : GetMousePosOnOpeningCurrentPopup ( )
{
ImGuiContext & g = * GImGui ;
if ( g . Current PopupStack. Size > 0 )
return g . OpenPopupStack [ g . Current PopupStack. Size - 1 ] . OpenMousePos ;
if ( g . Begin PopupStack. Size > 0 )
return g . OpenPopupStack [ g . Begin PopupStack. Size - 1 ] . OpenMousePos ;
return g . IO . MousePos ;
}
@ -4224,7 +4224,7 @@ static void CheckStacksSize(ImGuiWindow* window, bool write)
short * p_backup = & window - > DC . StackSizesBackup [ 0 ] ;
{ int current = window - > IDStack . Size ; if ( write ) * p_backup = ( short ) current ; else IM_ASSERT ( * p_backup = = current & & " PushID/PopID or TreeNode/TreePop Mismatch! " ) ; p_backup + + ; } // Too few or too many PopID()/TreePop()
{ int current = window - > DC . GroupStack . Size ; if ( write ) * p_backup = ( short ) current ; else IM_ASSERT ( * p_backup = = current & & " BeginGroup/EndGroup Mismatch! " ) ; p_backup + + ; } // Too few or too many EndGroup()
{ int current = g . CurrentPopupStack. Size ; if ( write ) * p_backup = ( short ) current ; else IM_ASSERT ( * p_backup = = current & & " BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch " ) ; p_backup + + ; } // Too few or too many EndMenu()/EndPopup()
{ int current = g . BeginPopupStack. Size ; if ( write ) * p_backup = ( short ) current ; else IM_ASSERT ( * p_backup = = current & & " BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch " ) ; p_backup + + ; } // Too few or too many EndMenu()/EndPopup()
// For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them.
{ int current = g . ColorModifiers . Size ; if ( write ) * p_backup = ( short ) current ; else IM_ASSERT ( * p_backup > = current & & " PushStyleColor/PopStyleColor Mismatch! " ) ; p_backup + + ; } // Too few or too many PopStyleColor()
{ int current = g . StyleModifiers . Size ; if ( write ) * p_backup = ( short ) current ; else IM_ASSERT ( * p_backup > = current & & " PushStyleVar/PopStyleVar Mismatch! " ) ; p_backup + + ; } // Too few or too many PopStyleVar()
@ -4638,7 +4638,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
const bool window_just_appearing_after_hidden_for_resize = ( window - > HiddenFramesForResize > 0 ) ;
if ( flags & ImGuiWindowFlags_Popup )
{
ImGuiPopupRef & popup_ref = g . OpenPopupStack [ g . Current PopupStack. Size ] ;
ImGuiPopupRef & popup_ref = g . OpenPopupStack [ g . Begin PopupStack. Size ] ;
window_just_activated_by_user | = ( window - > PopupId ! = popup_ref . PopupId ) ; // We recycle popups so treat window as activated if popup id changed
window_just_activated_by_user | = ( window ! = popup_ref . Window ) ;
}
@ -4652,9 +4652,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
CheckStacksSize ( window , true ) ;
if ( flags & ImGuiWindowFlags_Popup )
{
ImGuiPopupRef & popup_ref = g . OpenPopupStack [ g . Current PopupStack. Size ] ;
ImGuiPopupRef & popup_ref = g . OpenPopupStack [ g . Begin PopupStack. Size ] ;
popup_ref . Window = window ;
g . Current PopupStack. push_back ( popup_ref ) ;
g . Begin PopupStack. push_back ( popup_ref ) ;
window - > PopupId = popup_ref . PopupId ;
}
@ -4829,7 +4829,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
window - > AutoPosLastDirection = ImGuiDir_None ;
if ( ( flags & ImGuiWindowFlags_Popup ) ! = 0 & & ! window_pos_set_by_api )
window - > Pos = g . Current PopupStack. back ( ) . OpenPopupPos ;
window - > Pos = g . Begin PopupStack. back ( ) . OpenPopupPos ;
}
// Position child window
@ -5232,7 +5232,7 @@ void ImGui::End()
// Pop from window stack
g . CurrentWindowStack . pop_back ( ) ;
if ( window - > Flags & ImGuiWindowFlags_Popup )
g . Current PopupStack. pop_back ( ) ;
g . Begin PopupStack. pop_back ( ) ;
CheckStacksSize ( window , false ) ;
SetCurrentWindow ( g . CurrentWindowStack . empty ( ) ? NULL : g . CurrentWindowStack . back ( ) ) ;
}
@ -6428,13 +6428,13 @@ void ImGui::SetTooltip(const char* fmt, ...)
bool ImGui : : IsPopupOpen ( ImGuiID id )
{
ImGuiContext & g = * GImGui ;
return g . OpenPopupStack . Size > g . Current PopupStack. Size & & g . OpenPopupStack [ g . Current PopupStack. Size ] . PopupId = = id ;
return g . OpenPopupStack . Size > g . Begin PopupStack. Size & & g . OpenPopupStack [ g . Begin PopupStack. Size ] . PopupId = = id ;
}
bool ImGui : : IsPopupOpen ( const char * str_id )
{
ImGuiContext & g = * GImGui ;
return g . OpenPopupStack . Size > g . Current PopupStack. Size & & g . OpenPopupStack [ g . Current PopupStack. Size ] . PopupId = = g . CurrentWindow - > GetID ( str_id ) ;
return g . OpenPopupStack . Size > g . Begin PopupStack. Size & & g . OpenPopupStack [ g . Begin PopupStack. Size ] . PopupId = = g . CurrentWindow - > GetID ( str_id ) ;
}
ImGuiWindow * ImGui : : GetFrontMostPopupModal ( )
@ -6461,7 +6461,7 @@ void ImGui::OpenPopupEx(ImGuiID id)
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * parent_window = g . CurrentWindow ;
int current_stack_size = g . Current PopupStack. Size ;
int current_stack_size = g . Begin PopupStack. Size ;
ImGuiPopupRef popup_ref ; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
popup_ref . PopupId = id ;
popup_ref . Window = NULL ;
@ -6565,8 +6565,8 @@ void ImGui::ClosePopupToLevel(int remaining)
void ImGui : : CloseCurrentPopup ( )
{
ImGuiContext & g = * GImGui ;
int popup_idx = g . Current PopupStack. Size - 1 ;
if ( popup_idx < 0 | | popup_idx > = g . OpenPopupStack . Size | | g . Current PopupStack[ popup_idx ] . PopupId ! = g . OpenPopupStack [ popup_idx ] . PopupId )
int popup_idx = g . Begin PopupStack. Size - 1 ;
if ( popup_idx < 0 | | popup_idx > = g . OpenPopupStack . Size | | g . Begin PopupStack[ popup_idx ] . PopupId ! = g . OpenPopupStack [ popup_idx ] . PopupId )
return ;
while ( popup_idx > 0 & & g . OpenPopupStack [ popup_idx ] . Window & & ( g . OpenPopupStack [ popup_idx ] . Window - > Flags & ImGuiWindowFlags_ChildMenu ) )
popup_idx - - ;
@ -6584,7 +6584,7 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags)
char name [ 20 ] ;
if ( extra_flags & ImGuiWindowFlags_ChildMenu )
ImFormatString ( name , IM_ARRAYSIZE ( name ) , " ##Menu_%02d " , g . Current PopupStack. Size ) ; // Recycle windows based on depth
ImFormatString ( name , IM_ARRAYSIZE ( name ) , " ##Menu_%02d " , g . Begin PopupStack. Size ) ; // Recycle windows based on depth
else
ImFormatString ( name , IM_ARRAYSIZE ( name ) , " ##Popup_%08x " , id ) ; // Not recycling, so we can close/open during the same frame
@ -6598,7 +6598,7 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags)
bool ImGui : : BeginPopup ( const char * str_id , ImGuiWindowFlags flags )
{
ImGuiContext & g = * GImGui ;
if ( g . OpenPopupStack . Size < = g . Current PopupStack. Size ) // Early out for performance
if ( g . OpenPopupStack . Size < = g . Begin PopupStack. Size ) // Early out for performance
{
g . NextWindowData . Clear ( ) ; // We behave like Begin() and need to consume those values
return false ;
@ -6631,7 +6631,7 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
{
EndPopup ( ) ;
if ( is_open )
ClosePopupToLevel ( g . Current PopupStack. Size ) ;
ClosePopupToLevel ( g . Begin PopupStack. Size ) ;
return false ;
}
return is_open ;
@ -6641,7 +6641,7 @@ void ImGui::EndPopup()
{
ImGuiContext & g = * GImGui ; ( void ) g ;
IM_ASSERT ( g . CurrentWindow - > Flags & ImGuiWindowFlags_Popup ) ; // Mismatched BeginPopup()/EndPopup() calls
IM_ASSERT ( g . Current PopupStack. Size > 0 ) ;
IM_ASSERT ( g . Begin PopupStack. Size > 0 ) ;
// Make all menus and popups wrap around for now, may need to expose that policy.
NavMoveRequestTryWrapping ( g . CurrentWindow , ImGuiNavMoveFlags_LoopY ) ;