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.
This commit is contained in:
wmayer
2023-11-24 20:51:58 +01:00
committed by Chris Hennes
parent d565796f96
commit db314cfaeb

View File

@@ -769,12 +769,13 @@ bool ViewProvider::canDropObjects() const {
bool ViewProvider::canDragAndDropObject(App::DocumentObject* obj) const {
auto vector = getExtensionsDerivedFromType<Gui::ViewProviderExtension>();
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,