mirror of https://github.com/ocornut/imgui
Drag and Drop: Drop target infer a fallback ID from the rectangle. Avoid Preview being accepted on drop frame when drop target has no ID. (#143)
This commit is contained in:
parent
e98df91dc4
commit
d561a43a4d
15
imgui.cpp
15
imgui.cpp
|
@ -11292,7 +11292,8 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id)
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow)
|
if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow)
|
||||||
return false;
|
return false;
|
||||||
if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id && id == g.DragDropPayload.SourceId))
|
IM_ASSERT(id != 0);
|
||||||
|
if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id == g.DragDropPayload.SourceId))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
g.DragDropTargetRect = bb;
|
g.DragDropTargetRect = bb;
|
||||||
|
@ -11301,7 +11302,7 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't use BeginDragDropTargetCustom() and duplicate its code because:
|
// We don't use BeginDragDropTargetCustom() and duplicate its code because:
|
||||||
// 1) LastItemRectHoveredRect which handles items that pushes a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle it.
|
// 1) we use LastItemRectHoveredRect which handles items that pushes a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them.
|
||||||
// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can.
|
// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can.
|
||||||
// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case)
|
// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case)
|
||||||
bool ImGui::BeginDragDropTarget()
|
bool ImGui::BeginDragDropTarget()
|
||||||
|
@ -11311,13 +11312,19 @@ bool ImGui::BeginDragDropTarget()
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
if (!window->DC.LastItemRectHoveredRect || (window->DC.LastItemId && window->DC.LastItemId == g.DragDropPayload.SourceId))
|
if (!window->DC.LastItemRectHoveredRect)
|
||||||
return false;
|
return false;
|
||||||
if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow)
|
if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
ImGuiID id = window->DC.LastItemId;
|
||||||
|
if (id == 0)
|
||||||
|
id = window->GetIDFromRectangle(window->DC.LastItemRect);
|
||||||
|
if (g.DragDropPayload.SourceId == id)
|
||||||
|
return false;
|
||||||
|
|
||||||
g.DragDropTargetRect = window->DC.LastItemRect;
|
g.DragDropTargetRect = window->DC.LastItemRect;
|
||||||
g.DragDropTargetId = window->DC.LastItemId;
|
g.DragDropTargetId = id;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue