From a672630756753f4584f5ee2ea564357cc7e071b4 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 11 Jan 2015 22:15:18 +0100 Subject: [PATCH] + fixes #0001905: Group-ordering of orphaned children not working as expected --- src/Gui/Tree.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++--- src/Gui/Tree.h | 1 + 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 188819d91..9309e1d3f 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -877,15 +877,38 @@ void DocumentItem::slotNewObject(const Gui::ViewProviderDocumentObject& obj) } } -void DocumentItem::slotDeleteObject(const Gui::ViewProviderDocumentObject& obj) +void DocumentItem::slotDeleteObject(const Gui::ViewProviderDocumentObject& view) { - std::string objectName = obj.getObject()->getNameInDocument(); + App::DocumentObject* obj = view.getObject(); + std::string objectName = obj->getNameInDocument(); std::map::iterator it = ObjectMap.find(objectName); if (it != ObjectMap.end()) { QTreeWidgetItem* parent = it->second->parent(); if (it->second->childCount() > 0) { + // When removing an object check if there are multiple parents of its children + // + // this removes the children from their parent QList children = it->second->takeChildren(); - parent->addChildren(children); + for (QList::iterator jt = children.begin(); jt != children.end(); ++jt) { + std::vector parents = getAllParents(static_cast(*jt)); + for (std::vector::iterator kt = parents.begin(); kt != parents.end(); ++kt) { + if (*kt != it->second) { + // there is another parent object of this child + (*kt)->addChild(*jt); + break; + } + } + } + + // if there are still children, move them to the document item (#0001905) + QList freeChildren; + for (QList::iterator jt = children.begin(); jt != children.end(); ++jt) { + if (!(*jt)->parent()) + freeChildren << *jt; + } + + if (!freeChildren.isEmpty()) + this->addChildren(freeChildren); } parent->takeChild(parent->indexOfChild(it->second)); @@ -1183,6 +1206,30 @@ void DocumentItem::selectItems(void) static_cast(treeWidget())->setItemsSelected(deselitems, false); } +std::vector DocumentItem::getAllParents(DocumentObjectItem* item) const +{ + std::vector parents; + App::DocumentObject* obj = item->object()->getObject(); + std::vector inlist = obj->getInList(); + + for (std::vector::iterator it = inlist.begin(); it != inlist.end(); ++it) { + Gui::ViewProvider* vp = pDocument->getViewProvider(*it); + std::vector child = vp->claimChildren(); + for (std::vector::iterator jt = child.begin(); jt != child.end(); ++jt) { + if (*jt == obj) { + std::map::const_iterator kt; + kt = ObjectMap.find((*it)->getNameInDocument()); + if (kt != ObjectMap.end()) { + parents.push_back(kt->second); + } + break; + } + } + } + + return parents; +} + // ---------------------------------------------------------------------------- DocumentObjectItem::DocumentObjectItem(Gui::ViewProviderDocumentObject* pcViewProvider, diff --git a/src/Gui/Tree.h b/src/Gui/Tree.h index 7a50875e9..c606505ff 100644 --- a/src/Gui/Tree.h +++ b/src/Gui/Tree.h @@ -166,6 +166,7 @@ protected: void slotResetEdit (const Gui::ViewProviderDocumentObject&); void slotHighlightObject (const Gui::ViewProviderDocumentObject&,const Gui::HighlightMode&,bool); void slotExpandObject (const Gui::ViewProviderDocumentObject&,const Gui::TreeItemMode&); + std::vector getAllParents(DocumentObjectItem*) const; private: const Gui::Document* pDocument;