@ -2120,6 +2120,7 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
CollapseToggleWanted = false ;
SkipItems = false ;
Appearing = false ;
Hidden = false ;
HasCloseButton = false ;
BeginOrderWithinParent = - 1 ;
BeginOrderWithinContext = - 1 ;
@ -2129,7 +2130,7 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
AutoFitOnlyGrows = false ;
AutoFitChildAxises = 0x00 ;
AutoPosLastDirection = ImGuiDir_None ;
HiddenFrames = 0 ;
HiddenFrames Regular = HiddenFramesForResize = 0 ;
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing ;
SetWindowPosVal = SetWindowPosPivot = ImVec2 ( FLT_MAX , FLT_MAX ) ;
@ -3665,7 +3666,7 @@ void ImGui::UpdateMouseMovingWindow()
static bool IsWindowActiveAndVisible ( ImGuiWindow * window )
{
return ( window - > HiddenFrames = = 0 ) & & ( window - > Active ) ;
return ( window - > Active) & & ( ! window - > Hidden ) ;
}
static void ImGui : : UpdateMouseInputs ( )
@ -4340,7 +4341,7 @@ static void AddWindowToDrawData(ImVector<ImDrawList*>* out_render_list, ImGuiWin
for ( int i = 0 ; i < window - > DC . ChildWindows . Size ; i + + )
{
ImGuiWindow * child = window - > DC . ChildWindows [ i ] ;
if ( child- > Active & & child - > HiddenFrames = = 0 ) // clipped children may have been marked not active
if ( IsWindowActiveAndVisible( child ) ) // clipped children may have been marked not active
AddWindowToDrawData ( out_render_list , child ) ;
}
}
@ -4924,7 +4925,7 @@ static void FindHoveredWindow()
for ( int i = g . Windows . Size - 1 ; i > = 0 & & hovered_window = = NULL ; i - - )
{
ImGuiWindow * window = g . Windows [ i ] ;
if ( ! window - > Active )
if ( ! window - > Active | | window - > Hidden )
continue ;
if ( window - > Flags & ImGuiWindowFlags_NoInputs )
continue ;
@ -5251,7 +5252,8 @@ void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_
if ( window - > Active )
{
// Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one.
window - > HiddenFrames = 1 ;
window - > Hidden = true ;
window - > HiddenFramesRegular = 1 ;
ImFormatString ( window_name , IM_ARRAYSIZE ( window_name ) , " ##Tooltip_%02d " , + + g . TooltipOverrideCount ) ;
}
ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav ;
@ -6220,7 +6222,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Update the Appearing flag
bool window_just_activated_by_user = ( window - > LastFrameActive < current_frame - 1 ) ; // Not using !WasActive because the implicit "Debug" window would always toggle off->on
const bool window_just_appearing_after_hidden_for_resize = ( window - > HiddenFrames > 0 ) ;
const bool window_just_appearing_after_hidden_for_resize = ( window - > HiddenFrames ForResize > 0 ) ;
if ( flags & ImGuiWindowFlags_Popup )
{
ImGuiPopupRef & popup_ref = g . OpenPopupStack [ g . CurrentPopupStack . Size ] ;
@ -6316,18 +6318,20 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Update contents size from last frame for auto-fitting (or use explicit size)
window - > SizeContents = CalcSizeContents ( window ) ;
if ( window - > HiddenFrames > 0 )
window - > HiddenFrames - - ;
if ( window - > HiddenFramesRegular > 0 )
window - > HiddenFramesRegular - - ;
if ( window - > HiddenFramesForResize > 0 )
window - > HiddenFramesForResize - - ;
// Hide new windows for one frame until they calculate their size
if ( window_just_created & & ( ! window_size_x_set_by_api | | ! window_size_y_set_by_api ) )
window - > HiddenFrames = 1 ;
window - > HiddenFrames ForResize = 1 ;
// Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows)
// We reset Size/SizeContents for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size.
if ( window_just_activated_by_user & & ( flags & ( ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip ) ) ! = 0 )
{
window - > HiddenFrames = 1 ;
window - > HiddenFrames ForResize = 1 ;
if ( flags & ImGuiWindowFlags_AlwaysAutoResize )
{
if ( ! window_size_x_set_by_api )
@ -6432,7 +6436,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > Pos = parent_window - > DC . CursorPos ;
}
const bool window_pos_with_pivot = ( window - > SetWindowPosVal . x ! = FLT_MAX & & window - > HiddenFrames = = 0 ) ;
const bool window_pos_with_pivot = ( window - > SetWindowPosVal . x ! = FLT_MAX & & window - > HiddenFrames ForResize = = 0 ) ;
if ( window_pos_with_pivot )
SetWindowPos ( window , ImMax ( style . DisplaySafeAreaPadding , window - > SetWindowPosVal - window - > SizeFull * window - > SetWindowPosPivot ) , 0 ) ; // Position given a pivot (e.g. for centering)
else if ( ( flags & ImGuiWindowFlags_ChildMenu ) ! = 0 )
@ -6500,7 +6504,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
PushClipRect ( viewport_rect . Min , viewport_rect . Max , true ) ;
// Draw modal window background (darkens what is behind them, all viewports)
const bool dim_bg_for_modal = ( flags & ImGuiWindowFlags_Modal ) & & window = = GetFrontMostPopupModal ( ) & & window - > HiddenFrames < = 0 ;
const bool dim_bg_for_modal = ( flags & ImGuiWindowFlags_Modal ) & & window = = GetFrontMostPopupModal ( ) & & window - > HiddenFrames ForResize < = 0 ;
const bool dim_bg_for_window_list = g . NavWindowingTargetAnim & & ( window = = g . NavWindowingTargetAnim - > RootWindow ) ;
if ( dim_bg_for_modal | | dim_bg_for_window_list )
{
@ -6750,29 +6754,31 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > BeginCount + + ;
g . NextWindowData . Clear ( ) ;
if ( flags & ImGuiWindowFlags_ChildWindow )
{
// 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 them because they have no title bar).
IM_ASSERT ( ( flags & ImGuiWindowFlags_NoTitleBar ) ! = 0 ) ;
window - > Collapsed = parent_window & & parent_window - > Collapsed ;
if ( ! ( flags & ImGuiWindowFlags_AlwaysAutoResize ) & & window - > AutoFitFramesX < = 0 & & window - > AutoFitFramesY < = 0 )
window - > Collapsed | = ( window - > OuterRectClipped . Min . x > = window - > OuterRectClipped . Max . x | | window - > OuterRectClipped . Min . y > = window - > OuterRectClipped . Max . y ) ;
if ( window - > OuterRectClipped . Min . x > = window - > OuterRectClipped . Max . x | | window - > OuterRectClipped . Min . y > = window - > OuterRectClipped . Max . y )
window - > HiddenFramesRegular = 1 ;
// We also hide the window from rendering because we've already added its border to the command list.
// (we could perform the check earlier in the function but it is simpler at this point)
if ( window - > Collapsed )
window - > Active = false ;
// Completely hide along with parent or if parent is collapsed
if ( parent_window & & ( parent_window - > Collapsed | | parent_window - > Hidden ) )
window - > HiddenFramesRegular = 1 ;
}
// Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point)
if ( style . Alpha < = 0.0f )
window - > Active = false ;
window - > HiddenFramesRegular = 1 ;
// Update the Hidden flag
window - > Hidden = ( window - > HiddenFramesRegular > 0 ) | | ( window - > HiddenFramesForResize ) ;
// Return false if we don't intend to display anything to allow user to perform an early out optimization
window - > SkipItems = ( window - > Collapsed | | ! window - > Active ) & & window - > AutoFitFramesX < = 0 & & window - > AutoFitFramesY < = 0 ;
window - > SkipItems = ( window - > Collapsed | | ! window - > Active | | window - > Hidden ) & & window - > AutoFitFramesX < = 0 & & window - > AutoFitFramesY < = 0 & & window - > HiddenFramesForResize < = 0 ;
return ! window - > SkipItems ;
}
@ -13667,7 +13673,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
{
ImGuiWindow * tooltip_window = g . CurrentWindow ;
tooltip_window - > SkipItems = true ;
tooltip_window - > HiddenFrames = 1 ;
tooltip_window - > HiddenFrames Regular = 1 ;
}
}
@ -14073,6 +14079,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
( flags & ImGuiWindowFlags_NoInputs ) ? " NoInputs " : " " , ( flags & ImGuiWindowFlags_AlwaysAutoResize ) ? " AlwaysAutoResize " : " " ) ;
ImGui : : BulletText ( " Scroll: (%.2f/%.2f,%.2f/%.2f) " , window - > Scroll . x , GetScrollMaxX ( window ) , window - > Scroll . y , GetScrollMaxY ( window ) ) ;
ImGui : : BulletText ( " Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d " , window - > Active , window - > WasActive , window - > WriteAccessed , ( window - > Active | | window - > WasActive ) ? window - > BeginOrderWithinContext : - 1 ) ;
ImGui : : BulletText ( " Appearing: %d, Hidden: %d (Reg %d Resize %d), SkipItems: %d " , window - > Appearing , window - > Hidden , window - > HiddenFramesRegular , window - > HiddenFramesForResize , window - > SkipItems ) ;
ImGui : : BulletText ( " NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X " , window - > NavLastIds [ 0 ] , window - > NavLastIds [ 1 ] , window - > DC . NavLayerActiveMask ) ;
ImGui : : BulletText ( " NavLastChildNavWindow: %s " , window - > NavLastChildNavWindow ? window - > NavLastChildNavWindow - > Name : " NULL " ) ;
if ( ! window - > NavRectRel [ 0 ] . IsInverted ( ) )