mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Nav, Drag and Drop, Docking: fixed two issues leading nav result to conflict with moving a window. (#4211, #3025)
This commit is contained in:
		
							
								
								
									
										22
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -3582,8 +3582,9 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window) | ||||
|     FocusWindow(window); | ||||
|     SetActiveID(window->MoveId, window); | ||||
|     g.NavDisableHighlight = true; | ||||
|     g.ActiveIdNoClearOnFocusLoss = true; | ||||
|     g.ActiveIdClickOffset = g.IO.MouseClickedPos[0] - window->RootWindowDockTree->Pos; | ||||
|     g.ActiveIdNoClearOnFocusLoss = true; | ||||
|     SetActiveIdUsingNavAndKeys(); | ||||
|  | ||||
|     bool can_move_window = true; | ||||
|     if ((window->Flags & ImGuiWindowFlags_NoMove) || (window->RootWindowDockTree->Flags & ImGuiWindowFlags_NoMove)) | ||||
| @@ -3665,8 +3666,8 @@ void ImGui::UpdateMouseMovingWindowNewFrame() | ||||
|             // Clear the NoInput window flag set by the Viewport system | ||||
|             moving_window->Viewport->Flags &= ~ImGuiViewportFlags_NoInputs; // FIXME-VIEWPORT: Test engine managed to crash here because Viewport was NULL. | ||||
|  | ||||
|             ClearActiveID(); | ||||
|             g.MovingWindow = NULL; | ||||
|             ClearActiveID(); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
| @@ -5213,6 +5214,16 @@ void ImGui::SetItemUsingMouseWheel() | ||||
|         g.ActiveIdUsingMouseWheel = true; | ||||
| } | ||||
|  | ||||
| void ImGui::SetActiveIdUsingNavAndKeys() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     IM_ASSERT(g.ActiveId != 0); | ||||
|     g.ActiveIdUsingNavDirMask = ~(ImU32)0; | ||||
|     g.ActiveIdUsingNavInputMask = ~(ImU32)0; | ||||
|     g.ActiveIdUsingKeyInputMask = ~(ImU64)0; | ||||
|     NavMoveRequestCancel(); | ||||
| } | ||||
|  | ||||
| ImVec2 ImGui::GetItemRectMin() | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindowRead(); | ||||
| @@ -10571,10 +10582,8 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) | ||||
|         source_parent_id = window->IDStack.back(); | ||||
|         source_drag_active = IsMouseDragging(mouse_button); | ||||
|  | ||||
|         // Disable navigation and key inputs while dragging | ||||
|         g.ActiveIdUsingNavDirMask = ~(ImU32)0; | ||||
|         g.ActiveIdUsingNavInputMask = ~(ImU32)0; | ||||
|         g.ActiveIdUsingKeyInputMask = ~(ImU64)0; | ||||
|         // Disable navigation and key inputs while dragging + cancel existing request if any | ||||
|         SetActiveIdUsingNavAndKeys(); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| @@ -16524,6 +16533,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|         Indent(); | ||||
|         Text("ActiveId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d, Source: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, g.ActiveIdAllowOverlap, input_source_names[g.ActiveIdSource]); | ||||
|         Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); | ||||
|         Text("ActiveIdUsing: Wheel: %d, NavDirMask: %X, NavInputMask: %X, KeyInputMask: %X", g.ActiveIdUsingMouseWheel, g.ActiveIdUsingNavDirMask, g.ActiveIdUsingNavInputMask, g.ActiveIdUsingKeyInputMask); | ||||
|         Text("HoveredId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredId, g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Data is "in-flight" so depending on when the Metrics window is called we may see current frame information or not | ||||
|         Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); | ||||
|         Unindent(); | ||||
|   | ||||
| @@ -2665,6 +2665,7 @@ namespace ImGui | ||||
|     // Inputs | ||||
|     // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. | ||||
|     IMGUI_API void          SetItemUsingMouseWheel(); | ||||
|     IMGUI_API void          SetActiveIdUsingNavAndKeys(); | ||||
|     inline bool             IsActiveIdUsingNavDir(ImGuiDir dir)                         { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } | ||||
|     inline bool             IsActiveIdUsingNavInput(ImGuiNavInput input)                { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; } | ||||
|     inline bool             IsActiveIdUsingKey(ImGuiKey key)                            { ImGuiContext& g = *GImGui; IM_ASSERT(key < 64); return (g.ActiveIdUsingKeyInputMask & ((ImU64)1 << key)) != 0; } | ||||
|   | ||||
| @@ -7987,11 +7987,13 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|             if (undocking_tab) | ||||
|             { | ||||
|                 // Undock | ||||
|                 // FIXME: refactor to share more code with e.g. StartMouseMovingWindow | ||||
|                 DockContextQueueUndockWindow(&g, docked_window); | ||||
|                 g.MovingWindow = docked_window; | ||||
|                 SetActiveID(g.MovingWindow->MoveId, g.MovingWindow); | ||||
|                 g.ActiveIdClickOffset -= g.MovingWindow->Pos - bb.Min; | ||||
|                 g.ActiveIdNoClearOnFocusLoss = true; | ||||
|                 SetActiveIdUsingNavAndKeys(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user