diff --git a/src/Mod/PartDesign/Gui/ViewProviderBase.cpp b/src/Mod/PartDesign/Gui/ViewProviderBase.cpp index 220ac52c20..8ac591b363 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBase.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderBase.cpp @@ -72,9 +72,25 @@ void ViewProviderBase::setupContextMenu(QMenu* menu, QObject* receiver, const ch if (!base->Placement.testStatus(App::Property::Immutable) && !base->Placement.testStatus(App::Property::ReadOnly) && !base->Placement.testStatus(App::Property::Hidden)) { + + // Handling of the edge case where some base features are outside the body + // that should not happen, but it was possible to do in older FreeCAD versions. + // This ensures that for older files it still works correctly. + if (!getBodyViewProvider()) { + ViewProviderPartExt::setupContextMenu(menu, receiver, member); + } + ViewProvider::setupContextMenu(menu, receiver, member); } } +Gui::ViewProvider* ViewProviderBase::startEditing(int ModNum) +{ + if (!getBodyViewProvider()) { + return ViewProviderPartExt::startEditing(ModNum); + } + + return ViewProvider::startEditing(ModNum); +} bool ViewProviderBase::setEdit(int ModNum) { @@ -82,6 +98,12 @@ bool ViewProviderBase::setEdit(int ModNum) if (!base->Placement.testStatus(App::Property::Immutable) && !base->Placement.testStatus(App::Property::ReadOnly) && !base->Placement.testStatus(App::Property::Hidden)) { + + // same as in setupContextMenu + if (!getBodyViewProvider()) { + return ViewProviderPartExt::setEdit(ModNum); + } + return ViewProvider::setEdit(ModNum); } diff --git a/src/Mod/PartDesign/Gui/ViewProviderBase.h b/src/Mod/PartDesign/Gui/ViewProviderBase.h index 4c56292940..592ca2b76a 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBase.h +++ b/src/Mod/PartDesign/Gui/ViewProviderBase.h @@ -41,6 +41,8 @@ public: bool doubleClicked() override; void setupContextMenu(QMenu* menu, QObject* receiver, const char* member) override; + Gui::ViewProvider* startEditing(int ModNum) override; + protected: bool setEdit(int ModNum) override; }; diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp index 639e926aa7..f484dab3ce 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp @@ -453,3 +453,13 @@ void ViewProviderBody::dropObject(App::DocumentObject* obj) } } } +bool ViewProviderBody::canDragObjectToTarget(App::DocumentObject* obj, + App::DocumentObject* target) const +{ + if (obj->isDerivedFrom()) { + return target && target->is(); + } + + return ViewProviderPart::canDragObjectToTarget(obj, target); +} + diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.h b/src/Mod/PartDesign/Gui/ViewProviderBody.h index da174dc98c..4b60dbc2b8 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.h +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.h @@ -88,6 +88,7 @@ public: bool canDropObject(App::DocumentObject*) const override; /** Add an object to the view provider by drag and drop */ void dropObject(App::DocumentObject*) override; + bool canDragObjectToTarget(App::DocumentObject* obj, App::DocumentObject* target) const override; protected: /// Copy over all visual properties to the child features