|
@@ -5712,9 +5712,9 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s
|
|
|
if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize)))
|
|
|
{
|
|
|
ImGuiWindow* window_for_height = GetWindowForTitleAndMenuHeight(window);
|
|
|
- const float decoration_up_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight();
|
|
|
new_size = ImMax(new_size, g.Style.WindowMinSize);
|
|
|
- new_size.y = ImMax(new_size.y, decoration_up_height + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows
|
|
|
+ const float minimum_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f);
|
|
|
+ new_size.y = ImMax(new_size.y, minimum_height); // Reduce artifacts with very small windows
|
|
|
}
|
|
|
return new_size;
|
|
|
}
|
|
@@ -5743,9 +5743,10 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiStyle& style = g.Style;
|
|
|
- const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
+ const float decoration_w_without_scrollbars = window->DecoOuterSizeX1 + window->DecoOuterSizeX2 - window->ScrollbarSizes.x;
|
|
|
+ const float decoration_h_without_scrollbars = window->DecoOuterSizeY1 + window->DecoOuterSizeY2 - window->ScrollbarSizes.y;
|
|
|
ImVec2 size_pad = window->WindowPadding * 2.0f;
|
|
|
- ImVec2 size_desired = size_contents + size_pad + ImVec2(0.0f, decoration_up_height);
|
|
|
+ ImVec2 size_desired = size_contents + size_pad + ImVec2(decoration_w_without_scrollbars, decoration_h_without_scrollbars);
|
|
|
if (window->Flags & ImGuiWindowFlags_Tooltip)
|
|
|
{
|
|
|
// Tooltip always resize
|
|
@@ -5771,8 +5772,8 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
|
|
|
// When the window cannot fit all contents (either because of constraints, either because screen is too small),
|
|
|
// we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
|
|
|
ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit);
|
|
|
- bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - 0.0f < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
|
|
|
- bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_up_height < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
|
|
|
+ bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
|
|
|
+ bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_h_without_scrollbars < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
|
|
|
if (will_have_scrollbar_x)
|
|
|
size_auto_fit.y += style.ScrollbarSize;
|
|
|
if (will_have_scrollbar_y)
|
|
@@ -6659,6 +6660,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
|
|
|
// SIZE
|
|
|
|
|
|
+ // Outer Decoration Sizes
|
|
|
+ // (we need to clear ScrollbarSize immediatly as CalcWindowAutoFitSize() needs it and can be called from other locations).
|
|
|
+ const ImVec2 scrollbar_sizes_from_last_frame = window->ScrollbarSizes;
|
|
|
+ window->DecoOuterSizeX1 = 0.0f;
|
|
|
+ window->DecoOuterSizeX2 = 0.0f;
|
|
|
+ window->DecoOuterSizeY1 = window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
+ window->DecoOuterSizeY2 = 0.0f;
|
|
|
+ window->ScrollbarSizes = ImVec2(0.0f, 0.0f);
|
|
|
+
|
|
|
// Calculate auto-fit size, handle automatic resize
|
|
|
const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSizeIdeal);
|
|
|
if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed)
|
|
@@ -6697,9 +6707,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull);
|
|
|
window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull;
|
|
|
|
|
|
- // Decoration size
|
|
|
- const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
-
|
|
|
// POSITION
|
|
|
|
|
|
// Popup latch its initial position, will position itself when it appears next frame
|
|
@@ -6857,9 +6864,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
if (!window->Collapsed)
|
|
|
{
|
|
|
// When reading the current size we need to read it after size constraints have been applied.
|
|
|
- // When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again.
|
|
|
- ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - decoration_up_height);
|
|
|
- ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + window->ScrollbarSizes;
|
|
|
+ // Intentionally use previous frame values for InnerRect and ScrollbarSizes.
|
|
|
+ // And when we use window->DecorationUp here it doesn't have ScrollbarSizes.y applied yet.
|
|
|
+ ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2));
|
|
|
+ ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + scrollbar_sizes_from_last_frame;
|
|
|
ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f;
|
|
|
float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x;
|
|
|
float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y;
|
|
@@ -6869,6 +6877,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
// UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING)
|
|
@@ -6894,10 +6906,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// - ScrollToRectEx()
|
|
|
// - NavUpdatePageUpPageDown()
|
|
|
// - Scrollbar()
|
|
|
- window->InnerRect.Min.x = window->Pos.x;
|
|
|
- window->InnerRect.Min.y = window->Pos.y + decoration_up_height;
|
|
|
- window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x;
|
|
|
- window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y;
|
|
|
+ window->InnerRect.Min.x = window->Pos.x + window->DecoOuterSizeX1;
|
|
|
+ window->InnerRect.Min.y = window->Pos.y + window->DecoOuterSizeY1;
|
|
|
+ window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->DecoOuterSizeX2;
|
|
|
+ window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->DecoOuterSizeY2;
|
|
|
|
|
|
// Inner clipping rectangle.
|
|
|
// Will extend a little bit outside the normal work region.
|
|
@@ -6930,6 +6942,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// Apply scrolling
|
|
|
window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window);
|
|
|
window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);
|
|
|
+ window->DecoInnerSizeX1 = window->DecoInnerSizeY1 = 0.0f;
|
|
|
|
|
|
// DRAWING
|
|
|
|
|
@@ -6976,8 +6989,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// - BeginTabBar() for right-most edge
|
|
|
const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar);
|
|
|
const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar);
|
|
|
- const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x));
|
|
|
- const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y));
|
|
|
+ const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2)));
|
|
|
+ const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2)));
|
|
|
window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize));
|
|
|
window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize));
|
|
|
window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x;
|
|
@@ -6988,21 +7001,21 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
|
|
|
// Used by:
|
|
|
// - Mouse wheel scrolling + many other things
|
|
|
- window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
|
|
|
- window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + decoration_up_height;
|
|
|
- window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x));
|
|
|
- window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y));
|
|
|
+ window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x + window->DecoOuterSizeX1;
|
|
|
+ window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->DecoOuterSizeY1;
|
|
|
+ window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2)));
|
|
|
+ window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2)));
|
|
|
|
|
|
// Setup drawing context
|
|
|
// (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.)
|
|
|
- window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x;
|
|
|
+ window->DC.Indent.x = window->DecoOuterSizeX1 + window->WindowPadding.x - window->Scroll.x;
|
|
|
window->DC.GroupOffset.x = 0.0f;
|
|
|
window->DC.ColumnsOffset.x = 0.0f;
|
|
|
|
|
|
// Record the loss of precision of CursorStartPos which can happen due to really large scrolling amount.
|
|
|
// This is used by clipper to compensate and fix the most common use case of large scroll area. Easy and cheap, next best thing compared to switching everything to double or ImU64.
|
|
|
- double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DC.ColumnsOffset.x;
|
|
|
- double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + decoration_up_height;
|
|
|
+ double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DecoOuterSizeX1 + window->DC.ColumnsOffset.x;
|
|
|
+ double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + window->DecoOuterSizeY1;
|
|
|
window->DC.CursorStartPos = ImVec2((float)start_pos_highp_x, (float)start_pos_highp_y);
|
|
|
window->DC.CursorStartPosLossyness = ImVec2((float)(start_pos_highp_x - window->DC.CursorStartPos.x), (float)(start_pos_highp_y - window->DC.CursorStartPos.y));
|
|
|
window->DC.CursorPos = window->DC.CursorStartPos;
|
|
@@ -9758,7 +9771,7 @@ void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
|
|
|
window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x;
|
|
|
window->DC.CursorPosPrevLine.y = line_y1;
|
|
|
window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line
|
|
|
- window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line
|
|
|
+ window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line
|
|
|
window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
|
|
|
window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
|
|
|
//if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
|
|
@@ -10232,38 +10245,24 @@ static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, fl
|
|
|
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
|
|
|
{
|
|
|
ImVec2 scroll = window->Scroll;
|
|
|
- if (window->ScrollTarget.x < FLT_MAX)
|
|
|
- {
|
|
|
- float decoration_total_width = window->ScrollbarSizes.x;
|
|
|
- float center_x_ratio = window->ScrollTargetCenterRatio.x;
|
|
|
- float scroll_target_x = window->ScrollTarget.x;
|
|
|
- if (window->ScrollTargetEdgeSnapDist.x > 0.0f)
|
|
|
- {
|
|
|
- float snap_x_min = 0.0f;
|
|
|
- float snap_x_max = window->ScrollMax.x + window->SizeFull.x - decoration_total_width;
|
|
|
- scroll_target_x = CalcScrollEdgeSnap(scroll_target_x, snap_x_min, snap_x_max, window->ScrollTargetEdgeSnapDist.x, center_x_ratio);
|
|
|
- }
|
|
|
- scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - decoration_total_width);
|
|
|
- }
|
|
|
- if (window->ScrollTarget.y < FLT_MAX)
|
|
|
+ ImVec2 decoration_size(window->DecoOuterSizeX1 + window->DecoInnerSizeX1 + window->DecoOuterSizeX2, window->DecoOuterSizeY1 + window->DecoInnerSizeY1 + window->DecoOuterSizeY2);
|
|
|
+ for (int axis = 0; axis < 2; axis++)
|
|
|
{
|
|
|
- float decoration_total_height = window->TitleBarHeight() + window->MenuBarHeight() + window->ScrollbarSizes.y;
|
|
|
- float center_y_ratio = window->ScrollTargetCenterRatio.y;
|
|
|
- float scroll_target_y = window->ScrollTarget.y;
|
|
|
- if (window->ScrollTargetEdgeSnapDist.y > 0.0f)
|
|
|
+ if (window->ScrollTarget[axis] < FLT_MAX)
|
|
|
{
|
|
|
- float snap_y_min = 0.0f;
|
|
|
- float snap_y_max = window->ScrollMax.y + window->SizeFull.y - decoration_total_height;
|
|
|
- scroll_target_y = CalcScrollEdgeSnap(scroll_target_y, snap_y_min, snap_y_max, window->ScrollTargetEdgeSnapDist.y, center_y_ratio);
|
|
|
+ float center_ratio = window->ScrollTargetCenterRatio[axis];
|
|
|
+ float scroll_target = window->ScrollTarget[axis];
|
|
|
+ if (window->ScrollTargetEdgeSnapDist[axis] > 0.0f)
|
|
|
+ {
|
|
|
+ float snap_min = 0.0f;
|
|
|
+ float snap_max = window->ScrollMax[axis] + window->SizeFull[axis] - decoration_size[axis];
|
|
|
+ scroll_target = CalcScrollEdgeSnap(scroll_target, snap_min, snap_max, window->ScrollTargetEdgeSnapDist[axis], center_ratio);
|
|
|
+ }
|
|
|
+ scroll[axis] = scroll_target - center_ratio * (window->SizeFull[axis] - decoration_size[axis]);
|
|
|
}
|
|
|
- scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - decoration_total_height);
|
|
|
- }
|
|
|
- scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f));
|
|
|
- scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f));
|
|
|
- if (!window->Collapsed && !window->SkipItems)
|
|
|
- {
|
|
|
- scroll.x = ImMin(scroll.x, window->ScrollMax.x);
|
|
|
- scroll.y = ImMin(scroll.y, window->ScrollMax.y);
|
|
|
+ scroll[axis] = IM_FLOOR(ImMax(scroll[axis], 0.0f));
|
|
|
+ if (!window->Collapsed && !window->SkipItems)
|
|
|
+ scroll[axis] = ImMin(scroll[axis], window->ScrollMax[axis]);
|
|
|
}
|
|
|
return scroll;
|
|
|
}
|
|
@@ -10284,8 +10283,11 @@ void ImGui::ScrollToRect(ImGuiWindow* window, const ImRect& item_rect, ImGuiScro
|
|
|
ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1));
|
|
|
- //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG]
|
|
|
+ ImRect scroll_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1));
|
|
|
+ scroll_rect.Min.x = ImMin(scroll_rect.Min.x + window->DecoInnerSizeX1, scroll_rect.Max.x);
|
|
|
+ scroll_rect.Min.y = ImMin(scroll_rect.Min.y + window->DecoInnerSizeY1, scroll_rect.Max.y);
|
|
|
+ //GetForegroundDrawList(window)->AddRect(item_rect.Min, item_rect.Max, IM_COL32(255,0,0,255), 0.0f, 0, 5.0f); // [DEBUG]
|
|
|
+ //GetForegroundDrawList(window)->AddRect(scroll_rect.Min, scroll_rect.Max, IM_COL32_WHITE); // [DEBUG]
|
|
|
|
|
|
// Check that only one behavior is selected per axis
|
|
|
IM_ASSERT((flags & ImGuiScrollFlags_MaskX_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskX_));
|
|
@@ -10298,16 +10300,16 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui
|
|
|
if ((flags & ImGuiScrollFlags_MaskY_) == 0)
|
|
|
flags |= window->Appearing ? ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeY;
|
|
|
|
|
|
- const bool fully_visible_x = item_rect.Min.x >= window_rect.Min.x && item_rect.Max.x <= window_rect.Max.x;
|
|
|
- const bool fully_visible_y = item_rect.Min.y >= window_rect.Min.y && item_rect.Max.y <= window_rect.Max.y;
|
|
|
- const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= window_rect.GetWidth() || (window->AutoFitFramesX > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0;
|
|
|
- const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= window_rect.GetHeight() || (window->AutoFitFramesY > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0;
|
|
|
+ const bool fully_visible_x = item_rect.Min.x >= scroll_rect.Min.x && item_rect.Max.x <= scroll_rect.Max.x;
|
|
|
+ const bool fully_visible_y = item_rect.Min.y >= scroll_rect.Min.y && item_rect.Max.y <= scroll_rect.Max.y;
|
|
|
+ const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= scroll_rect.GetWidth() || (window->AutoFitFramesX > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0;
|
|
|
+ const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= scroll_rect.GetHeight() || (window->AutoFitFramesY > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0;
|
|
|
|
|
|
if ((flags & ImGuiScrollFlags_KeepVisibleEdgeX) && !fully_visible_x)
|
|
|
{
|
|
|
- if (item_rect.Min.x < window_rect.Min.x || !can_be_fully_visible_x)
|
|
|
+ if (item_rect.Min.x < scroll_rect.Min.x || !can_be_fully_visible_x)
|
|
|
SetScrollFromPosX(window, item_rect.Min.x - g.Style.ItemSpacing.x - window->Pos.x, 0.0f);
|
|
|
- else if (item_rect.Max.x >= window_rect.Max.x)
|
|
|
+ else if (item_rect.Max.x >= scroll_rect.Max.x)
|
|
|
SetScrollFromPosX(window, item_rect.Max.x + g.Style.ItemSpacing.x - window->Pos.x, 1.0f);
|
|
|
}
|
|
|
else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX))
|
|
@@ -10320,9 +10322,9 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui
|
|
|
|
|
|
if ((flags & ImGuiScrollFlags_KeepVisibleEdgeY) && !fully_visible_y)
|
|
|
{
|
|
|
- if (item_rect.Min.y < window_rect.Min.y || !can_be_fully_visible_y)
|
|
|
+ if (item_rect.Min.y < scroll_rect.Min.y || !can_be_fully_visible_y)
|
|
|
SetScrollFromPosY(window, item_rect.Min.y - g.Style.ItemSpacing.y - window->Pos.y, 0.0f);
|
|
|
- else if (item_rect.Max.y >= window_rect.Max.y)
|
|
|
+ else if (item_rect.Max.y >= scroll_rect.Max.y)
|
|
|
SetScrollFromPosY(window, item_rect.Max.y + g.Style.ItemSpacing.y - window->Pos.y, 1.0f);
|
|
|
}
|
|
|
else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY))
|
|
@@ -10413,7 +10415,7 @@ void ImGui::SetScrollY(float scroll_y)
|
|
|
void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio)
|
|
|
{
|
|
|
IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f);
|
|
|
- window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x); // Convert local position to scroll offset
|
|
|
+ window->ScrollTarget.x = IM_FLOOR(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset
|
|
|
window->ScrollTargetCenterRatio.x = center_x_ratio;
|
|
|
window->ScrollTargetEdgeSnapDist.x = 0.0f;
|
|
|
}
|
|
@@ -10421,9 +10423,7 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x
|
|
|
void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio)
|
|
|
{
|
|
|
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
|
|
- const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect;
|
|
|
- local_y -= decoration_up_height;
|
|
|
- window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset
|
|
|
+ window->ScrollTarget.y = IM_FLOOR(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset
|
|
|
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
|
|
window->ScrollTargetEdgeSnapDist.y = 0.0f;
|
|
|
}
|
|
@@ -18711,8 +18711,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; }
|
|
|
else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate
|
|
|
else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); }
|
|
|
- else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); }
|
|
|
- else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); }
|
|
|
+ else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight); }
|
|
|
+ else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); }
|
|
|
IM_ASSERT(0);
|
|
|
return ImRect();
|
|
|
}
|