mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 14:41:05 +01:00 
			
		
		
		
	Drag and Drop: Added support for drag and drop hold-long-to-open for CollapsingHeader() and TreeNode(). Open only!
This commit is contained in:
		
							
								
								
									
										13
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -5841,6 +5841,16 @@ 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 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 && !hovered)
 | 
				
			||||||
 | 
					        if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            hovered = true;
 | 
				
			||||||
 | 
					            SetHoveredID(id);
 | 
				
			||||||
 | 
					            if (CalcTypematicPressedRepeatAmount(g.HoveredIdTimer + 0.0001f, g.HoveredIdTimer + 0.0001f - g.IO.DeltaTime, 0.01f, 0.70f)) // FIXME: Our formula for CalcTypematicPressedRepeatAmount() is fishy
 | 
				
			||||||
 | 
					                pressed = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((flags & ImGuiButtonFlags_FlattenChilds) && g.HoveredRootWindow == window)
 | 
					    if ((flags & ImGuiButtonFlags_FlattenChilds) && g.HoveredRootWindow == window)
 | 
				
			||||||
        g.HoveredWindow = backup_hovered_window;
 | 
					        g.HoveredWindow = backup_hovered_window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -6271,6 +6281,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
 | 
				
			|||||||
    // - OpenOnArrow .................... single-click on arrow to open
 | 
					    // - OpenOnArrow .................... single-click on arrow to open
 | 
				
			||||||
    // - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open
 | 
					    // - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open
 | 
				
			||||||
    ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ((flags & ImGuiTreeNodeFlags_AllowOverlapMode) ? ImGuiButtonFlags_AllowOverlapMode : 0);
 | 
					    ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ((flags & ImGuiTreeNodeFlags_AllowOverlapMode) ? ImGuiButtonFlags_AllowOverlapMode : 0);
 | 
				
			||||||
 | 
					    button_flags |= ImGuiButtonFlags_PressedOnDragDropHold;
 | 
				
			||||||
    if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)
 | 
					    if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)
 | 
				
			||||||
        button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0);
 | 
					        button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0);
 | 
				
			||||||
    bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
 | 
					    bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
 | 
				
			||||||
@@ -6281,6 +6292,8 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
 | 
				
			|||||||
            toggled |= IsMouseHoveringRect(interact_bb.Min, ImVec2(interact_bb.Min.x + text_offset_x, interact_bb.Max.y));
 | 
					            toggled |= IsMouseHoveringRect(interact_bb.Min, ImVec2(interact_bb.Min.x + text_offset_x, interact_bb.Max.y));
 | 
				
			||||||
        if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)
 | 
					        if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)
 | 
				
			||||||
            toggled |= g.IO.MouseDoubleClicked[0];
 | 
					            toggled |= g.IO.MouseDoubleClicked[0];
 | 
				
			||||||
 | 
					        if (g.DragDropActive && is_open) // We don't nodes to be highlighted when holding ever after the node has been opened, but don't close them!
 | 
				
			||||||
 | 
					            toggled = false;
 | 
				
			||||||
        if (toggled)
 | 
					        if (toggled)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            is_open = !is_open;
 | 
					            is_open = !is_open;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -183,7 +183,8 @@ enum ImGuiButtonFlags_
 | 
				
			|||||||
    ImGuiButtonFlags_AlignTextBaseLine      = 1 << 8,   // vertically align button to match text baseline (ButtonEx() only)
 | 
					    ImGuiButtonFlags_AlignTextBaseLine      = 1 << 8,   // vertically align button to match text baseline (ButtonEx() only)
 | 
				
			||||||
    ImGuiButtonFlags_NoKeyModifiers         = 1 << 9,   // disable interaction if a key modifier is held
 | 
					    ImGuiButtonFlags_NoKeyModifiers         = 1 << 9,   // disable interaction if a key modifier is held
 | 
				
			||||||
    ImGuiButtonFlags_AllowOverlapMode       = 1 << 10,  // require previous frame HoveredId to either match id or be null before being usable
 | 
					    ImGuiButtonFlags_AllowOverlapMode       = 1 << 10,  // require previous frame HoveredId to either match id or be null before being usable
 | 
				
			||||||
    ImGuiButtonFlags_NoHoldingActiveID      = 1 << 11   // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
 | 
					    ImGuiButtonFlags_NoHoldingActiveID      = 1 << 11,  // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
 | 
				
			||||||
 | 
					    ImGuiButtonFlags_PressedOnDragDropHold  = 1 << 12   // press when held into while we are drag and dropping another item
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum ImGuiSliderFlags_
 | 
					enum ImGuiSliderFlags_
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user