mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 11:57:00 +00:00
Nav: Fixed an issue with Gamepad navigation when the movement lead to a scroll and frame time > repeat rate. (#6171)
This commit is contained in:
parent
c9a53aa74d
commit
5a1e6b60a2
@ -51,6 +51,9 @@ Other changes:
|
|||||||
allowing to press buttons with Enter. (#5606)
|
allowing to press buttons with Enter. (#5606)
|
||||||
(Enter emulates a "prefer text input" activation vs.
|
(Enter emulates a "prefer text input" activation vs.
|
||||||
Space emulates a "prefer tweak" activation which is to closer to gamepad controls).
|
Space emulates a "prefer tweak" activation which is to closer to gamepad controls).
|
||||||
|
- Nav: Fixed an issue with Gamepad navigation when the movement lead to a scroll and
|
||||||
|
frame time > repeat rate. Triggering a new move request on the same frame as a move
|
||||||
|
result lead to an incorrect calculation and loss of navigation id. (#6171)
|
||||||
- Drag and Drop: Fixed handling of overlapping targets when smaller one is submitted
|
- Drag and Drop: Fixed handling of overlapping targets when smaller one is submitted
|
||||||
before and can accept the same data type. (#6183).
|
before and can accept the same data type. (#6183).
|
||||||
- Drag and Drop: Clear drag and drop state as soon as delivery is accepted in order to
|
- Drag and Drop: Clear drag and drop state as soon as delivery is accepted in order to
|
||||||
|
11
imgui.cpp
11
imgui.cpp
@ -11262,16 +11262,21 @@ void ImGui::NavUpdateCreateMoveRequest()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// When using gamepad, we project the reference nav bounding box into window visible area.
|
// When using gamepad, we project the reference nav bounding box into window visible area.
|
||||||
// This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad all movements are relative
|
// This is to allow resuming navigation inside the visible area after doing a large amount of scrolling,
|
||||||
// (can't focus a visible object like we can with the mouse).
|
// since with gamepad all movements are relative (can't focus a visible object like we can with the mouse).
|
||||||
if (g.NavMoveSubmitted && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main && window != NULL)// && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded))
|
if (g.NavMoveSubmitted && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main && window != NULL)// && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded))
|
||||||
{
|
{
|
||||||
bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 0;
|
bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 0;
|
||||||
bool clamp_y = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapY)) == 0;
|
bool clamp_y = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapY)) == 0;
|
||||||
ImRect inner_rect_rel = WindowRectAbsToRel(window, ImRect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)));
|
ImRect inner_rect_rel = WindowRectAbsToRel(window, ImRect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)));
|
||||||
|
|
||||||
|
// Take account of changing scroll to handle triggering a new move request on a scrolling frame. (#6171)
|
||||||
|
// Otherwise 'inner_rect_rel' would be off on the move result frame.
|
||||||
|
inner_rect_rel.Translate(CalcNextScrollFromScrollTargetAndClamp(window) - window->Scroll);
|
||||||
|
|
||||||
if ((clamp_x || clamp_y) && !inner_rect_rel.Contains(window->NavRectRel[g.NavLayer]))
|
if ((clamp_x || clamp_y) && !inner_rect_rel.Contains(window->NavRectRel[g.NavLayer]))
|
||||||
{
|
{
|
||||||
//IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n");
|
IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n");
|
||||||
float pad_x = ImMin(inner_rect_rel.GetWidth(), window->CalcFontSize() * 0.5f);
|
float pad_x = ImMin(inner_rect_rel.GetWidth(), window->CalcFontSize() * 0.5f);
|
||||||
float pad_y = ImMin(inner_rect_rel.GetHeight(), window->CalcFontSize() * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item
|
float pad_y = ImMin(inner_rect_rel.GetHeight(), window->CalcFontSize() * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item
|
||||||
inner_rect_rel.Min.x = clamp_x ? (inner_rect_rel.Min.x + pad_x) : -FLT_MAX;
|
inner_rect_rel.Min.x = clamp_x ? (inner_rect_rel.Min.x + pad_x) : -FLT_MAX;
|
||||||
|
Loading…
Reference in New Issue
Block a user