From 60e4514b7b5c56db89102a3d66ef28a14118b8fd Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:11:32 +0200 Subject: [PATCH] ImGui: add flag to draw scrollbars over content Custom flags: basically tells ImGui to draw the scrollbar as an overlay. This is useful for working around feedback loops caused by the appearance of the scrollbars (might be worth PR'ing into ImGui itself?) See: ocornut/imgui#1720 ocornut/imgui#1730 ocornut/imgui#2978 --- src/thirdparty/imgui/imgui.cpp | 8 +++++--- src/thirdparty/imgui/imgui.h | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/thirdparty/imgui/imgui.cpp b/src/thirdparty/imgui/imgui.cpp index 24934146..75946bef 100644 --- a/src/thirdparty/imgui/imgui.cpp +++ b/src/thirdparty/imgui/imgui.cpp @@ -6794,14 +6794,16 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags, void* float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y; //bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons? window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); - window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); + window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - ((window->ScrollbarY && !(flags & ImGuiWindowFlags_OverlayHorizontalScrollbar)) ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); if (window->ScrollbarX && !window->ScrollbarY) window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar); window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); // Amend the partially filled window->DecorationXXX values. - window->DecoOuterSizeX2 += window->ScrollbarSizes.x; - window->DecoOuterSizeY2 += window->ScrollbarSizes.y; + if (!(flags & ImGuiWindowFlags_OverlayVerticalScrollbar)) + window->DecoOuterSizeX2 += window->ScrollbarSizes.x; + if (!(flags & ImGuiWindowFlags_OverlayHorizontalScrollbar)) + window->DecoOuterSizeY2 += window->ScrollbarSizes.y; } // UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING) diff --git a/src/thirdparty/imgui/imgui.h b/src/thirdparty/imgui/imgui.h index 2cfe5bd5..8658edd3 100644 --- a/src/thirdparty/imgui/imgui.h +++ b/src/thirdparty/imgui/imgui.h @@ -1016,6 +1016,9 @@ enum ImGuiWindowFlags_ ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse, ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, + ImGuiWindowFlags_OverlayVerticalScrollbar = 1 << 19, // Draw the vertical scrollbar as an overlay (scrollbar space will not take up content region space) + ImGuiWindowFlags_OverlayHorizontalScrollbar = 1 << 20, // Draw the horizontal scrollbar as an overlay (scrollbar space will not take up content region space) + // [Internal] ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: share focus scope, allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild()