From 3e789c7939fa4ea40ac0a0ce0571bfaf2ccc0f4a Mon Sep 17 00:00:00 2001 From: vermont Date: Mon, 12 Feb 2024 22:14:39 -0500 Subject: [PATCH] mvDragPayload now uses UUID to lookup, instead of copying the whole object. This may be a bit slower, but it makes resource management much easier. Drag and drop doesn't crash anymore. --- src/mvContainers.cpp | 47 ++++++++++++++------------ src/mvPlotting.cpp | 78 +++++++++++++++++++++----------------------- 2 files changed, 64 insertions(+), 61 deletions(-) diff --git a/src/mvContainers.cpp b/src/mvContainers.cpp index ac381247e..a08229e54 100644 --- a/src/mvContainers.cpp +++ b/src/mvContainers.cpp @@ -1110,19 +1110,20 @@ DearPyGui::draw_drag_payload(ImDrawList* drawlist, mvAppItem& item, mvDragPayloa { if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) { - ImGui::SetDragDropPayload(config.payloadType.c_str(), &item, sizeof(mvDragPayload)); + ImGui::SetDragDropPayload(config.payloadType.c_str(), &item.uuid, sizeof(item.uuid)); if (item.info.parentPtr->config.dragCallback) { auto& parentPtr = item.info.parentPtr; auto dragCallbackPtr = mvPyObjectStrictPtr(parentPtr->shared_from_this(), &parentPtr->config.dragCallback); auto userDataPtr = mvPyObjectStrictPtr(item.shared_from_this(), &item.config.user_data); + auto& dragData = config.dragData; mvAddCallbackJob({ dragCallbackPtr, item.config.parent, parentPtr->config.alias, - MV_APP_DATA_COPY_FUNC(config.dragData), + MV_APP_DATA_COPY_FUNC(dragData), userDataPtr }); } @@ -1683,15 +1684,18 @@ apply_drag_drop(mvAppItem* item) if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(item->config.payloadType.c_str())) { auto dropCallbackPtr = mvPyObjectStrictPtr(item->shared_from_this(), &item->config.dropCallback); - auto payloadActual = static_cast(payload->Data); - - mvAddCallbackJob({ - dropCallbackPtr, - item->uuid, - item->config.alias, - MV_APP_DATA_COPY_FUNC(payloadActual->configData.dragData), - nullptr - }); + mvUUID payloadUuid = *static_cast(payload->Data); + auto payloadActual = static_cast(GetItem(*GContext->itemRegistry, payloadUuid)); + if (payloadActual) { + auto& dragData = payloadActual->configData.dragData; + mvAddCallbackJob({ + dropCallbackPtr, + item->uuid, + item->config.alias, + MV_APP_DATA_COPY_FUNC(dragData), + nullptr + }); + } } ImGui::EndDragDropTarget(); @@ -1710,15 +1714,18 @@ apply_drag_drop_nodraw(mvAppItem* item) if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(item->config.payloadType.c_str())) { auto dropCallbackPtr = mvPyObjectStrictPtr(item->shared_from_this(), &item->config.dropCallback); - auto payloadActual = static_cast(payload->Data); - - mvAddCallbackJob({ - dropCallbackPtr, - item->uuid, - item->config.alias, - MV_APP_DATA_COPY_FUNC(payloadActual->configData.dragData), - nullptr - }); + mvUUID payloadUuid = *static_cast(payload->Data); + auto payloadActual = static_cast(GetItem(*GContext->itemRegistry, payloadUuid)); + if (payloadActual) { + auto& dragData = payloadActual->configData.dragData; + mvAddCallbackJob({ + dropCallbackPtr, + item->uuid, + item->config.alias, + MV_APP_DATA_COPY_FUNC(dragData), + nullptr + }); + } } ImGui::EndDragDropTarget(); diff --git a/src/mvPlotting.cpp b/src/mvPlotting.cpp index 042d716b6..692313d8f 100644 --- a/src/mvPlotting.cpp +++ b/src/mvPlotting.cpp @@ -497,14 +497,18 @@ DearPyGui::draw_plot(ImDrawList* drawlist, mvAppItem& item, mvPlotConfig& config if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(item.config.payloadType.c_str())) { auto dropCallbackPtr = mvPyObjectStrictPtr(item.shared_from_this(), &item.config.dropCallback); - auto payloadActual = static_cast(payload->Data); - auto dragDataPtr = payloadActual->configData.dragData; - mvAddCallbackJob({ - dropCallbackPtr, - item.uuid, - item.config.alias, - MV_APP_DATA_COPY_FUNC(dragDataPtr), - nullptr}); + mvUUID payloadUuid = *static_cast(payload->Data); + auto payloadActual = static_cast(GetItem(*GContext->itemRegistry, payloadUuid)); + if (payloadActual) { + auto& dragData = payloadActual->configData.dragData; + mvAddCallbackJob({ + dropCallbackPtr, + item.uuid, + item.config.alias, + MV_APP_DATA_COPY_FUNC(dragData), + nullptr + }); + } } ImPlot::EndDragDropTarget(); @@ -619,37 +623,25 @@ DearPyGui::draw_plot_axis(ImDrawList* drawlist, mvAppItem& item, mvPlotAxisConfi if (item.config.dropCallback) { + const ImGuiPayload* payload; ScopedID id(item.uuid); - if (item.info.location == 0 && ImPlot::BeginDragDropTargetX()) + if ((item.info.location == 0 && ImPlot::BeginDragDropTargetX() && + (payload = ImGui::AcceptDragDropPayload(item.config.payloadType.c_str()))) || + (ImPlot::BeginDragDropTargetY(item.info.location - 1) && + (payload = ImGui::AcceptDragDropPayload(item.config.payloadType.c_str())))) { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(item.config.payloadType.c_str())) - { - auto dropCallbackPtr = mvPyObjectStrictPtr(item.shared_from_this(), &item.config.dropCallback); - auto payloadActual = static_cast(payload->Data); - auto dragDataPtr = payloadActual->configData.dragData; + auto dropCallbackPtr = mvPyObjectStrictPtr(item.shared_from_this(), &item.config.dropCallback); + mvUUID payloadUuid = *static_cast(payload->Data); + auto payloadActual = static_cast(GetItem(*GContext->itemRegistry, payloadUuid)); + if (payloadActual) { + auto& dragData = payloadActual->configData.dragData; mvAddCallbackJob({ dropCallbackPtr, item.uuid, item.config.alias, - MV_APP_DATA_COPY_FUNC(dragDataPtr), - nullptr}); - } - - ImPlot::EndDragDropTarget(); - } - else if (ImPlot::BeginDragDropTargetY(item.info.location - 1)) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(item.config.payloadType.c_str())) - { - auto dropCallbackPtr = mvPyObjectStrictPtr(item.shared_from_this(), &item.config.dropCallback); - auto payloadActual = static_cast(payload->Data); - auto dragDataPtr = payloadActual->configData.dragData; - mvAddCallbackJob({ - dropCallbackPtr, - item.uuid, - item.config.alias, - MV_APP_DATA_COPY_FUNC(dragDataPtr), - nullptr}); + MV_APP_DATA_COPY_FUNC(dragData), + nullptr + }); } ImPlot::EndDragDropTarget(); @@ -705,14 +697,18 @@ DearPyGui::draw_plot_legend(ImDrawList* drawlist, mvAppItem& item, mvPlotLegendC if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(item.config.payloadType.c_str())) { auto dropCallbackPtr = mvPyObjectStrictPtr(item.shared_from_this(), &item.config.dropCallback); - auto payloadActual = static_cast(payload->Data); - auto dragDataPtr = payloadActual->configData.dragData; - mvAddCallbackJob({ - dropCallbackPtr, - item.uuid, - item.config.alias, - MV_APP_DATA_COPY_FUNC(dragDataPtr), - nullptr}); + mvUUID payloadUuid = *static_cast(payload->Data); + auto payloadActual = static_cast(GetItem(*GContext->itemRegistry, payloadUuid)); + if (payloadActual) { + auto& dragData = payloadActual->configData.dragData; + mvAddCallbackJob({ + dropCallbackPtr, + item.uuid, + item.config.alias, + MV_APP_DATA_COPY_FUNC(dragData), + nullptr + }); + } } ImPlot::EndDragDropTarget();