mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01: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:
		
							
								
								
									
										32
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -7165,14 +7165,15 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool s | ||||
| } | ||||
|  | ||||
| // 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)); | ||||
|     //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_rect.Contains(item_rect)) | ||||
|     { | ||||
|         if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x) | ||||
|             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) | ||||
| @@ -7181,6 +7182,16 @@ void ImGui::ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_re | ||||
|             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() | ||||
| @@ -8484,16 +8495,11 @@ static void ImGui::NavUpdateMoveResult() | ||||
|     if (g.NavLayer == 0) | ||||
|     { | ||||
|         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() | ||||
|         ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(result->Window, false); | ||||
|         ImVec2 delta_scroll = result->Window->Scroll - next_scroll; | ||||
|         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)); | ||||
|         // Offset our result position so mouse position can be applied immediately after in NavUpdate() | ||||
|         result->RectRel.TranslateX(-delta_scroll.x); | ||||
|         result->RectRel.TranslateY(-delta_scroll.y); | ||||
|     } | ||||
|  | ||||
|     ClearActiveID(); | ||||
|   | ||||
| @@ -1502,7 +1502,7 @@ namespace ImGui | ||||
|     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          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 | ||||
|     inline ImGuiID          GetItemID()     { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user