Internals: Settings: added ClearWindowSettings(). Extract part of CreateNewWindow() into InitOrLoadWindowSettings().
Designed to that if the window reappear in the session it won't take an additional slot.
diff --git a/imgui.cpp b/imgui.cpp
index 073f12f..fc7e963 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -3631,7 +3631,7 @@
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 @@
window->IsExplicitChild = new_is_explicit_child;
}
-static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
+static void InitOrLoadWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings)
{
- 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 ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
+ if ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
{
window->AutoFitFramesX = window->AutoFitFramesY = 2;
window->AutoFitOnlyGrows = false;
@@ -5398,6 +5388,23 @@
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 @@
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 @@
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::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)
diff --git a/imgui_internal.h b/imgui_internal.h
index 42bb284..7ac8130 100644
--- a/imgui_internal.h
+++ b/imgui_internal.h
@@ -1607,6 +1607,7 @@
ImVec2ih Size;
bool Collapsed;
bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
+ bool WantDelete; // Set to invalidate/delete the settings entry
ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
char* GetName() { return (char*)(this + 1); }
@@ -2771,6 +2772,7 @@
IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
IMGUI_API ImGuiWindowSettings* FindWindowSettingsByName(const char* name);
IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);
+ IMGUI_API void ClearWindowSettings(const char* name);
// Localization
IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);