mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01: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:
		
							
								
								
									
										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.
 | 
			
		||||
    // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad all movements are relative
 | 
			
		||||
    // (can't focus a visible object like we can with the mouse).
 | 
			
		||||
    // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling,
 | 
			
		||||
    // 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))
 | 
			
		||||
    {
 | 
			
		||||
        bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 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)));
 | 
			
		||||
 | 
			
		||||
        // 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]))
 | 
			
		||||
        {
 | 
			
		||||
            //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_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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user