diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp index 81d41b841d..1fc096fc6f 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp @@ -416,3 +416,43 @@ std::vector< std::string > ViewProviderBody::getDisplayModes(void) const { modes.erase(modes.begin()); return modes; } + +bool ViewProviderBody::canDropObjects() const +{ + // if the BaseFeature property is marked as hidden or read-only then + // it's not allowed to modify it. + PartDesign::Body* body = static_cast(getObject()); + if (body->BaseFeature.testStatus(App::Property::Status::Hidden)) + return false; + if (body->BaseFeature.testStatus(App::Property::Status::ReadOnly)) + return false; + return true; +} + +bool ViewProviderBody::canDropObject(App::DocumentObject* obj) const +{ + if (!obj->isDerivedFrom(Part::Feature::getClassTypeId())) { + return false; + } + else if (PartDesign::Body::findBodyOf(obj)) { + return false; + } + else if (obj->isDerivedFrom (Part::BodyBase::getClassTypeId())) { + return false; + } + + App::Part *actPart = PartDesignGui::getActivePart(); + App::Part* partOfBaseFeature = App::Part::getPartOfObject(obj); + if (partOfBaseFeature != 0 && partOfBaseFeature != actPart) + return false; + + return true; +} + +void ViewProviderBody::dropObject(App::DocumentObject* obj) +{ + PartDesign::Body* body = static_cast(getObject()); + body->BaseFeature.setValue(obj); + App::Document* doc = body->getDocument(); + doc->recompute(); +} diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.h b/src/Mod/PartDesign/Gui/ViewProviderBody.h index 29804b1a51..41e53c0ef7 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.h +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.h @@ -78,6 +78,13 @@ public: */ SbBox3f getBoundBox (); + /** Check whether objects can be added to the view provider by drag and drop */ + virtual bool canDropObjects() const; + /** Check whether the object can be dropped to the view provider by drag and drop */ + virtual bool canDropObject(App::DocumentObject*) const; + /** Add an object to the view provider by drag and drop */ + virtual void dropObject(App::DocumentObject*); + protected: void slotChangedObjectApp ( const App::DocumentObject& obj, const App::Property& prop ); void slotChangedObjectGui ( const Gui::ViewProviderDocumentObject& obj, const App::Property& prop );