mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-28 01:20:55 +01:00
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.
This commit is contained in:
parent
b2ebd03b16
commit
082b20e46b
70
imgui.cpp
70
imgui.cpp
@ -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;
|
// Initial window state with e.g. default/arbitrary window position
|
||||||
//IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
|
// Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window.
|
||||||
|
|
||||||
// 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.
|
|
||||||
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 (settings != NULL)
|
||||||
if (!(flags & ImGuiWindowFlags_NoSavedSettings))
|
{
|
||||||
if (ImGuiWindowSettings* settings = ImGui::FindWindowSettingsByWindow(window))
|
SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
|
||||||
{
|
ApplyWindowSettings(window, settings);
|
||||||
// Retrieve settings from .ini file
|
}
|
||||||
window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings);
|
|
||||||
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)
|
||||||
|
@ -1607,6 +1607,7 @@ struct ImGuiWindowSettings
|
|||||||
ImVec2ih Size;
|
ImVec2ih Size;
|
||||||
bool Collapsed;
|
bool Collapsed;
|
||||||
bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
|
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)); }
|
ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
|
||||||
char* GetName() { return (char*)(this + 1); }
|
char* GetName() { return (char*)(this + 1); }
|
||||||
@ -2771,6 +2772,7 @@ namespace ImGui
|
|||||||
IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
|
IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
|
||||||
IMGUI_API ImGuiWindowSettings* FindWindowSettingsByName(const char* name);
|
IMGUI_API ImGuiWindowSettings* FindWindowSettingsByName(const char* name);
|
||||||
IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);
|
IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);
|
||||||
|
IMGUI_API void ClearWindowSettings(const char* name);
|
||||||
|
|
||||||
// Localization
|
// Localization
|
||||||
IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
|
IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
|
||||||
|
Loading…
Reference in New Issue
Block a user