diff --git a/src/App/DocumentObjectGroup.cpp b/src/App/DocumentObjectGroup.cpp index d55c84483..cb9f8494c 100644 --- a/src/App/DocumentObjectGroup.cpp +++ b/src/App/DocumentObjectGroup.cpp @@ -29,14 +29,14 @@ #include "DocumentObjectGroup.h" #include "DocumentObjectGroupPy.h" #include "Document.h" -#include "FeaturePythonPyImp.h" +#include "FeaturePythonPyImp.h" using namespace App; PROPERTY_SOURCE(App::DocumentObjectGroup, App::DocumentObject) -DocumentObjectGroup::DocumentObjectGroup() +DocumentObjectGroup::DocumentObjectGroup() { ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects"); } @@ -63,20 +63,22 @@ void DocumentObjectGroup::addObject(DocumentObject* obj) void DocumentObjectGroup::removeObject(DocumentObject* obj) { - std::vector grp = Group.getValues(); - for (std::vector::iterator it = grp.begin(); it != grp.end(); ++it) { - if (*it == obj) { - grp.erase(it); - Group.setValues(grp); - break; - } + const std::vector & grp = Group.getValues(); + std::vector newGrp; + + std::remove_copy (grp.begin(), grp.end(), std::back_inserter (newGrp), obj); + if (grp.size() != newGrp.size()) { + Group.setValues (newGrp); } } void DocumentObjectGroup::removeObjectsFromDocument() { - std::vector grp = Group.getValues(); - for (std::vector::iterator it = grp.begin(); it != grp.end(); ++it) { + const std::vector & grp = Group.getValues(); + // Use set so iterate on each linked object exactly one time (in case of multiple links to the same document) + std::set grpSet (grp.begin(), grp.end()); + + for (std::set::iterator it = grpSet.begin(); it != grpSet.end(); ++it) { removeObjectFromDocument(*it); } } @@ -85,11 +87,9 @@ void DocumentObjectGroup::removeObjectFromDocument(DocumentObject* obj) { // remove all children if (obj->getTypeId().isDerivedFrom(DocumentObjectGroup::getClassTypeId())) { - std::vector grp = static_cast(obj)->Group.getValues(); - for (std::vector::iterator it = grp.begin(); it != grp.end(); ++it) { - // recursive call to remove all subgroups - removeObjectFromDocument(*it); - } + DocumentObjectGroup *grp = static_cast(obj); + // recursive call to remove all subgroups + grp->removeObjectsFromDocument(); } this->getDocument()->remObject(obj->getNameInDocument()); @@ -177,7 +177,7 @@ PyObject *DocumentObjectGroup::getPyObject() // ref counter is set to 1 PythonObject = Py::Object(new DocumentObjectGroupPy(this),true); } - return Py::new_reference_to(PythonObject); + return Py::new_reference_to(PythonObject); } // Python feature --------------------------------------------------------- diff --git a/src/App/DocumentObjectGroup.h b/src/App/DocumentObjectGroup.h index 49330ed0a..e5d120881 100644 --- a/src/App/DocumentObjectGroup.h +++ b/src/App/DocumentObjectGroup.h @@ -45,11 +45,11 @@ public: /** @name Object handling */ //@{ - /** Adds an object of \a sType with \a pObjectName to the document this group belongs to and + /** Adds an object of \a sType with \a pObjectName to the document this group belongs to and * append it to this group as well. */ DocumentObject *addObject(const char* sType, const char* pObjectName); - /* Adds the object \a obj to this group. + /* Adds the object \a obj to this group. */ void addObject(DocumentObject* obj); /** Removes an object from this group. diff --git a/src/App/DocumentObjectGroupPy.xml b/src/App/DocumentObjectGroupPy.xml index 8ceb8e58b..5acc0d5a1 100644 --- a/src/App/DocumentObjectGroupPy.xml +++ b/src/App/DocumentObjectGroupPy.xml @@ -45,4 +45,4 @@ - + diff --git a/src/Gui/ViewProviderDocumentObjectGroup.cpp b/src/Gui/ViewProviderDocumentObjectGroup.cpp index 421741959..00b06d476 100644 --- a/src/Gui/ViewProviderDocumentObjectGroup.cpp +++ b/src/Gui/ViewProviderDocumentObjectGroup.cpp @@ -26,6 +26,7 @@ #ifndef _PreComp_ # include # include +# include #endif #include @@ -131,7 +132,10 @@ bool ViewProviderDocumentObjectGroup::canDragObjects() const void ViewProviderDocumentObjectGroup::dragObject(App::DocumentObject* obj) { - static_cast(getObject())->removeObject(obj); + Gui::Command::doCommand(Gui::Command::Doc,"App.getDocument(\"%s\").getObject(\"%s\").removeObject(" + "App.getDocument(\"%s\").getObject(\"%s\"))", + getObject()->getDocument()->getName(), getObject()->getNameInDocument(), + obj->getDocument()->getName(), obj->getNameInDocument() ); } bool ViewProviderDocumentObjectGroup::canDropObjects() const @@ -141,7 +145,10 @@ bool ViewProviderDocumentObjectGroup::canDropObjects() const void ViewProviderDocumentObjectGroup::dropObject(App::DocumentObject* obj) { - static_cast(getObject())->addObject(obj); + Gui::Command::doCommand(Gui::Command::Doc,"App.getDocument(\"%s\").getObject(\"%s\").addObject(" + "App.getDocument(\"%s\").getObject(\"%s\"))", + getObject()->getDocument()->getName(), getObject()->getNameInDocument(), + obj->getDocument()->getName(), obj->getNameInDocument() ); } std::vector ViewProviderDocumentObjectGroup::getDisplayModes(void) const @@ -152,8 +159,22 @@ std::vector ViewProviderDocumentObjectGroup::getDisplayModes(void) bool ViewProviderDocumentObjectGroup::onDelete(const std::vector &) { - Gui::Command::doCommand(Gui::Command::Doc,"App.getDocument(\"%s\").getObject(\"%s\").removeObjectsFromDocument()" - ,getObject()->getDocument()->getName(), getObject()->getNameInDocument()); + assert ( getObject ()->isDerivedFrom ( App::DocumentObjectGroup::getClassTypeId () ) ); + App::DocumentObjectGroup *group = static_cast (getObject()); + // If the group is nonempty ask the user if he wants to delete it's content + if ( group->Group.getSize () ) { + QMessageBox::StandardButton choice = + QMessageBox::question ( 0, QObject::tr ( "Delete group content?" ), + QObject::tr ( "The group %1 is not empty, delete it's content as well?") + .arg ( QString::fromUtf8 ( group->Label.getValue () ) ), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); + + if ( choice == QMessageBox::Yes ) { + Gui::Command::doCommand(Gui::Command::Doc, + "App.getDocument(\"%s\").getObject(\"%s\").removeObjectsFromDocument()" + ,getObject()->getDocument()->getName(), getObject()->getNameInDocument()); + } + } return true; }