|
@@ -384,6 +384,17 @@ CODE
|
|
|
When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
|
|
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
|
|
|
|
|
+ - 2022/09/02 (1.89) - obsoleted using SetCursorPos()/SetCursorScreenPos() to extend parent window/cell boundaries.
|
|
|
+ this relates to when moving the cursor position beyond current boundaries WITHOUT submitting an item.
|
|
|
+ - previously this would make the window content size ~200x200:
|
|
|
+ Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End();
|
|
|
+ - instead, please submit an item:
|
|
|
+ Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End();
|
|
|
+ - alternative:
|
|
|
+ Begin(...) + Dummy(ImVec2(200,200)) + End();
|
|
|
+ - content size is now only extended when submitting an item!
|
|
|
+ - with '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' this will now be detected and assert.
|
|
|
+ - without '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' this will silently be fixed until we obsolete it.
|
|
|
- 2022/08/03 (1.89) - changed signature of ImageButton() function. Kept redirection function (will obsolete).
|
|
|
- added 'const char* str_id' parameter + removed 'int frame_padding = -1' parameter.
|
|
|
- old signature: bool ImageButton(ImTextureID tex_id, ImVec2 size, ImVec2 uv0 = ImVec2(0,0), ImVec2 uv1 = ImVec2(1,1), int frame_padding = -1, ImVec4 bg_col = ImVec4(0,0,0,0), ImVec4 tint_col = ImVec4(1,1,1,1));
|
|
@@ -6690,7 +6701,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->DC.IdealMaxPos = window->DC.CursorStartPos;
|
|
|
window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f);
|
|
|
window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f;
|
|
|
- window->DC.IsSameLine = false;
|
|
|
+ window->DC.IsSameLine = window->DC.IsSetPos = false;
|
|
|
|
|
|
window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
|
|
|
window->DC.NavLayersActiveMask = window->DC.NavLayersActiveMaskNext;
|
|
@@ -6841,6 +6852,9 @@ void ImGui::End()
|
|
|
if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging
|
|
|
LogFinish();
|
|
|
|
|
|
+ if (window->DC.IsSetPos)
|
|
|
+ ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
|
|
|
+
|
|
|
// Pop from window stack
|
|
|
g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup;
|
|
|
if (window->Flags & ImGuiWindowFlags_ChildMenu)
|
|
@@ -8229,6 +8243,36 @@ bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, si
|
|
|
return !error;
|
|
|
}
|
|
|
|
|
|
+// Until 1.89 (IMGUI_VERSION_NUM < 18814) it was legal to use SetCursorPos() to extend the boundary of a parent (e.g. window or table cell)
|
|
|
+// This is causing issues and ambiguity and we need to retire that.
|
|
|
+// See https://github.com/ocornut/imgui/issues/5548 for more details.
|
|
|
+// [Scenario 1]
|
|
|
+// Previously this would make the window content size ~200x200:
|
|
|
+// Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End(); // NOT OK
|
|
|
+// Instead, please submit an item:
|
|
|
+// Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End(); // OK
|
|
|
+// Alternative:
|
|
|
+// Begin(...) + Dummy(ImVec2(200,200)) + End(); // OK
|
|
|
+// [Scenario 2]
|
|
|
+// For reference this is one of the issue what we aim to fix with this change:
|
|
|
+// BeginGroup() + SomeItem("foobar") + SetCursorScreenPos(GetCursorScreenPos()) + EndGroup()
|
|
|
+// The previous logic made SetCursorScreenPos(GetCursorScreenPos()) have a side-effect! It would erroneously incorporate ItemSpacing.y after the item into content size, making the group taller!
|
|
|
+// While this code is a little twisted, no-one would expect SetXXX(GetXXX()) to have a side-effect. Using vertical alignment patterns could trigger this issue.
|
|
|
+void ImGui::ErrorCheckUsingSetCursorPosToExtendParentBoundaries()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiWindow* window = g.CurrentWindow;
|
|
|
+ IM_ASSERT(window->DC.IsSetPos);
|
|
|
+ window->DC.IsSetPos = false;
|
|
|
+#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
|
+ if (window->DC.CursorPos.x <= window->DC.CursorMaxPos.x && window->DC.CursorPos.y <= window->DC.CursorMaxPos.y)
|
|
|
+ return;
|
|
|
+ IM_ASSERT(0 && "Code uses SetCursorPos()/SetCursorScreenPos() to extend window/parent boundaries. Please submit an item e.g. Dummy() to validate extent.");
|
|
|
+#else
|
|
|
+ window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static void ImGui::ErrorCheckNewFrameSanityChecks()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
@@ -8499,7 +8543,7 @@ void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
|
|
|
window->DC.CurrLineSize.y = 0.0f;
|
|
|
window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y);
|
|
|
window->DC.CurrLineTextBaseOffset = 0.0f;
|
|
|
- window->DC.IsSameLine = false;
|
|
|
+ window->DC.IsSameLine = window->DC.IsSetPos = false;
|
|
|
|
|
|
// Horizontal layout mode
|
|
|
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
|
|
@@ -8619,7 +8663,8 @@ void ImGui::SetCursorScreenPos(const ImVec2& pos)
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
|
window->DC.CursorPos = pos;
|
|
|
- window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);
|
|
|
+ //window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);
|
|
|
+ window->DC.IsSetPos = true;
|
|
|
}
|
|
|
|
|
|
// User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient.
|
|
@@ -8646,21 +8691,24 @@ void ImGui::SetCursorPos(const ImVec2& local_pos)
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
|
window->DC.CursorPos = window->Pos - window->Scroll + local_pos;
|
|
|
- window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);
|
|
|
+ //window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);
|
|
|
+ window->DC.IsSetPos = true;
|
|
|
}
|
|
|
|
|
|
void ImGui::SetCursorPosX(float x)
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
|
window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + x;
|
|
|
- window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x);
|
|
|
+ //window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x);
|
|
|
+ window->DC.IsSetPos = true;
|
|
|
}
|
|
|
|
|
|
void ImGui::SetCursorPosY(float y)
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
|
window->DC.CursorPos.y = window->Pos.y - window->Scroll.y + y;
|
|
|
- window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y);
|
|
|
+ //window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y);
|
|
|
+ window->DC.IsSetPos = true;
|
|
|
}
|
|
|
|
|
|
ImVec2 ImGui::GetCursorStartPos()
|
|
@@ -8877,6 +8925,9 @@ void ImGui::EndGroup()
|
|
|
ImGuiGroupData& group_data = g.GroupStack.back();
|
|
|
IM_ASSERT(group_data.WindowID == window->ID); // EndGroup() in wrong window?
|
|
|
|
|
|
+ if (window->DC.IsSetPos)
|
|
|
+ ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
|
|
|
+
|
|
|
ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos));
|
|
|
|
|
|
window->DC.CursorPos = group_data.BackupCursorPos;
|