@ -3631,7 +3631,7 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst
ScrollTargetCenterRatio = ImVec2 ( 0.5f , 0.5f ) ;
AutoFitFramesX = AutoFitFramesY = - 1 ;
AutoPosLastDirection = ImGuiDir_None ;
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing ;
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = 0 ;
SetWindowPosVal = SetWindowPosPivot = ImVec2 ( FLT_MAX , FLT_MAX ) ;
LastFrameActive = - 1 ;
LastTimeActive = - 1.0f ;
@ -5360,32 +5360,22 @@ static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created,
window - > IsExplicitChild = new_is_explicit_child ;
}
static ImGuiWindow * CreateNewWindow ( const char * name , ImGuiWindowFlags fla gs)
static void InitOrLoadWindowSettings ( ImGuiWindow * window , ImGuiWindowSettings * settin gs)
{
ImGuiContext & g = * GImGui ;
//IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
// Create window the first time
ImGuiWindow * window = IM_NEW ( ImGuiWindow ) ( & g , name ) ;
window - > Flags = flags ;
g . WindowsById . SetVoidPtr ( window - > ID , window ) ;
// Default/arbitrary window position. Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window.
// Initial window state with e.g. default/arbitrary window position
// Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window.
const ImGuiViewport * main_viewport = ImGui : : GetMainViewport ( ) ;
window - > Pos = main_viewport - > Pos + ImVec2 ( 60 , 60 ) ;
window - > SetWindowPosAllowFlags = window - > SetWindowSizeAllowFlags = window - > SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing ;
// User can disable loading and saving of settings. Tooltip and child windows also don't store settings.
if ( ! ( flags & ImGuiWindowFlags_NoSavedSettings ) )
if ( ImGuiWindowSettings * settings = ImGui : : FindWindowSettingsByWindow ( window ) )
{
// Retrieve settings from .ini file
window - > SettingsOffset = g . SettingsWindows . offset_from_ptr ( settings ) ;
SetWindowConditionAllowFlags ( window , ImGuiCond_FirstUseEver , false ) ;
ApplyWindowSettings ( window , settings ) ;
}
if ( settings ! = NULL )
{
SetWindowConditionAllowFlags ( window , ImGuiCond_FirstUseEver , false ) ;
ApplyWindowSettings ( window , settings ) ;
}
window - > DC . CursorStartPos = window - > DC . CursorMaxPos = window - > DC . IdealMaxPos = window - > Pos ; // So first call to CalcWindowContentSizes() doesn't return crazy values
if ( ( f lags & ImGuiWindowFlags_AlwaysAutoResize ) ! = 0 )
if ( ( window - > Flags & ImGuiWindowFlags_AlwaysAutoResize ) ! = 0 )
{
window - > AutoFitFramesX = window - > AutoFitFramesY = 2 ;
window - > AutoFitOnlyGrows = false ;
@ -5398,6 +5388,23 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
window - > AutoFitFramesY = 2 ;
window - > AutoFitOnlyGrows = ( window - > AutoFitFramesX > 0 ) | | ( window - > AutoFitFramesY > 0 ) ;
}
}
static ImGuiWindow * CreateNewWindow ( const char * name , ImGuiWindowFlags flags )
{
// Create window the first time
//IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = IM_NEW ( ImGuiWindow ) ( & g , name ) ;
window - > Flags = flags ;
g . WindowsById . SetVoidPtr ( window - > ID , window ) ;
ImGuiWindowSettings * settings = NULL ;
if ( ! ( flags & ImGuiWindowFlags_NoSavedSettings ) )
if ( ( settings = ImGui : : FindWindowSettingsByWindow ( window ) ) ! = 0 )
window - > SettingsOffset = g . SettingsWindows . offset_from_ptr ( settings ) ;
InitOrLoadWindowSettings ( window , settings ) ;
if ( flags & ImGuiWindowFlags_NoBringToFrontOnFocus )
g . Windows . push_front ( window ) ; // Quite slow but rare and only once
@ -12699,6 +12706,20 @@ ImGuiWindowSettings* ImGui::FindWindowSettingsByWindow(ImGuiWindow* window)
return FindWindowSettingsByName ( window - > Name ) ; // Actual search executed once, so at this point we don't mind the redundant hashing.
}
// This will revert window to its initial state, including enabling the ImGuiCond_FirstUseEver/ImGuiCond_Once conditions once more.
void ImGui : : ClearWindowSettings ( const char * name )
{
//IMGUI_DEBUG_LOG("ClearWindowSettings('%s')\n", name);
ImGuiWindow * window = FindWindowByName ( name ) ;
if ( window ! = NULL )
{
window - > Flags | = ImGuiWindowFlags_NoSavedSettings ;
InitOrLoadWindowSettings ( window , NULL ) ;
}
if ( ImGuiWindowSettings * settings = window ? FindWindowSettingsByWindow ( window ) : FindWindowSettingsByName ( name ) )
settings - > WantDelete = true ;
}
static void WindowSettingsHandler_ClearAll ( ImGuiContext * ctx , ImGuiSettingsHandler * )
{
ImGuiContext & g = * ctx ;
@ -12765,12 +12786,15 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl
settings - > Size = ImVec2ih ( window - > SizeFull ) ;
settings - > Collapsed = window - > Collapsed ;
settings - > WantDelete = false ;
}
// Write to text buffer
buf - > reserve ( buf - > size ( ) + g . SettingsWindows . size ( ) * 6 ) ; // ballpark reserve
for ( ImGuiWindowSettings * settings = g . SettingsWindows . begin ( ) ; settings ! = NULL ; settings = g . SettingsWindows . next_chunk ( settings ) )
{
if ( settings - > WantDelete )
continue ;
const char * settings_name = settings - > GetName ( ) ;
buf - > appendf ( " [%s][%s] \n " , handler - > TypeName , settings_name ) ;
buf - > appendf ( " Pos=%d,%d \n " , settings - > Pos . x , settings - > Pos . y ) ;
@ -14106,8 +14130,12 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label)
void ImGui : : DebugNodeWindowSettings ( ImGuiWindowSettings * settings )
{
if ( settings - > WantDelete )
BeginDisabled ( ) ;
Text ( " 0x%08X \" %s \" Pos (%d,%d) Size (%d,%d) Collapsed=%d " ,
settings - > ID , settings - > GetName ( ) , settings - > Pos . x , settings - > Pos . y , settings - > Size . x , settings - > Size . y , settings - > Collapsed ) ;
if ( settings - > WantDelete )
EndDisabled ( ) ;
}
void ImGui : : DebugNodeWindowsList ( ImVector < ImGuiWindow * > * windows , const char * label )