mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 09:44:29 +00:00 
			
		
		
		
	Drag and Drop: Source doesn't report as hovered (at a lower-level). Source disable AllowOverlap flag if any set. (#143)
This commit is contained in:
		
							
								
								
									
										15
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -7685,8 +7685,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
 | 
				
			|||||||
    bool pressed = false;
 | 
					    bool pressed = false;
 | 
				
			||||||
    bool hovered = ItemHoverable(bb, id);
 | 
					    bool hovered = ItemHoverable(bb, id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Drag source doesn't report as hovered
 | 
				
			||||||
 | 
					    if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id)
 | 
				
			||||||
 | 
					        hovered = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button
 | 
					    // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button
 | 
				
			||||||
    if ((flags & ImGuiButtonFlags_PressedOnDragDropHold) && g.DragDropActive && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers))
 | 
					    if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers))
 | 
				
			||||||
        if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
 | 
					        if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            hovered = true;
 | 
					            hovered = true;
 | 
				
			||||||
@@ -11825,7 +11829,6 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl
 | 
				
			|||||||
        SameLine();
 | 
					        SameLine();
 | 
				
			||||||
        TextUnformatted("Color");
 | 
					        TextUnformatted("Color");
 | 
				
			||||||
        EndDragDropSource();
 | 
					        EndDragDropSource();
 | 
				
			||||||
        hovered = false;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Tooltip
 | 
					    // Tooltip
 | 
				
			||||||
@@ -13172,6 +13175,10 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
 | 
				
			|||||||
            if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker.
 | 
					            if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker.
 | 
				
			||||||
                g.ActiveIdAllowOverlap = is_hovered;
 | 
					                g.ActiveIdAllowOverlap = is_hovered;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            g.ActiveIdAllowOverlap = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (g.ActiveId != source_id)
 | 
					        if (g.ActiveId != source_id)
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        source_parent_id = window->IDStack.back();
 | 
					        source_parent_id = window->IDStack.back();
 | 
				
			||||||
@@ -13655,8 +13662,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
 | 
				
			|||||||
            const char* input_source_names[] = { "None", "Mouse", "Nav", "NavKeyboard", "NavGamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT);
 | 
					            const char* input_source_names[] = { "None", "Mouse", "Nav", "NavKeyboard", "NavGamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT);
 | 
				
			||||||
            ImGui::Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL");
 | 
					            ImGui::Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL");
 | 
				
			||||||
            ImGui::Text("HoveredRootWindow: '%s'", g.HoveredRootWindow ? g.HoveredRootWindow->Name : "NULL");
 | 
					            ImGui::Text("HoveredRootWindow: '%s'", g.HoveredRootWindow ? g.HoveredRootWindow->Name : "NULL");
 | 
				
			||||||
            ImGui::Text("HoveredId: 0x%08X/0x%08X (%.2f sec)", g.HoveredId, g.HoveredIdPreviousFrame, g.HoveredIdTimer); // Data is "in-flight" so depending on when the Metrics window is called we may see current frame information or not
 | 
					            ImGui::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
 | 
				
			||||||
            ImGui::Text("ActiveId: 0x%08X/0x%08X (%.2f sec), ActiveIdSource: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, input_source_names[g.ActiveIdSource]);
 | 
					            ImGui::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]);
 | 
				
			||||||
            ImGui::Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL");
 | 
					            ImGui::Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL");
 | 
				
			||||||
            ImGui::Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL");
 | 
					            ImGui::Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL");
 | 
				
			||||||
            ImGui::Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL");
 | 
					            ImGui::Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user