mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Nav: set NavJustMovedToXXX fields on NavInit result + BeginChild() clears ActiveId on N+1 on entering instead of waiting for ID to elapse on N+2.
# Conflicts: # imgui_internal.h
This commit is contained in:
		
							
								
								
									
										38
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -5322,11 +5322,14 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b | ||||
|  | ||||
|     // Process navigation-in immediately so NavInit can run on first frame | ||||
|     // Can enter a child if (A) it has navigatable items or (B) it can be scrolled. | ||||
|     const ImGuiID temp_id_for_activation = (id + 1); | ||||
|     if (g.ActiveId == temp_id_for_activation) | ||||
|         ClearActiveID(); | ||||
|     if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY)) | ||||
|     { | ||||
|         FocusWindow(child_window); | ||||
|         NavInitWindow(child_window, false); | ||||
|         SetActiveID(id + 1, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item | ||||
|         SetActiveID(temp_id_for_activation, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item | ||||
|         g.ActiveIdSource = g.NavInputSource; | ||||
|     } | ||||
|     return ret; | ||||
| @@ -7583,12 +7586,11 @@ void ImGui::SetItemDefaultFocus() | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|     if (!window->Appearing) | ||||
|         return; | ||||
|     if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResultId == 0) || g.NavLayer != window->DC.NavLayerCurrent) | ||||
|     if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResult.ID == 0) || g.NavLayer != window->DC.NavLayerCurrent) | ||||
|         return; | ||||
|  | ||||
|     g.NavInitRequest = false; | ||||
|     g.NavInitResultId = g.LastItemData.ID; | ||||
|     g.NavInitResultRectRel = WindowRectAbsToRel(window, g.LastItemData.Rect); | ||||
|     NavApplyItemToResult(&g.NavInitResult); | ||||
|     NavUpdateAnyRequestFlag(); | ||||
|  | ||||
|     // Scroll could be done in NavInitRequestApplyResult() via an opt-in flag (we however don't want regular init requests to scroll) | ||||
| @@ -10879,10 +10881,9 @@ static void ImGui::NavProcessItem() | ||||
|     { | ||||
|         // Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback | ||||
|         const bool candidate_for_nav_default_focus = (item_flags & ImGuiItemFlags_NoNavDefaultFocus) == 0; | ||||
|         if (candidate_for_nav_default_focus || g.NavInitResultId == 0) | ||||
|         if (candidate_for_nav_default_focus || g.NavInitResult.ID == 0) | ||||
|         { | ||||
|             g.NavInitResultId = id; | ||||
|             g.NavInitResultRectRel = WindowRectAbsToRel(window, nav_bb); | ||||
|             NavApplyItemToResult(&g.NavInitResult); | ||||
|         } | ||||
|         if (candidate_for_nav_default_focus) | ||||
|         { | ||||
| @@ -11140,8 +11141,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) | ||||
|         SetNavID(0, g.NavLayer, window->NavRootFocusScopeId, ImRect()); | ||||
|         g.NavInitRequest = true; | ||||
|         g.NavInitRequestFromMove = false; | ||||
|         g.NavInitResultId = 0; | ||||
|         g.NavInitResultRectRel = ImRect(); | ||||
|         g.NavInitResult.ID = 0; | ||||
|         NavUpdateAnyRequestFlag(); | ||||
|     } | ||||
|     else | ||||
| @@ -11226,12 +11226,12 @@ static void ImGui::NavUpdate() | ||||
|                 g.NavInputSource = ImGuiInputSource_Keyboard; | ||||
|  | ||||
|     // Process navigation init request (select first/default focus) | ||||
|     if (g.NavInitResultId != 0) | ||||
|     g.NavJustMovedToId = 0; | ||||
|     if (g.NavInitResult.ID != 0) | ||||
|         NavInitRequestApplyResult(); | ||||
|     g.NavInitRequest = false; | ||||
|     g.NavInitRequestFromMove = false; | ||||
|     g.NavInitResultId = 0; | ||||
|     g.NavJustMovedToId = 0; | ||||
|     g.NavInitResult.ID = 0; | ||||
|  | ||||
|     // Process navigation move request | ||||
|     if (g.NavMoveSubmitted) | ||||
| @@ -11371,10 +11371,18 @@ void ImGui::NavInitRequestApplyResult() | ||||
|     if (!g.NavWindow) | ||||
|         return; | ||||
|  | ||||
|     ImGuiNavItemData* result = &g.NavInitResult; | ||||
|     if (g.NavId != result->ID) | ||||
|     { | ||||
|         g.NavJustMovedToId = result->ID; | ||||
|         g.NavJustMovedToFocusScopeId = result->FocusScopeId; | ||||
|         g.NavJustMovedToKeyMods = 0; | ||||
|     } | ||||
|  | ||||
|     // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called) | ||||
|     // FIXME-NAV: On _NavFlattened windows, g.NavWindow will only be updated during subsequent frame. Not a problem currently. | ||||
|     IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name); | ||||
|     SetNavID(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel); | ||||
|     IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); | ||||
|     SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); | ||||
|     g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result | ||||
|     if (g.NavInitRequestFromMove) | ||||
|         NavRestoreHighlightAfterMove(); | ||||
| @@ -11473,7 +11481,7 @@ void ImGui::NavUpdateCreateMoveRequest() | ||||
|     { | ||||
|         IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from move, window \"%s\", layer=%d\n", window ? window->Name : "<NULL>", g.NavLayer); | ||||
|         g.NavInitRequest = g.NavInitRequestFromMove = true; | ||||
|         g.NavInitResultId = 0; | ||||
|         g.NavInitResult.ID = 0; | ||||
|         g.NavDisableHighlight = false; | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user