|
|
@@ -728,7 +728,7 @@ static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed,
|
|
|
static ImGuiWindow* FindHoveredWindow();
|
|
|
static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags);
|
|
|
static void CheckStacksSize(ImGuiWindow* window, bool write);
|
|
|
-static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window);
|
|
|
+static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges);
|
|
|
|
|
|
static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
|
|
|
static void AddWindowToDrawData(ImVector<ImDrawList*>* out_list, ImGuiWindow* window);
|
|
|
@@ -2172,14 +2172,14 @@ void ImGui::ItemSize(const ImRect& bb, float text_offset_y)
|
|
|
ItemSize(bb.GetSize(), text_offset_y);
|
|
|
}
|
|
|
|
|
|
-static ImGuiDir NavScoreItemGetQuadrant(float dx, float dy)
|
|
|
+static ImGuiDir inline NavScoreItemGetQuadrant(float dx, float dy)
|
|
|
{
|
|
|
if (fabsf(dx) > fabsf(dy))
|
|
|
return (dx > 0.0f) ? ImGuiDir_Right : ImGuiDir_Left;
|
|
|
return (dy > 0.0f) ? ImGuiDir_Down : ImGuiDir_Up;
|
|
|
}
|
|
|
|
|
|
-static float NavScoreItemDistInterval(float a0, float a1, float b0, float b1)
|
|
|
+static float inline NavScoreItemDistInterval(float a0, float a1, float b0, float b1)
|
|
|
{
|
|
|
if (a1 < b0)
|
|
|
return a1 - b0;
|
|
|
@@ -2188,6 +2188,20 @@ static float NavScoreItemDistInterval(float a0, float a1, float b0, float b1)
|
|
|
return 0.0f;
|
|
|
}
|
|
|
|
|
|
+static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect& r, const ImRect& clip_rect)
|
|
|
+{
|
|
|
+ if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right)
|
|
|
+ {
|
|
|
+ r.Min.y = ImClamp(r.Min.y, clip_rect.Min.y, clip_rect.Max.y);
|
|
|
+ r.Max.y = ImClamp(r.Max.y, clip_rect.Min.y, clip_rect.Max.y);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ r.Min.x = ImClamp(r.Min.x, clip_rect.Min.x, clip_rect.Max.x);
|
|
|
+ r.Max.x = ImClamp(r.Max.x, clip_rect.Min.x, clip_rect.Max.x);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Scoring function for directional navigation. Based on https://gist.github.com/rygorous/6981057
|
|
|
static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
|
|
|
{
|
|
|
@@ -2199,17 +2213,9 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
|
|
|
const ImRect& curr = g.NavScoringRectScreen; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width)
|
|
|
g.NavScoringCount++;
|
|
|
|
|
|
- // We perform scoring on items bounding box clipped by their parent window on the other axis (clipping on our movement axis would give us equal scores for all clipped items)
|
|
|
- if (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right)
|
|
|
- {
|
|
|
- cand.Min.y = ImClamp(cand.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y);
|
|
|
- cand.Max.y = ImClamp(cand.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- cand.Min.x = ImClamp(cand.Min.x, window->ClipRect.Min.x, window->ClipRect.Max.x);
|
|
|
- cand.Max.x = ImClamp(cand.Max.x, window->ClipRect.Min.x, window->ClipRect.Max.x);
|
|
|
- }
|
|
|
+ // We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items)
|
|
|
+ // For example, this ensure that items in one column are not reached when moving vertically from items in another column.
|
|
|
+ NavClampRectToVisibleAreaForMoveDir(g.NavMoveDir, cand, window->ClipRect);
|
|
|
|
|
|
// Compute distance between boxes
|
|
|
// FIXME-NAV: Introducing biases for vertical navigation, needs to be removed.
|
|
|
@@ -2392,6 +2398,7 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
|
|
|
}
|
|
|
|
|
|
// Scoring for navigation
|
|
|
+ // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRectScreen + scoring from a rect wrapped according to current wrapping policy)
|
|
|
if (g.NavId != id && !(item_flags & ImGuiItemFlags_NoNav))
|
|
|
{
|
|
|
ImGuiNavMoveResult* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther;
|
|
|
@@ -2965,7 +2972,7 @@ static void ImGui::NavUpdateWindowing()
|
|
|
static void NavScrollToBringItemIntoView(ImGuiWindow* window, ImRect& item_rect_rel)
|
|
|
{
|
|
|
// Scroll to keep newly navigated item fully into view
|
|
|
- ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1, 1), window->InnerRect.Max - window->Pos + ImVec2(1, 1));
|
|
|
+ ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1, 1), window->InnerMainRect.Max - window->Pos + ImVec2(1, 1));
|
|
|
//g.OverlayDrawList.AddRect(window->Pos + window_rect_rel.Min, window->Pos + window_rect_rel.Max, IM_COL32_WHITE); // [DEBUG]
|
|
|
if (window_rect_rel.Contains(item_rect_rel))
|
|
|
return;
|
|
|
@@ -2992,8 +2999,8 @@ static void NavScrollToBringItemIntoView(ImGuiWindow* window, ImRect& item_rect_
|
|
|
window->ScrollTargetCenterRatio.y = 1.0f;
|
|
|
}
|
|
|
|
|
|
- // Estimate upcoming scroll so we can offset our relative mouse position so mouse position can be applied immediately (under this block)
|
|
|
- ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window);
|
|
|
+ // Estimate upcoming scroll so we can offset our relative mouse position so mouse position can be applied immediately after in NavUpdate()
|
|
|
+ ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window, false);
|
|
|
item_rect_rel.Translate(window->Scroll - next_scroll);
|
|
|
}
|
|
|
|
|
|
@@ -3248,7 +3255,7 @@ static void ImGui::NavUpdate()
|
|
|
if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == 0)
|
|
|
{
|
|
|
ImGuiWindow* window = g.NavWindow;
|
|
|
- ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1,1), window->InnerRect.Max - window->Pos + ImVec2(1,1));
|
|
|
+ ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1,1), window->InnerMainRect.Max - window->Pos + ImVec2(1,1));
|
|
|
if (!window_rect_rel.Contains(window->NavRectRel[g.NavLayer]))
|
|
|
{
|
|
|
float pad = window->CalcFontSize() * 0.5f;
|
|
|
@@ -3269,7 +3276,7 @@ static void ImGui::NavUpdate()
|
|
|
g.NavScoringCount = 0;
|
|
|
#if IMGUI_DEBUG_NAV_RECTS
|
|
|
if (g.NavWindow) { for (int layer = 0; layer < 2; layer++) GetOverlayDrawList()->AddRect(g.NavWindow->Pos + g.NavWindow->NavRectRel[layer].Min, g.NavWindow->Pos + g.NavWindow->NavRectRel[layer].Max, IM_COL32(255,200,0,255)); } // [DEBUG]
|
|
|
- if (g.NavWindow) { ImU32 col = (g.NavWindow->HiddenFrames == 0) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredMousePos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); g.OverlayDrawList.AddCircleFilled(p, 3.0f, col); g.OverlayDrawList.AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); }
|
|
|
+ if (g.NavWindow) { ImU32 col = (g.NavWindow->HiddenFrames == 0) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); g.OverlayDrawList.AddCircleFilled(p, 3.0f, col); g.OverlayDrawList.AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); }
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -4524,7 +4531,7 @@ static ImGuiWindow* FindHoveredWindow()
|
|
|
continue;
|
|
|
|
|
|
// Using the clipped AABB, a child window will typically be clipped by its parent (not always)
|
|
|
- ImRect bb(window->WindowRectClipped.Min - g.Style.TouchExtraPadding, window->WindowRectClipped.Max + g.Style.TouchExtraPadding);
|
|
|
+ ImRect bb(window->OuterRectClipped.Min - g.Style.TouchExtraPadding, window->OuterRectClipped.Max + g.Style.TouchExtraPadding);
|
|
|
if (bb.Contains(g.IO.MousePos))
|
|
|
return window;
|
|
|
}
|
|
|
@@ -5193,8 +5200,7 @@ void ImGui::EndChild()
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // When using auto-filling child window, we don't provide full width/height to ItemSize so that it doesn't feed back into automatic size-fitting.
|
|
|
- ImVec2 sz = GetWindowSize();
|
|
|
+ ImVec2 sz = window->Size;
|
|
|
if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f
|
|
|
sz.x = ImMax(4.0f, sz.x);
|
|
|
if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y))
|
|
|
@@ -5500,15 +5506,26 @@ static float GetScrollMaxY(ImGuiWindow* window)
|
|
|
return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y));
|
|
|
}
|
|
|
|
|
|
-static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
|
|
|
+static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges)
|
|
|
{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
ImVec2 scroll = window->Scroll;
|
|
|
- float cr_x = window->ScrollTargetCenterRatio.x;
|
|
|
- float cr_y = window->ScrollTargetCenterRatio.y;
|
|
|
if (window->ScrollTarget.x < FLT_MAX)
|
|
|
+ {
|
|
|
+ float cr_x = window->ScrollTargetCenterRatio.x;
|
|
|
scroll.x = window->ScrollTarget.x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x);
|
|
|
+ }
|
|
|
if (window->ScrollTarget.y < FLT_MAX)
|
|
|
- scroll.y = window->ScrollTarget.y - (1.0f - cr_y) * (window->TitleBarHeight() + window->MenuBarHeight()) - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y);
|
|
|
+ {
|
|
|
+ // 'snap_on_edges' allows for a discontinuity at the edge of scrolling limits to take account of WindowPadding so that scrolling to make the last item visible scroll far enough to see the padding.
|
|
|
+ float cr_y = window->ScrollTargetCenterRatio.y;
|
|
|
+ float target_y = window->ScrollTarget.y;
|
|
|
+ if (snap_on_edges && cr_y <= 0.0f && target_y <= window->WindowPadding.y)
|
|
|
+ target_y = 0.0f;
|
|
|
+ if (snap_on_edges && cr_y >= 1.0f && target_y >= window->SizeContents.y - window->WindowPadding.y + g.Style.ItemSpacing.y)
|
|
|
+ target_y = window->SizeContents.y;
|
|
|
+ scroll.y = target_y - (1.0f - cr_y) * (window->TitleBarHeight() + window->MenuBarHeight()) - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y);
|
|
|
+ }
|
|
|
scroll = ImMax(scroll, ImVec2(0.0f, 0.0f));
|
|
|
if (!window->Collapsed && !window->SkipItems)
|
|
|
{
|
|
|
@@ -5962,7 +5979,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->FocusIdxAllRequestNext = window->FocusIdxTabRequestNext = INT_MAX;
|
|
|
|
|
|
// Apply scrolling
|
|
|
- window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window);
|
|
|
+ window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true);
|
|
|
window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);
|
|
|
|
|
|
// Apply focus, new windows appears in front
|
|
|
@@ -6099,11 +6116,12 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// Store a backup of SizeFull which we will use next frame to decide if we need scrollbars.
|
|
|
window->SizeFullAtLastBegin = window->SizeFull;
|
|
|
|
|
|
- // Update ContentsRegionMax. All the variable it depends on are set above in this function.
|
|
|
- window->ContentsRegionRect.Min.x = -window->Scroll.x + window->WindowPadding.x;
|
|
|
- window->ContentsRegionRect.Min.y = -window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
- window->ContentsRegionRect.Max.x = -window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x));
|
|
|
- window->ContentsRegionRect.Max.y = -window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y));
|
|
|
+ // Update various regions. Variables they depends on are set above in this function.
|
|
|
+ // FIXME: window->ContentsRegion.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
|
|
|
+ window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
|
|
|
+ window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
+ window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x));
|
|
|
+ window->ContentsRegionRect.Max.y = window->Pos.y - window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y));
|
|
|
|
|
|
// 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.)
|
|
|
@@ -6205,8 +6223,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
}
|
|
|
|
|
|
// Save clipped aabb so we can access it in constant-time in FindHoveredWindow()
|
|
|
- window->WindowRectClipped = window->Rect();
|
|
|
- window->WindowRectClipped.ClipWith(window->ClipRect);
|
|
|
+ window->OuterRectClipped = window->Rect();
|
|
|
+ window->OuterRectClipped.ClipWith(window->ClipRect);
|
|
|
|
|
|
// Pressing CTRL+C while holding on a window copy its content to the clipboard
|
|
|
// This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope.
|
|
|
@@ -6220,18 +6238,18 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// Inner rectangle
|
|
|
// We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame
|
|
|
// Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior.
|
|
|
- window->InnerRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize;
|
|
|
- window->InnerRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize);
|
|
|
- window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - window->WindowBorderSize;
|
|
|
- window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y - window->WindowBorderSize;
|
|
|
+ window->InnerMainRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize;
|
|
|
+ window->InnerMainRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize);
|
|
|
+ window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - window->WindowBorderSize;
|
|
|
+ window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y - window->WindowBorderSize;
|
|
|
//window->DrawList->AddRect(window->InnerRect.Min, window->InnerRect.Max, IM_COL32_WHITE);
|
|
|
|
|
|
// Inner clipping rectangle
|
|
|
// Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
|
|
|
- window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize)));
|
|
|
- window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y);
|
|
|
- window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize)));
|
|
|
- window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y);
|
|
|
+ window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize)));
|
|
|
+ window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y);
|
|
|
+ window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerMainRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize)));
|
|
|
+ window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerMainRect.Max.y);
|
|
|
|
|
|
// After Begin() we fill the last item / hovered data based on title bar data. It is a standard behavior (to allow creation of context menus on title bar only, etc.).
|
|
|
window->DC.LastItemId = window->MoveId;
|
|
|
@@ -6256,7 +6274,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->Collapsed = parent_window && parent_window->Collapsed;
|
|
|
|
|
|
if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0)
|
|
|
- window->Collapsed |= (window->WindowRectClipped.Min.x >= window->WindowRectClipped.Max.x || window->WindowRectClipped.Min.y >= window->WindowRectClipped.Max.y);
|
|
|
+ window->Collapsed |= (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y);
|
|
|
|
|
|
// We also hide the window from rendering because we've already added its border to the command list.
|
|
|
// (we could perform the check earlier in the function but it is simpler at this point)
|
|
|
@@ -7098,7 +7116,7 @@ void ImGui::SetNextWindowBgAlpha(float alpha)
|
|
|
ImVec2 ImGui::GetContentRegionMax()
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
|
- ImVec2 mx = window->ContentsRegionRect.Max;
|
|
|
+ ImVec2 mx = window->ContentsRegionRect.Max - window->Pos;
|
|
|
if (window->DC.ColumnsSet)
|
|
|
mx.x = GetColumnOffset(window->DC.ColumnsSet->Current + 1) - window->WindowPadding.x;
|
|
|
return mx;
|
|
|
@@ -7119,19 +7137,19 @@ float ImGui::GetContentRegionAvailWidth()
|
|
|
ImVec2 ImGui::GetWindowContentRegionMin()
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
|
- return window->ContentsRegionRect.Min;
|
|
|
+ return window->ContentsRegionRect.Min - window->Pos;
|
|
|
}
|
|
|
|
|
|
ImVec2 ImGui::GetWindowContentRegionMax()
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
|
- return window->ContentsRegionRect.Max;
|
|
|
+ return window->ContentsRegionRect.Max - window->Pos;
|
|
|
}
|
|
|
|
|
|
float ImGui::GetWindowContentRegionWidth()
|
|
|
{
|
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
|
- return window->ContentsRegionRect.Max.x - window->ContentsRegionRect.Min.x;
|
|
|
+ return window->ContentsRegionRect.GetWidth();
|
|
|
}
|
|
|
|
|
|
float ImGui::GetTextLineHeight()
|
|
|
@@ -7288,12 +7306,6 @@ void ImGui::SetScrollFromPosY(float pos_y, float center_y_ratio)
|
|
|
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
|
|
window->ScrollTarget.y = (float)(int)(pos_y + window->Scroll.y);
|
|
|
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
|
|
-
|
|
|
- // Minor hack to to make scrolling to top/bottom of window take account of WindowPadding, it looks more right to the user this way
|
|
|
- if (center_y_ratio <= 0.0f && window->ScrollTarget.y <= window->WindowPadding.y)
|
|
|
- window->ScrollTarget.y = 0.0f;
|
|
|
- else if (center_y_ratio >= 1.0f && window->ScrollTarget.y >= window->SizeContents.y - window->WindowPadding.y + GImGui->Style.ItemSpacing.y)
|
|
|
- window->ScrollTarget.y = window->SizeContents.y;
|
|
|
}
|
|
|
|
|
|
// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
|
|
|
@@ -10871,27 +10883,24 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
|
|
|
SetNextWindowPos(pos);
|
|
|
}
|
|
|
|
|
|
+ // Horizontally align ourselves with the framed text
|
|
|
+ PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(style.FramePadding.x, style.WindowPadding.y));
|
|
|
+
|
|
|
ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings;
|
|
|
if (!Begin(name, NULL, window_flags))
|
|
|
{
|
|
|
EndPopup();
|
|
|
+ PopStyleVar();
|
|
|
IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- // Horizontally align ourselves with the framed text
|
|
|
- if (style.FramePadding.x != style.WindowPadding.x)
|
|
|
- Indent(style.FramePadding.x - style.WindowPadding.x);
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
void ImGui::EndCombo()
|
|
|
{
|
|
|
- const ImGuiStyle& style = GImGui->Style;
|
|
|
- if (style.FramePadding.x != style.WindowPadding.x)
|
|
|
- Unindent(style.FramePadding.x - style.WindowPadding.x);
|
|
|
EndPopup();
|
|
|
+ PopStyleVar();
|
|
|
}
|
|
|
|
|
|
// Old API, prefer using BeginCombo() nowadays if you can.
|
|
|
@@ -11283,7 +11292,7 @@ bool ImGui::BeginMenuBar()
|
|
|
// We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy.
|
|
|
ImRect bar_rect = window->MenuBarRect();
|
|
|
ImRect clip_rect(ImFloor(bar_rect.Min.x + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - window->WindowRounding) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f));
|
|
|
- clip_rect.ClipWith(window->WindowRectClipped);
|
|
|
+ clip_rect.ClipWith(window->OuterRectClipped);
|
|
|
PushClipRect(clip_rect.Min, clip_rect.Max, false);
|
|
|
|
|
|
window->DC.CursorPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y);
|
|
|
@@ -13306,12 +13315,12 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
{
|
|
|
if (ImGui::Begin("ImGui Metrics", p_open))
|
|
|
{
|
|
|
+ static bool show_draw_cmd_clip_rects = true;
|
|
|
ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
|
|
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
|
|
ImGui::Text("%d vertices, %d indices (%d triangles)", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices, ImGui::GetIO().MetricsRenderIndices / 3);
|
|
|
ImGui::Text("%d allocations", (int)GImAllocatorActiveAllocationsCount);
|
|
|
- static bool show_clip_rects = true;
|
|
|
- ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_clip_rects);
|
|
|
+ ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_draw_cmd_clip_rects);
|
|
|
ImGui::Separator();
|
|
|
|
|
|
struct Funcs
|
|
|
@@ -13345,7 +13354,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
}
|
|
|
ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;
|
|
|
bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %4d %s vtx, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
|
|
|
- if (show_clip_rects && ImGui::IsItemHovered())
|
|
|
+ if (show_draw_cmd_clip_rects && ImGui::IsItemHovered())
|
|
|
{
|
|
|
ImRect clip_rect = pcmd->ClipRect;
|
|
|
ImRect vtxs_rect;
|