Drag and Drop: Fixed submitting a tooltip from drop target location. Added demo.
Amend 7bbf8f2, 92b7d6b.
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index 56f6ca7..673ec1c 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -87,6 +87,8 @@
- Mostly legacy behavior when used inside old Columns(), as we favored that idiom back then,
only different is left position follows indentation level, to match calling a Separator()
inside or outside Columns().
+- Drag and Drop: Fixed submitting a tooltip from drop target location when using AcceptDragDropPayload()
+ with ImGuiDragDropFlags_AcceptNoPreviewTooltip and submitting a tooltip manually.
- Tables: Fixed an edge-case when no columns are visible + table scrollbar is visible + user
code is always testing return value of TableSetColumnIndex() to coarse clip. With an active
clipper it would have asserted. Without a clipper, the scrollbar range would be wrong.
@@ -123,6 +125,7 @@
- Debug Tools: Metrics: Added "Show groups rectangles" in tools.
- ImDrawList: Added AddEllipse(), AddEllipseFilled(), PathEllipticalArcTo(). (#2743) [@Doohl]
- ImVector: Added find_index() helper.
+- Demo: Added "Drag and Drop -> Tooltip at target location" demo.
- Backends: GLFW: Clear emscripten's MouseWheel callback before shutdown. (#6790, #6096, #4019) [@halx99]
- Backends: Win32: Added support for keyboard codepage conversion for when application
is compiled in MBCS mode and using a non-Unicode window. (#6785, #6782, #5725, #5961) [@sneakyevil]
diff --git a/imgui.cpp b/imgui.cpp
index c65df0b..3b679fc 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -12403,6 +12403,14 @@
memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal));
}
+bool ImGui::BeginTooltipHidden()
+{
+ ImGuiContext& g = *GImGui;
+ bool ret = Begin("##Tooltip_Hidden", NULL, ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize);
+ SetWindowHiddendAndSkipItemsForCurrentFrame(g.CurrentWindow);
+ return ret;
+}
+
// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource()
// If the item has an identifier:
// - This assume/require the item to be activated (typically via ButtonBehavior).
@@ -12505,12 +12513,13 @@
{
// Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit)
// We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents.
- bool ret = BeginTooltip();
+ bool ret;
+ if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip))
+ ret = BeginTooltipHidden();
+ else
+ ret = BeginTooltip();
IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame().
IM_UNUSED(ret);
-
- if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip))
- SetWindowHiddendAndSkipItemsForCurrentFrame(g.CurrentWindow);
}
if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern))
diff --git a/imgui_demo.cpp b/imgui_demo.cpp
index 84bdca2..e66b10e 100644
--- a/imgui_demo.cpp
+++ b/imgui_demo.cpp
@@ -2425,6 +2425,35 @@
ImGui::TreePop();
}
+ IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Tooltip at target location");
+ if (ImGui::TreeNode("Tooltip at target location"))
+ {
+ for (int n = 0; n < 2; n++)
+ {
+ // Drop targets
+ ImGui::Button(n ? "drop here##1" : "drop here##0");
+ if (ImGui::BeginDragDropTarget())
+ {
+ ImGuiDragDropFlags drop_target_flags = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoPreviewTooltip;
+ if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, drop_target_flags))
+ {
+ ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
+ ImGui::BeginTooltip();
+ ImGui::Text("Cannot drop here!");
+ ImGui::EndTooltip();
+ }
+ ImGui::EndDragDropTarget();
+ }
+
+ // Drop source
+ static ImVec4 col4 = { 1.0f, 0.0f, 0.2f, 1.0f };
+ if (n == 0)
+ ImGui::ColorButton("drag me", col4);
+
+ }
+ ImGui::TreePop();
+ }
+
ImGui::TreePop();
}
diff --git a/imgui_internal.h b/imgui_internal.h
index 70aef42..f7eb5db 100644
--- a/imgui_internal.h
+++ b/imgui_internal.h
@@ -3013,6 +3013,7 @@
IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
+ IMGUI_API bool BeginTooltipHidden();
IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window);
IMGUI_API ImGuiWindow* GetTopMostPopupModal();
IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal();