From db314cfaeb21ea182083eb079ee34d1431ea9907 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 24 Nov 2023 20:51:58 +0100 Subject: [PATCH] Gui: fix drag and drop of ViewProvider * ViewProvider::canDragAndDropObject should only return true if an extension handles drag and drop Currently it returns true if no extension is available * ViewProvider::dropObject shouldn't throw an exception if no extension handles drag and drop As an example consider https://forum.freecad.org/viewtopic.php?t=82957 When selecting two objects then ViewProvider::dropObject is called twice. But for the first call both objects are moved to the destination and for the second call no extension handles drag and drop any more. This incorrectly leads to a thrown exception. --- src/Gui/ViewProvider.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index 63f813d75a..773acd9acd 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -769,12 +769,13 @@ bool ViewProvider::canDropObjects() const { bool ViewProvider::canDragAndDropObject(App::DocumentObject* obj) const { auto vector = getExtensionsDerivedFromType(); - for(Gui::ViewProviderExtension* ext : vector){ - if(!ext->extensionCanDragAndDropObject(obj)) - return false; + for (Gui::ViewProviderExtension* ext : vector) { + if (ext->extensionCanDragAndDropObject(obj)) { + return true; + } } - return true; + return false; } void ViewProvider::dropObject(App::DocumentObject* obj) { @@ -782,11 +783,9 @@ void ViewProvider::dropObject(App::DocumentObject* obj) { for (Gui::ViewProviderExtension* ext : vector) { if (ext->extensionCanDropObject(obj)) { ext->extensionDropObject(obj); - return; + break; } } - - throw Base::RuntimeError("ViewProvider::dropObject: no extension for dropping given object available."); } bool ViewProvider::canDropObjectEx(App::DocumentObject* obj, App::DocumentObject *owner,