From 515b437c0845dc696e60aaca890f9ee54903aa95 Mon Sep 17 00:00:00 2001 From: cfillion Date: Mon, 25 Mar 2024 13:31:46 -0400 Subject: [PATCH] Child windows: look at the parent window's flags to decide whether to clamp child resizes. (#7440, #1710) --- docs/CHANGELOG.txt | 2 ++ imgui.cpp | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 12aa33f58..e6f53f105 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -57,6 +57,8 @@ Other changes: - Windows: Double-click to collapse may be disabled via key-ownership mechanism. (#7369) - Windows: Extend outer resize borders to the edges when there are no corner grips. Essentially affects resizable child windows. (#7440, #1710) [@cfillion] +- Windows: Resizing logic for child windows evaluates whether per-axis clamping should be + applied based on parent scrollbars, not child scrollbars. (#7440, #1710) [@cfillion] - Tables: Angled headers: fixed border hit box extending beyond when used within non-scrollable tables. (#7416) [@cfillion] - Tables: Angled headers: fixed borders not moving back up after TableAngleHeadersRow() diff --git a/imgui.cpp b/imgui.cpp index c7da9d3a4..bf5765b47 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -6029,10 +6029,12 @@ static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& si border_target = ImClamp(border_target, clamp_min, clamp_max); if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent { - if ((flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (flags & ImGuiWindowFlags_NoScrollbar)) - border_target.x = ImClamp(border_target.x, window->ParentWindow->InnerClipRect.Min.x, window->ParentWindow->InnerClipRect.Max.x); - if (flags & ImGuiWindowFlags_NoScrollbar) - border_target.y = ImClamp(border_target.y, window->ParentWindow->InnerClipRect.Min.y, window->ParentWindow->InnerClipRect.Max.y); + ImGuiWindowFlags parent_flags = window->ParentWindow->Flags; + const ImRect parent_rect = window->ParentWindow->InnerClipRect; + if ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar)) + border_target.x = ImClamp(border_target.x, parent_rect.Min.x, parent_rect.Max.x); + if (parent_flags & ImGuiWindowFlags_NoScrollbar) + border_target.y = ImClamp(border_target.y, parent_rect.Min.y, parent_rect.Max.y); } if (!ignore_resize) CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target);