mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-25 06:29:01 +08:00
Nav: Extract part of NavUpdate() into a saner NavScrollToBringItemIntoView() (#787)
This commit is contained in:
parent
7a14d7dfdc
commit
2047c58efb
71
imgui.cpp
71
imgui.cpp
@ -2611,6 +2611,42 @@ static ImVec2 GetNavInputAmount2d(int stick_no, ImGuiNavReadMode mode, float slo
|
|||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated.
|
||||||
|
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));
|
||||||
|
//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;
|
||||||
|
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if (window->ScrollbarX && item_rect_rel.Min.x < window_rect_rel.Min.x)
|
||||||
|
{
|
||||||
|
window->ScrollTarget.x = item_rect_rel.Min.x + window->Scroll.x - g.Style.ItemSpacing.x;
|
||||||
|
window->ScrollTargetCenterRatio.x = 0.0f;
|
||||||
|
}
|
||||||
|
else if (window->ScrollbarX && item_rect_rel.Max.x >= window_rect_rel.Max.x)
|
||||||
|
{
|
||||||
|
window->ScrollTarget.x = item_rect_rel.Max.x + window->Scroll.x + g.Style.ItemSpacing.x;
|
||||||
|
window->ScrollTargetCenterRatio.x = 1.0f;
|
||||||
|
}
|
||||||
|
if (item_rect_rel.Min.y < window_rect_rel.Min.y)
|
||||||
|
{
|
||||||
|
window->ScrollTarget.y = item_rect_rel.Min.y + window->Scroll.y - g.Style.ItemSpacing.y;
|
||||||
|
window->ScrollTargetCenterRatio.y = 0.0f;
|
||||||
|
}
|
||||||
|
else if (item_rect_rel.Max.y >= window_rect_rel.Max.y)
|
||||||
|
{
|
||||||
|
window->ScrollTarget.y = item_rect_rel.Max.y + window->Scroll.y + g.Style.ItemSpacing.y;
|
||||||
|
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);
|
||||||
|
item_rect_rel.Translate(window->Scroll - next_scroll);
|
||||||
|
}
|
||||||
|
|
||||||
static void NavUpdate()
|
static void NavUpdate()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -2634,39 +2670,10 @@ static void NavUpdate()
|
|||||||
// Process navigation move request
|
// Process navigation move request
|
||||||
if (g.NavMoveRequest && g.NavMoveResultId != 0)
|
if (g.NavMoveRequest && g.NavMoveResultId != 0)
|
||||||
{
|
{
|
||||||
IM_ASSERT(g.NavWindow);
|
|
||||||
ImGuiWindow* window = g.NavWindow;
|
|
||||||
|
|
||||||
// Scroll to keep newly navigated item fully into view
|
// 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));
|
IM_ASSERT(g.NavWindow);
|
||||||
//g.OverlayDrawList.AddRect(window->Pos + window_rect_rel.Min, window->Pos + window_rect_rel.Max, IM_COL32_WHITE); // [DEBUG]
|
if (g.NavLayer == 0)
|
||||||
if (g.NavLayer == 0 && !window_rect_rel.Contains(g.NavMoveResultRectRel))
|
NavScrollToBringItemIntoView(g.NavWindow, g.NavMoveResultRectRel);
|
||||||
{
|
|
||||||
if (window->ScrollbarX && g.NavMoveResultRectRel.Min.x < window_rect_rel.Min.x)
|
|
||||||
{
|
|
||||||
window->ScrollTarget.x = g.NavMoveResultRectRel.Min.x + window->Scroll.x - g.Style.ItemSpacing.x;
|
|
||||||
window->ScrollTargetCenterRatio.x = 0.0f;
|
|
||||||
}
|
|
||||||
else if (window->ScrollbarX && g.NavMoveResultRectRel.Max.x >= window_rect_rel.Max.x)
|
|
||||||
{
|
|
||||||
window->ScrollTarget.x = g.NavMoveResultRectRel.Max.x + window->Scroll.x + g.Style.ItemSpacing.x;
|
|
||||||
window->ScrollTargetCenterRatio.x = 1.0f;
|
|
||||||
}
|
|
||||||
if (g.NavMoveResultRectRel.Min.y < window_rect_rel.Min.y)
|
|
||||||
{
|
|
||||||
window->ScrollTarget.y = g.NavMoveResultRectRel.Min.y + window->Scroll.y - g.Style.ItemSpacing.y;
|
|
||||||
window->ScrollTargetCenterRatio.y = 0.0f;
|
|
||||||
}
|
|
||||||
else if (g.NavMoveResultRectRel.Max.y >= window_rect_rel.Max.y)
|
|
||||||
{
|
|
||||||
window->ScrollTarget.y = g.NavMoveResultRectRel.Max.y + window->Scroll.y + g.Style.ItemSpacing.y;
|
|
||||||
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);
|
|
||||||
g.NavMoveResultRectRel.Translate(window->Scroll - next_scroll);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply result from previous frame navigation directional move request
|
// Apply result from previous frame navigation directional move request
|
||||||
ImGui::ClearActiveID();
|
ImGui::ClearActiveID();
|
||||||
|
Loading…
Reference in New Issue
Block a user