mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Added ImGuiSetCond_Appearing to test the hidden->visible transition.
This commit is contained in:
parent
f46557d2d6
commit
dd2a578012
18
imgui.cpp
18
imgui.cpp
@ -1631,7 +1631,7 @@ ImGuiWindow::ImGuiWindow(const char* name)
|
|||||||
AutoFitOnlyGrows = false;
|
AutoFitOnlyGrows = false;
|
||||||
AutoPosLastDirection = -1;
|
AutoPosLastDirection = -1;
|
||||||
HiddenFrames = 0;
|
HiddenFrames = 0;
|
||||||
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiSetCond_Always | ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver;
|
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiSetCond_Always | ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver | ImGuiSetCond_Appearing;
|
||||||
|
|
||||||
LastFrameDrawn = -1;
|
LastFrameDrawn = -1;
|
||||||
ItemWidthDefault = 0.0f;
|
ItemWidthDefault = 0.0f;
|
||||||
@ -3129,6 +3129,9 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
|
|||||||
}
|
}
|
||||||
window->Flags = (ImGuiWindowFlags)flags;
|
window->Flags = (ImGuiWindowFlags)flags;
|
||||||
|
|
||||||
|
const int current_frame = ImGui::GetFrameCount();
|
||||||
|
const bool window_was_visible = (window->LastFrameDrawn == current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
|
||||||
|
|
||||||
// Add to stack
|
// Add to stack
|
||||||
g.CurrentWindowStack.push_back(window);
|
g.CurrentWindowStack.push_back(window);
|
||||||
SetCurrentWindow(window);
|
SetCurrentWindow(window);
|
||||||
@ -3138,18 +3141,21 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
|
|||||||
if (g.SetNextWindowPosCond)
|
if (g.SetNextWindowPosCond)
|
||||||
{
|
{
|
||||||
const ImVec2 backup_cursor_pos = window->DC.CursorPos; // FIXME: not sure of the exact reason of this anymore :( need to look into that.
|
const ImVec2 backup_cursor_pos = window->DC.CursorPos; // FIXME: not sure of the exact reason of this anymore :( need to look into that.
|
||||||
|
if (!window_was_visible) window->SetWindowPosAllowFlags |= ImGuiSetCond_Appearing;
|
||||||
|
window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.SetNextWindowPosCond) != 0;
|
||||||
ImGui::SetWindowPos(g.SetNextWindowPosVal, g.SetNextWindowPosCond);
|
ImGui::SetWindowPos(g.SetNextWindowPosVal, g.SetNextWindowPosCond);
|
||||||
window->DC.CursorPos = backup_cursor_pos;
|
window->DC.CursorPos = backup_cursor_pos;
|
||||||
window_pos_set_by_api = true;
|
|
||||||
g.SetNextWindowPosCond = 0;
|
g.SetNextWindowPosCond = 0;
|
||||||
}
|
}
|
||||||
if (g.SetNextWindowSizeCond)
|
if (g.SetNextWindowSizeCond)
|
||||||
{
|
{
|
||||||
|
if (!window_was_visible) window->SetWindowSizeAllowFlags |= ImGuiSetCond_Appearing;
|
||||||
ImGui::SetWindowSize(g.SetNextWindowSizeVal, g.SetNextWindowSizeCond);
|
ImGui::SetWindowSize(g.SetNextWindowSizeVal, g.SetNextWindowSizeCond);
|
||||||
g.SetNextWindowSizeCond = 0;
|
g.SetNextWindowSizeCond = 0;
|
||||||
}
|
}
|
||||||
if (g.SetNextWindowCollapsedCond)
|
if (g.SetNextWindowCollapsedCond)
|
||||||
{
|
{
|
||||||
|
if (!window_was_visible) window->SetWindowCollapsedAllowFlags |= ImGuiSetCond_Appearing;
|
||||||
ImGui::SetWindowCollapsed(g.SetNextWindowCollapsedVal, g.SetNextWindowCollapsedCond);
|
ImGui::SetWindowCollapsed(g.SetNextWindowCollapsedVal, g.SetNextWindowCollapsedCond);
|
||||||
g.SetNextWindowCollapsedCond = 0;
|
g.SetNextWindowCollapsedCond = 0;
|
||||||
}
|
}
|
||||||
@ -3177,9 +3183,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
|
|||||||
bg_alpha = style.WindowFillAlphaDefault;
|
bg_alpha = style.WindowFillAlphaDefault;
|
||||||
|
|
||||||
// When reusing window again multiple times a frame, just append content (don't need to setup again)
|
// When reusing window again multiple times a frame, just append content (don't need to setup again)
|
||||||
const int current_frame = ImGui::GetFrameCount();
|
|
||||||
const bool first_begin_of_the_frame = (window->LastFrameDrawn != current_frame);
|
const bool first_begin_of_the_frame = (window->LastFrameDrawn != current_frame);
|
||||||
const bool window_was_visible = (window->LastFrameDrawn == current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
|
|
||||||
if (first_begin_of_the_frame)
|
if (first_begin_of_the_frame)
|
||||||
{
|
{
|
||||||
window->Active = true;
|
window->Active = true;
|
||||||
@ -3967,7 +3971,7 @@ static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiSetCond co
|
|||||||
// Test condition (NB: bit 0 is always true) and clear flags for next time
|
// Test condition (NB: bit 0 is always true) and clear flags for next time
|
||||||
if (cond && (window->SetWindowPosAllowFlags & cond) == 0)
|
if (cond && (window->SetWindowPosAllowFlags & cond) == 0)
|
||||||
return;
|
return;
|
||||||
window->SetWindowPosAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver);
|
window->SetWindowPosAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver | ImGuiSetCond_Appearing);
|
||||||
|
|
||||||
// Set
|
// Set
|
||||||
const ImVec2 old_pos = window->Pos;
|
const ImVec2 old_pos = window->Pos;
|
||||||
@ -4001,7 +4005,7 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiSetCond
|
|||||||
// Test condition (NB: bit 0 is always true) and clear flags for next time
|
// Test condition (NB: bit 0 is always true) and clear flags for next time
|
||||||
if (cond && (window->SetWindowSizeAllowFlags & cond) == 0)
|
if (cond && (window->SetWindowSizeAllowFlags & cond) == 0)
|
||||||
return;
|
return;
|
||||||
window->SetWindowSizeAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver);
|
window->SetWindowSizeAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver | ImGuiSetCond_Appearing);
|
||||||
|
|
||||||
// Set
|
// Set
|
||||||
if (ImLengthSqr(size) > 0.00001f)
|
if (ImLengthSqr(size) > 0.00001f)
|
||||||
@ -4035,7 +4039,7 @@ static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiSetCond
|
|||||||
// Test condition (NB: bit 0 is always true) and clear flags for next time
|
// Test condition (NB: bit 0 is always true) and clear flags for next time
|
||||||
if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0)
|
if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0)
|
||||||
return;
|
return;
|
||||||
window->SetWindowCollapsedAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver);
|
window->SetWindowCollapsedAllowFlags &= ~(ImGuiSetCond_Once | ImGuiSetCond_FirstUseEver | ImGuiSetCond_Appearing);
|
||||||
|
|
||||||
// Set
|
// Set
|
||||||
window->Collapsed = collapsed;
|
window->Collapsed = collapsed;
|
||||||
|
3
imgui.h
3
imgui.h
@ -588,7 +588,8 @@ enum ImGuiSetCond_
|
|||||||
{
|
{
|
||||||
ImGuiSetCond_Always = 1 << 0, // Set the variable
|
ImGuiSetCond_Always = 1 << 0, // Set the variable
|
||||||
ImGuiSetCond_Once = 1 << 1, // Only set the variable on the first call per runtime session
|
ImGuiSetCond_Once = 1 << 1, // Only set the variable on the first call per runtime session
|
||||||
ImGuiSetCond_FirstUseEver = 1 << 2 // Only set the variable if the window doesn't exist in the .ini file
|
ImGuiSetCond_FirstUseEver = 1 << 2, // Only set the variable if the window doesn't exist in the .ini file
|
||||||
|
ImGuiSetCond_Appearing = 1 << 3 // Only set the variable if the window is appearing after being inactive (or the first time)
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ImGuiStyle
|
struct ImGuiStyle
|
||||||
|
Loading…
Reference in New Issue
Block a user