From 42ff08c40dc7e1be32ff7963851698ab994809b1 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 9 Nov 2024 18:11:57 +0100 Subject: [PATCH 1/2] Core: Avoid cyclic dependencies when dragging an object into a group --- src/Gui/ViewProviderGroupExtension.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 310997929e..594fa95a19 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -72,22 +72,27 @@ bool ViewProviderGroupExtension::extensionCanDropObjects() const { return true; } -bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj) const { - +bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj) const +{ #ifdef FC_DEBUG Base::Console().Log("Check ViewProviderGroupExtension"); #endif - auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); + auto extobj = getExtendedViewProvider()->getObject(); + auto group = extobj->getExtensionByType(); //we cannot drop thing of this group into it again if it does not allow reorder - if (group->hasObject(obj) && !getExtendedViewProvider()->acceptReorderingObjects()) + if (group->hasObject(obj) && !getExtendedViewProvider()->acceptReorderingObjects()) { return false; + } - if (group->allowObject(obj)) - return true; + // Check for possible cyclic dependencies if we allowed to drop the object + const auto& list = obj->getOutList(); + if (std::find(list.begin(), list.end(), extobj) != list.end()) { + return false; + } - return false; + return group->allowObject(obj); } void ViewProviderGroupExtension::extensionDropObject(App::DocumentObject* obj) { From 6021256706e47d896a7b0e51705eb38f521f3c9d Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 10 Nov 2024 17:14:18 +0100 Subject: [PATCH 2/2] Core: Print warning if dragging is not allowed --- src/Gui/ViewProviderGroupExtension.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 594fa95a19..254a68dbae 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -75,7 +75,7 @@ bool ViewProviderGroupExtension::extensionCanDropObjects() const { bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj) const { #ifdef FC_DEBUG - Base::Console().Log("Check ViewProviderGroupExtension"); + Base::Console().Log("Check ViewProviderGroupExtension\n"); #endif auto extobj = getExtendedViewProvider()->getObject(); @@ -89,6 +89,7 @@ bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj // Check for possible cyclic dependencies if we allowed to drop the object const auto& list = obj->getOutList(); if (std::find(list.begin(), list.end(), extobj) != list.end()) { + Base::Console().Warning("Do not add cyclic dependency to %s\n", extobj->Label.getValue()); return false; }