@ -906,7 +906,7 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* wind
static void AddDrawListToDrawData ( ImVector < ImDrawList * > * out_list , ImDrawList * draw_list ) ;
static void AddWindowToDrawData ( ImVector < ImDrawList * > * out_list , ImGuiWindow * window ) ;
static void AddWindowToSort ed Buffer( ImVector < ImGuiWindow * > * out_sorted_windows , ImGuiWindow * window ) ;
static void AddWindowToSort Buffer( ImVector < ImGuiWindow * > * out_sorted_windows , ImGuiWindow * window ) ;
static ImRect GetViewportRect ( ) ;
@ -3225,6 +3225,7 @@ void ImGui::NewFrame()
g . NavIdTabCounter = INT_MAX ;
// Mark all windows as not visible
IM_ASSERT ( g . WindowsFocusOrder . Size = = g . Windows . Size ) ;
for ( int i = 0 ; i ! = g . Windows . Size ; i + + )
{
ImGuiWindow * window = g . Windows [ i ] ;
@ -3235,7 +3236,7 @@ void ImGui::NewFrame()
// Closing the focused window restore focus to the first active root window in descending z-order
if ( g . NavWindow & & ! g . NavWindow - > WasActive )
Focus FrontMostActive WindowIgnoringOne( NULL ) ;
Focus Previous WindowIgnoringOne( NULL ) ;
// 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.
@ -3292,6 +3293,7 @@ void ImGui::Shutdown(ImGuiContext* context)
for ( int i = 0 ; i < g . Windows . Size ; i + + )
IM_DELETE ( g . Windows [ i ] ) ;
g . Windows . clear ( ) ;
g . WindowsFocusOrder . clear ( ) ;
g . WindowsSortBuffer . clear ( ) ;
g . CurrentWindow = NULL ;
g . CurrentWindowStack . clear ( ) ;
@ -3340,7 +3342,7 @@ static int IMGUI_CDECL ChildWindowComparer(const void* lhs, const void* rhs)
return ( a - > BeginOrderWithinParent - b - > BeginOrderWithinParent ) ;
}
static void AddWindowToSort ed Buffer( ImVector < ImGuiWindow * > * out_sorted_windows , ImGuiWindow * window )
static void AddWindowToSort Buffer( ImVector < ImGuiWindow * > * out_sorted_windows , ImGuiWindow * window )
{
out_sorted_windows - > push_back ( window ) ;
if ( window - > Active )
@ -3352,7 +3354,7 @@ static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>* out_sorted_windows,
{
ImGuiWindow * child = window - > DC . ChildWindows [ i ] ;
if ( child - > Active )
AddWindowToSort ed Buffer( out_sorted_windows , child ) ;
AddWindowToSort Buffer( out_sorted_windows , child ) ;
}
}
}
@ -3550,7 +3552,7 @@ void ImGui::EndFrame()
ImGuiWindow * window = g . Windows [ i ] ;
if ( window - > Active & & ( window - > Flags & ImGuiWindowFlags_ChildWindow ) ) // if a child is active its parent will add it
continue ;
AddWindowToSort ed Buffer( & g . WindowsSortBuffer , window ) ;
AddWindowToSort Buffer( & g . WindowsSortBuffer , window ) ;
}
IM_ASSERT ( g . Windows . Size = = g . WindowsSortBuffer . Size ) ; // we done something wrong
@ -4204,8 +4206,9 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
window - > AutoFitOnlyGrows = ( window - > AutoFitFramesX > 0 ) | | ( window - > AutoFitFramesY > 0 ) ;
}
g . WindowsFocusOrder . push_back ( window ) ;
if ( flags & ImGuiWindowFlags_NoBringToFrontOnFocus )
g . Windows . insert( g . Windows . begin ( ) , window ) ; // Quite slow but rare and only once
g . Windows . push_front( window ) ; // Quite slow but rare and only once
else
g . Windows . push_back ( window ) ;
return window ;
@ -5125,7 +5128,21 @@ void ImGui::End()
SetCurrentWindow ( g . CurrentWindowStack . empty ( ) ? NULL : g . CurrentWindowStack . back ( ) ) ;
}
void ImGui : : BringWindowToFront ( ImGuiWindow * window )
void ImGui : : BringWindowToFocusFront ( ImGuiWindow * window )
{
ImGuiContext & g = * GImGui ;
if ( g . WindowsFocusOrder . back ( ) = = window )
return ;
for ( int i = g . WindowsFocusOrder . Size - 2 ; i > = 0 ; i - - ) // We can ignore the front most window
if ( g . WindowsFocusOrder [ i ] = = window )
{
memmove ( & g . WindowsFocusOrder [ i ] , & g . WindowsFocusOrder [ i + 1 ] , ( size_t ) ( g . WindowsFocusOrder . Size - i - 1 ) * sizeof ( ImGuiWindow * ) ) ;
g . WindowsFocusOrder [ g . WindowsFocusOrder . Size - 1 ] = window ;
break ;
}
}
void ImGui : : BringWindowToDisplayFront ( ImGuiWindow * window )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * current_front_window = g . Windows . back ( ) ;
@ -5134,13 +5151,13 @@ void ImGui::BringWindowToFront(ImGuiWindow* window)
for ( int i = g . Windows . Size - 2 ; i > = 0 ; i - - ) // We can ignore the front most window
if ( g . Windows [ i ] = = window )
{
g. Windows . erase ( g . Windows . Data + i ) ;
g . Windows .push_back ( window ) ;
memmove( & g . Windows [ i ] , & g . Windows [ i + 1 ] , ( size_t ) ( g . Windows . Size - i - 1 ) * sizeof ( ImGuiWindow * ) ) ;
g . Windows [g . Windows . Size - 1 ] = window ;
break ;
}
}
void ImGui : : BringWindowTo Back( ImGuiWindow * window )
void ImGui : : BringWindowTo Display Back( ImGuiWindow * window )
{
ImGuiContext & g = * GImGui ;
if ( g . Windows [ 0 ] = = window )
@ -5185,20 +5202,24 @@ void ImGui::FocusWindow(ImGuiWindow* window)
ClearActiveID ( ) ;
// Bring to front
BringWindowToFocusFront ( window ) ;
if ( ! ( window - > Flags & ImGuiWindowFlags_NoBringToFrontOnFocus ) )
BringWindowTo Front( window ) ;
BringWindowTo Display Front( window ) ;
}
void ImGui : : Focus FrontMostActive WindowIgnoringOne( ImGuiWindow * ignore_window )
void ImGui : : Focus Previous WindowIgnoringOne( ImGuiWindow * ignore_window )
{
ImGuiContext & g = * GImGui ;
for ( int i = g . Windows . Size - 1 ; i > = 0 ; i - - )
if ( g . Windows [ i ] ! = ignore_window & & g . Windows [ i ] - > WasActive & & ! ( g . Windows [ i ] - > Flags & ImGuiWindowFlags_ChildWindow ) )
for ( int i = g . WindowsFocusOrder . Size - 1 ; i > = 0 ; i - - )
{
ImGuiWindow * window = g . WindowsFocusOrder [ i ] ;
if ( window ! = ignore_window & & window - > WasActive & & ! ( window - > Flags & ImGuiWindowFlags_ChildWindow ) )
{
ImGuiWindow * focus_window = NavRestoreLastChildNavWindow ( g . Windows [ i ] ) ;
ImGuiWindow * focus_window = NavRestoreLastChildNavWindow ( window ) ;
FocusWindow ( focus_window ) ;
return ;
}
}
}
void ImGui : : PushItemWidth ( float item_width )
@ -7436,11 +7457,11 @@ static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags)
return 0.0f ;
}
static int FindWindow Index( ImGuiWindow * window ) // FIXME-OPT O(N)
static int FindWindow Focus Index( ImGuiWindow * window ) // FIXME-OPT O(N)
{
ImGuiContext & g = * GImGui ;
for ( int i = g . Windows . Size - 1 ; i > = 0 ; i - - )
if ( g . Windows [ i ] = = window )
for ( int i = g . Windows FocusOrder . Size - 1 ; i > = 0 ; i - - )
if ( g . Windows FocusOrder [ i ] = = window )
return i ;
return - 1 ;
}
@ -7448,9 +7469,9 @@ static int FindWindowIndex(ImGuiWindow* window) // FIXME-OPT O(N)
static ImGuiWindow * FindWindowNavFocusable ( int i_start , int i_stop , int dir ) // FIXME-OPT O(N)
{
ImGuiContext & g = * GImGui ;
for ( int i = i_start ; i > = 0 & & i < g . Windows . Size & & i ! = i_stop ; i + = dir )
if ( ImGui : : IsWindowNavFocusable ( g . Windows [ i ] ) )
return g . Windows [ i ] ;
for ( int i = i_start ; i > = 0 & & i < g . Windows FocusOrder . Size & & i ! = i_stop ; i + = dir )
if ( ImGui : : IsWindowNavFocusable ( g . Windows FocusOrder [ i ] ) )
return g . Windows FocusOrder [ i ] ;
return NULL ;
}
@ -7461,10 +7482,10 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
if ( g . NavWindowingTarget - > Flags & ImGuiWindowFlags_Modal )
return ;
const int i_current = FindWindow Index( g . NavWindowingTarget ) ;
const int i_current = FindWindow Focus Index( g . NavWindowingTarget ) ;
ImGuiWindow * window_target = FindWindowNavFocusable ( i_current + focus_change_dir , - INT_MAX , focus_change_dir ) ;
if ( ! window_target )
window_target = FindWindowNavFocusable ( ( focus_change_dir < 0 ) ? ( g . Windows . Size - 1 ) : 0 , i_current , focus_change_dir ) ;
window_target = FindWindowNavFocusable ( ( focus_change_dir < 0 ) ? ( g . Windows FocusOrder . Size - 1 ) : 0 , i_current , focus_change_dir ) ;
if ( window_target ) // Don't reset windowing target if there's a single window in the list
g . NavWindowingTarget = g . NavWindowingTargetAnim = window_target ;
g . NavWindowingToggleLayer = false ;
@ -7496,7 +7517,7 @@ static void ImGui::NavUpdateWindowing()
bool start_windowing_with_gamepad = ! g . NavWindowingTarget & & IsNavInputPressed ( ImGuiNavInput_Menu , ImGuiInputReadMode_Pressed ) ;
bool start_windowing_with_keyboard = ! g . NavWindowingTarget & & g . IO . KeyCtrl & & IsKeyPressedMap ( ImGuiKey_Tab ) & & ( g . IO . ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard ) ;
if ( start_windowing_with_gamepad | | start_windowing_with_keyboard )
if ( ImGuiWindow * window = g . NavWindow ? g . NavWindow : FindWindowNavFocusable ( g . Windows . Size - 1 , - INT_MAX , - 1 ) )
if ( ImGuiWindow * window = g . NavWindow ? g . NavWindow : FindWindowNavFocusable ( g . Windows FocusOrder . Size - 1 , - INT_MAX , - 1 ) )
{
g . NavWindowingTarget = g . NavWindowingTargetAnim = window ;
g . NavWindowingTimer = g . NavWindowingHighlightAlpha = 0.0f ;
@ -7628,9 +7649,9 @@ void ImGui::NavUpdateWindowingList()
SetNextWindowPos ( g . IO . DisplaySize * 0.5f , ImGuiCond_Always , ImVec2 ( 0.5f , 0.5f ) ) ;
PushStyleVar ( ImGuiStyleVar_WindowPadding , g . Style . WindowPadding * 2.0f ) ;
Begin ( " ###NavWindowingList " , NULL , ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings ) ;
for ( int n = g . Windows . Size - 1 ; n > = 0 ; n - - )
for ( int n = g . Windows FocusOrder . Size - 1 ; n > = 0 ; n - - )
{
ImGuiWindow * window = g . Windows [ n ] ;
ImGuiWindow * window = g . Windows FocusOrder [ n ] ;
if ( ! IsWindowNavFocusable ( window ) )
continue ;
const char * label = window - > Name ;