@ -917,6 +917,8 @@ static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted
static ImRect GetViewportRect ( ) ;
// Settings
static void WindowSettingsHandler_ClearAll ( ImGuiContext * , ImGuiSettingsHandler * ) ;
static void WindowSettingsHandler_ApplyAll ( ImGuiContext * , ImGuiSettingsHandler * ) ;
static void * WindowSettingsHandler_ReadOpen ( ImGuiContext * , ImGuiSettingsHandler * , const char * name ) ;
static void WindowSettingsHandler_ReadLine ( ImGuiContext * , ImGuiSettingsHandler * , void * entry , const char * line ) ;
static void WindowSettingsHandler_WriteAll ( ImGuiContext * , ImGuiSettingsHandler * , ImGuiTextBuffer * buf ) ;
@ -3941,6 +3943,8 @@ void ImGui::Initialize(ImGuiContext* context)
ImGuiSettingsHandler ini_handler ;
ini_handler . TypeName = " Window " ;
ini_handler . TypeHash = ImHashStr ( " Window " ) ;
ini_handler . ClearAllFn = WindowSettingsHandler_ClearAll ;
ini_handler . ApplyAllFn = WindowSettingsHandler_ApplyAll ;
ini_handler . ReadOpenFn = WindowSettingsHandler_ReadOpen ;
ini_handler . ReadLineFn = WindowSettingsHandler_ReadLine ;
ini_handler . WriteAllFn = WindowSettingsHandler_WriteAll ;
@ -9707,9 +9711,9 @@ void ImGui::ClearIniSettings()
{
ImGuiContext & g = * GImGui ;
g . SettingsIniData . clear ( ) ;
for ( int i = 0 ; i ! = g . Windows . Size ; i + + )
g . Windows [ i ] - > SettingsOffset = - 1 ;
g . SettingsWindows . clear ( ) ;
for ( int handler_n = 0 ; handler_n < g . SettingsHandlers . Size ; handler_n + + )
if ( g . SettingsHandlers [ handler_n ] . ClearAllFn )
g . SettingsHandlers [ handler_n ] . ClearAllFn ( & g , & g . SettingsHandlers [ handler_n ] ) ;
}
void ImGui : : LoadIniSettingsFromDisk ( const char * ini_filename )
@ -9727,7 +9731,8 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
{
ImGuiContext & g = * GImGui ;
IM_ASSERT ( g . Initialized ) ;
IM_ASSERT ( g . SettingsLoaded = = false & & g . FrameCount = = 0 ) ;
//IM_ASSERT(!g.WithinFrameScope && "Cannot be called between NewFrame() and EndFrame()");
//IM_ASSERT(g.SettingsLoaded == false && g.FrameCount == 0);
// For user convenience, we allow passing a non zero-terminated string (hence the ini_size parameter).
// For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy..
@ -9779,6 +9784,11 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
// [DEBUG] Restore untouched copy so it can be browsed in Metrics (not strictly necessary)
memcpy ( buf , ini_data , ini_size ) ;
// Call post-read handlers
for ( int handler_n = 0 ; handler_n < g . SettingsHandlers . Size ; handler_n + + )
if ( g . SettingsHandlers [ handler_n ] . ApplyAllFn )
g . SettingsHandlers [ handler_n ] . ApplyAllFn ( & g , & g . SettingsHandlers [ handler_n ] ) ;
}
void ImGui : : SaveIniSettingsToDisk ( const char * ini_filename )
@ -9814,11 +9824,33 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size)
return g . SettingsIniData . c_str ( ) ;
}
static void WindowSettingsHandler_ClearAll ( ImGuiContext * ctx , ImGuiSettingsHandler * )
{
ImGuiContext & g = * ctx ;
for ( int i = 0 ; i ! = g . Windows . Size ; i + + )
g . Windows [ i ] - > SettingsOffset = - 1 ;
g . SettingsWindows . clear ( ) ;
}
// Apply to existing windows (if any)
static void WindowSettingsHandler_ApplyAll ( ImGuiContext * ctx , ImGuiSettingsHandler * )
{
ImGuiContext & g = * ctx ;
for ( ImGuiWindowSettings * settings = g . SettingsWindows . begin ( ) ; settings ! = NULL ; settings = g . SettingsWindows . next_chunk ( settings ) )
if ( settings - > WantApply )
{
if ( ImGuiWindow * window = ImGui : : FindWindowByID ( settings - > ID ) )
ApplyWindowSettings ( window , settings ) ;
settings - > WantApply = false ;
}
}
static void * WindowSettingsHandler_ReadOpen ( ImGuiContext * , ImGuiSettingsHandler * , const char * name )
{
ImGuiWindowSettings * settings = ImGui : : FindWindowSettings ( ImHashStr ( name ) ) ;
if ( ! settings )
settings = ImGui : : CreateNewWindowSettings ( name ) ;
settings - > WantApply = true ;
return ( void * ) settings ;
}