mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Internal: Made ScrollToBringRectIntoView() handle recursing back to scroll parent window, so the function can be called elsewhere (instead of 1 deep recursion done in NavUpdateMoveResult().
This commit is contained in:
parent
6a0d0dab5a
commit
9bd7846f07
48
imgui.cpp
48
imgui.cpp
@ -7165,22 +7165,33 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool s
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Scroll to keep newly navigated item fully into view
|
// Scroll to keep newly navigated item fully into view
|
||||||
void ImGui::ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect)
|
ImVec2 ImGui::ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect)
|
||||||
{
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1));
|
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]
|
//GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG]
|
||||||
if (window_rect.Contains(item_rect))
|
|
||||||
return;
|
|
||||||
|
|
||||||
ImGuiContext& g = *GImGui;
|
ImVec2 delta_scroll;
|
||||||
if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x)
|
if (!window_rect.Contains(item_rect))
|
||||||
SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x + g.Style.ItemSpacing.x, 0.0f);
|
{
|
||||||
else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x)
|
if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x)
|
||||||
SetScrollFromPosX(window, item_rect.Max.x - window->Pos.x + g.Style.ItemSpacing.x, 1.0f);
|
SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x + g.Style.ItemSpacing.x, 0.0f);
|
||||||
if (item_rect.Min.y < window_rect.Min.y)
|
else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x)
|
||||||
SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y - g.Style.ItemSpacing.y, 0.0f);
|
SetScrollFromPosX(window, item_rect.Max.x - window->Pos.x + g.Style.ItemSpacing.x, 1.0f);
|
||||||
else if (item_rect.Max.y >= window_rect.Max.y)
|
if (item_rect.Min.y < window_rect.Min.y)
|
||||||
SetScrollFromPosY(window, item_rect.Max.y - window->Pos.y + g.Style.ItemSpacing.y, 1.0f);
|
SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y - g.Style.ItemSpacing.y, 0.0f);
|
||||||
|
else if (item_rect.Max.y >= window_rect.Max.y)
|
||||||
|
SetScrollFromPosY(window, item_rect.Max.y - window->Pos.y + g.Style.ItemSpacing.y, 1.0f);
|
||||||
|
|
||||||
|
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window, false);
|
||||||
|
delta_scroll = next_scroll - window->Scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also scroll parent window to keep us into view if necessary
|
||||||
|
if (window->Flags & ImGuiWindowFlags_ChildWindow)
|
||||||
|
delta_scroll += ScrollToBringRectIntoView(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll));
|
||||||
|
|
||||||
|
return delta_scroll;
|
||||||
}
|
}
|
||||||
|
|
||||||
float ImGui::GetScrollX()
|
float ImGui::GetScrollX()
|
||||||
@ -8484,16 +8495,11 @@ static void ImGui::NavUpdateMoveResult()
|
|||||||
if (g.NavLayer == 0)
|
if (g.NavLayer == 0)
|
||||||
{
|
{
|
||||||
ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos);
|
ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos);
|
||||||
ScrollToBringRectIntoView(result->Window, rect_abs);
|
ImVec2 delta_scroll = ScrollToBringRectIntoView(result->Window, rect_abs);
|
||||||
|
|
||||||
// Estimate upcoming scroll so we can offset our result position so mouse position can be applied immediately after in NavUpdate()
|
// Offset our result position so mouse position can be applied immediately after in NavUpdate()
|
||||||
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(result->Window, false);
|
result->RectRel.TranslateX(-delta_scroll.x);
|
||||||
ImVec2 delta_scroll = result->Window->Scroll - next_scroll;
|
result->RectRel.TranslateY(-delta_scroll.y);
|
||||||
result->RectRel.Translate(delta_scroll);
|
|
||||||
|
|
||||||
// Also scroll parent window to keep us into view if necessary (we could/should technically recurse back the whole the parent hierarchy).
|
|
||||||
if (result->Window->Flags & ImGuiWindowFlags_ChildWindow)
|
|
||||||
ScrollToBringRectIntoView(result->Window->ParentWindow, ImRect(rect_abs.Min + delta_scroll, rect_abs.Max + delta_scroll));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClearActiveID();
|
ClearActiveID();
|
||||||
|
@ -1502,7 +1502,7 @@ namespace ImGui
|
|||||||
IMGUI_API void SetScrollY(ImGuiWindow* window, float new_scroll_y);
|
IMGUI_API void SetScrollY(ImGuiWindow* window, float new_scroll_y);
|
||||||
IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio = 0.5f);
|
IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio = 0.5f);
|
||||||
IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio = 0.5f);
|
IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio = 0.5f);
|
||||||
IMGUI_API void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect);
|
IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect);
|
||||||
|
|
||||||
// Basic Accessors
|
// Basic Accessors
|
||||||
inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; }
|
inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; }
|
||||||
|
Loading…
Reference in New Issue
Block a user