mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +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