mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-23 04:17:00 +00:00
Nav: Removed stateful NavMoveFromClampedRefRect and made it more explicit that nav move request from gamepad start from a clipped location.
This commit is contained in:
parent
4448734041
commit
1e8b9f84da
14
imgui.cpp
14
imgui.cpp
@ -8746,15 +8746,9 @@ static void ImGui::NavUpdate()
|
|||||||
// Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds.
|
// Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds.
|
||||||
ImVec2 scroll_dir = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiInputReadMode_Down, 1.0f / 10.0f, 10.0f);
|
ImVec2 scroll_dir = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiInputReadMode_Down, 1.0f / 10.0f, 10.0f);
|
||||||
if (scroll_dir.x != 0.0f && window->ScrollbarX)
|
if (scroll_dir.x != 0.0f && window->ScrollbarX)
|
||||||
{
|
|
||||||
SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed));
|
SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed));
|
||||||
g.NavMoveFromClampedRefRect = true;
|
|
||||||
}
|
|
||||||
if (scroll_dir.y != 0.0f)
|
if (scroll_dir.y != 0.0f)
|
||||||
{
|
|
||||||
SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed));
|
SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed));
|
||||||
g.NavMoveFromClampedRefRect = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset search results
|
// Reset search results
|
||||||
@ -8762,8 +8756,10 @@ static void ImGui::NavUpdate()
|
|||||||
g.NavMoveResultLocalVisibleSet.Clear();
|
g.NavMoveResultLocalVisibleSet.Clear();
|
||||||
g.NavMoveResultOther.Clear();
|
g.NavMoveResultOther.Clear();
|
||||||
|
|
||||||
// When we have manually scrolled (without using navigation) and NavId becomes out of bounds, we project its bounding box to the visible area to restart navigation within visible items
|
// When using gamepad, we project the reference nav bounding box into window visible area.
|
||||||
if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == ImGuiNavLayer_Main)
|
// This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad every movements are relative
|
||||||
|
// (can't focus a visible object like we can with the mouse).
|
||||||
|
if (g.NavMoveRequest && g.NavInputSource == ImGuiInputSource_NavGamepad && g.NavLayer == ImGuiNavLayer_Main)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = g.NavWindow;
|
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->InnerRect.Min - window->Pos - ImVec2(1, 1), window->InnerRect.Max - window->Pos + ImVec2(1, 1));
|
||||||
@ -8774,7 +8770,6 @@ static void ImGui::NavUpdate()
|
|||||||
window->NavRectRel[g.NavLayer].ClipWith(window_rect_rel);
|
window->NavRectRel[g.NavLayer].ClipWith(window_rect_rel);
|
||||||
g.NavId = g.NavFocusScopeId = 0;
|
g.NavId = g.NavFocusScopeId = 0;
|
||||||
}
|
}
|
||||||
g.NavMoveFromClampedRefRect = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// For scoring we use a single segment on the left side our current item bounding box (not touching the edge to avoid box overlap with zero-spaced items)
|
// For scoring we use a single segment on the left side our current item bounding box (not touching the edge to avoid box overlap with zero-spaced items)
|
||||||
@ -8856,7 +8851,6 @@ static void ImGui::NavUpdateMoveResult()
|
|||||||
g.NavJustMovedToKeyMods = g.NavMoveRequestKeyMods;
|
g.NavJustMovedToKeyMods = g.NavMoveRequestKeyMods;
|
||||||
}
|
}
|
||||||
SetNavIDWithRectRel(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel);
|
SetNavIDWithRectRel(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel);
|
||||||
g.NavMoveFromClampedRefRect = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle PageUp/PageDown/Home/End keys
|
// Handle PageUp/PageDown/Home/End keys
|
||||||
|
@ -1204,7 +1204,6 @@ struct ImGuiContext
|
|||||||
bool NavInitRequestFromMove;
|
bool NavInitRequestFromMove;
|
||||||
ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
|
ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
|
||||||
ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window)
|
ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window)
|
||||||
bool NavMoveFromClampedRefRect; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items
|
|
||||||
bool NavMoveRequest; // Move request for this frame
|
bool NavMoveRequest; // Move request for this frame
|
||||||
ImGuiNavMoveFlags NavMoveRequestFlags;
|
ImGuiNavMoveFlags NavMoveRequestFlags;
|
||||||
ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
|
ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
|
||||||
@ -1390,7 +1389,6 @@ struct ImGuiContext
|
|||||||
NavInitRequest = false;
|
NavInitRequest = false;
|
||||||
NavInitRequestFromMove = false;
|
NavInitRequestFromMove = false;
|
||||||
NavInitResultId = 0;
|
NavInitResultId = 0;
|
||||||
NavMoveFromClampedRefRect = false;
|
|
||||||
NavMoveRequest = false;
|
NavMoveRequest = false;
|
||||||
NavMoveRequestFlags = ImGuiNavMoveFlags_None;
|
NavMoveRequestFlags = ImGuiNavMoveFlags_None;
|
||||||
NavMoveRequestForward = ImGuiNavForward_None;
|
NavMoveRequestForward = ImGuiNavForward_None;
|
||||||
|
Loading…
Reference in New Issue
Block a user