|
@@ -3631,7 +3631,7 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst
|
|
ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f);
|
|
ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f);
|
|
AutoFitFramesX = AutoFitFramesY = -1;
|
|
AutoFitFramesX = AutoFitFramesY = -1;
|
|
AutoPosLastDirection = ImGuiDir_None;
|
|
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);
|
|
SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX);
|
|
LastFrameActive = -1;
|
|
LastFrameActive = -1;
|
|
LastTimeActive = -1.0f;
|
|
LastTimeActive = -1.0f;
|
|
@@ -5360,32 +5360,22 @@ static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created,
|
|
window->IsExplicitChild = new_is_explicit_child;
|
|
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();
|
|
const ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
|
window->Pos = main_viewport->Pos + ImVec2(60, 60);
|
|
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
|
|
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->AutoFitFramesX = window->AutoFitFramesY = 2;
|
|
window->AutoFitOnlyGrows = false;
|
|
window->AutoFitOnlyGrows = false;
|
|
@@ -5398,6 +5388,23 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
|
|
window->AutoFitFramesY = 2;
|
|
window->AutoFitFramesY = 2;
|
|
window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0);
|
|
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)
|
|
if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus)
|
|
g.Windows.push_front(window); // Quite slow but rare and only once
|
|
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.
|
|
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*)
|
|
static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*)
|
|
{
|
|
{
|
|
ImGuiContext& g = *ctx;
|
|
ImGuiContext& g = *ctx;
|
|
@@ -12765,12 +12786,15 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl
|
|
settings->Size = ImVec2ih(window->SizeFull);
|
|
settings->Size = ImVec2ih(window->SizeFull);
|
|
|
|
|
|
settings->Collapsed = window->Collapsed;
|
|
settings->Collapsed = window->Collapsed;
|
|
|
|
+ settings->WantDelete = false;
|
|
}
|
|
}
|
|
|
|
|
|
// Write to text buffer
|
|
// Write to text buffer
|
|
buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve
|
|
buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve
|
|
for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
|
|
for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
|
|
{
|
|
{
|
|
|
|
+ if (settings->WantDelete)
|
|
|
|
+ continue;
|
|
const char* settings_name = settings->GetName();
|
|
const char* settings_name = settings->GetName();
|
|
buf->appendf("[%s][%s]\n", handler->TypeName, settings_name);
|
|
buf->appendf("[%s][%s]\n", handler->TypeName, settings_name);
|
|
buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y);
|
|
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)
|
|
void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings* settings)
|
|
{
|
|
{
|
|
|
|
+ if (settings->WantDelete)
|
|
|
|
+ BeginDisabled();
|
|
Text("0x%08X \"%s\" Pos (%d,%d) Size (%d,%d) Collapsed=%d",
|
|
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);
|
|
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)
|
|
void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label)
|