diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index e289a92592..53836e35dc 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -1419,6 +1419,7 @@ void Document::RestoreDocFile(Base::Reader &reader) for (int i=0; ireadElement("ViewProvider"); std::string name = localreader->getAttribute("name"); + bool expanded = false; if (!hasExpansion && localreader->hasAttribute("expanded")) { const char* attr = localreader->getAttribute("expanded"); @@ -1426,15 +1427,24 @@ void Document::RestoreDocFile(Base::Reader &reader) expanded = true; } } - ViewProvider* pObj = getViewProviderByName(name.c_str()); + + int treeRank = -1; + if (localreader->hasAttribute("treeRank")) { + treeRank = int(localreader->getAttributeAsInteger("treeRank")); + } + + auto pObj = dynamic_cast(getViewProviderByName(name.c_str())); // check if this feature has been registered - if (pObj){ + if (pObj) { pObj->Restore(*localreader); } + if (pObj && treeRank >= 0) { + pObj->setTreeRank(treeRank); + } + if (pObj && expanded) { - auto vp = static_cast(pObj); - this->signalExpandObject(*vp, TreeItemMode::ExpandItem,0,0); + this->signalExpandObject(*pObj, TreeItemMode::ExpandItem, 0, 0); } localreader->readEndElement("ViewProvider"); } @@ -1536,8 +1546,6 @@ void Document::SaveDocFile (Base::Writer &writer) const if(!hasExpansion) writer.Stream() << ">" << std::endl; - std::map::const_iterator it; - // writing the view provider names itself writer.Stream() << writer.ind() << "_ViewProviderMap.size() <<"\">" << std::endl; @@ -1545,12 +1553,13 @@ void Document::SaveDocFile (Base::Writer &writer) const bool xml = writer.isForceXML(); //writer.setForceXML(true); writer.incInd(); // indentation for 'ViewProvider name' - for(it = d->_ViewProviderMap.begin(); it != d->_ViewProviderMap.end(); ++it) { - const App::DocumentObject* doc = it->first; - ViewProvider* obj = it->second; + for(const auto& it : d->_ViewProviderMap) { + const App::DocumentObject* doc = it.first; + ViewProviderDocumentObject* obj = it.second; writer.Stream() << writer.ind() << "getNameInDocument() << "\" " - << "expanded=\"" << (doc->testStatus(App::Expand) ? 1:0) << "\""; + << doc->getNameInDocument() << "\"" + << " expanded=\"" << (doc->testStatus(App::Expand) ? 1:0) << "\"" + << " treeRank=\"" << obj->getTreeRank() << "\""; if (obj->hasExtensions()) writer.Stream() << " Extensions=\"True\""; diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 110e5ac262..df2eefcb24 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -2661,7 +2661,7 @@ void TreeWidget::sortDroppedObjects(TargetItemInfo& targetInfo, std::vector(Gui::Application::Instance->getViewProvider(a)); auto vpB = dynamic_cast(Gui::Application::Instance->getViewProvider(b)); if (vpA && vpB) { - return vpA->TreeRank.getValue() < vpB->TreeRank.getValue(); + return vpA->getTreeRank() < vpB->getTreeRank(); } return false; // Keep the original order if either vpA or vpB is nullptr }); @@ -2669,10 +2669,10 @@ void TreeWidget::sortDroppedObjects(TargetItemInfo& targetInfo, std::vector(Application::Instance->getViewProvider(sortedObjList[i])); - vp->TreeRank.setValue(i); + vp->setTreeRank(i); } // Lastly we refresh the tree @@ -4081,10 +4081,10 @@ int DocumentItem::findRootIndex(App::DocumentObject* childObj) { int first, last; auto getTreeRank = [](Gui::ViewProviderDocumentObject* vp) -> int { - if (vp->TreeRank.getValue() == -1) { - vp->TreeRank.setValue(vp->getObject()->getID()); + if (vp->getTreeRank() == -1) { + vp->setTreeRank(vp->getObject()->getID()); } - return vp->TreeRank.getValue(); + return vp->getTreeRank(); }; auto vpc = dynamic_cast(Application::Instance->getViewProvider(childObj)); @@ -4126,7 +4126,7 @@ int DocumentItem::findRootIndex(App::DocumentObject* childObj) { if (citem->type() != TreeWidget::ObjectType) continue; auto vp = static_cast(citem)->object(); - if (vp->TreeRank.getValue() < childTreeRank) { + if (vp->getTreeRank() < childTreeRank) { first = ++pos; count -= step + 1; } @@ -4158,7 +4158,7 @@ void DocumentItem::sortObjectItems() std::stable_sort(sortedItems.begin(), sortedItems.end(), [](DocumentObjectItem* a, DocumentObjectItem* b) { - return a->object()->TreeRank.getValue() < b->object()->TreeRank.getValue(); + return a->object()->getTreeRank() < b->object()->getTreeRank(); }); int sortedIndex = 0; diff --git a/src/Gui/ViewProviderDocumentObject.cpp b/src/Gui/ViewProviderDocumentObject.cpp index bd215698bc..96640c61c0 100644 --- a/src/Gui/ViewProviderDocumentObject.cpp +++ b/src/Gui/ViewProviderDocumentObject.cpp @@ -77,8 +77,6 @@ ViewProviderDocumentObject::ViewProviderDocumentObject() "Element: On top only if some sub-element of the object is selected"); OnTopWhenSelected.setEnums(OnTopEnum); - ADD_PROPERTY_TYPE(TreeRank, (-1), dogroup, App::Prop_Hidden, "Tree view item ordering key"); - sPixmap = "Feature"; } diff --git a/src/Gui/ViewProviderDocumentObject.h b/src/Gui/ViewProviderDocumentObject.h index 2efc7384f5..71d8fa9576 100644 --- a/src/Gui/ViewProviderDocumentObject.h +++ b/src/Gui/ViewProviderDocumentObject.h @@ -64,9 +64,6 @@ public: App::PropertyEnumeration OnTopWhenSelected; App::PropertyEnumeration SelectionStyle; - // Hidden properties - App::PropertyInteger TreeRank; - virtual void attach(App::DocumentObject *pcObject); virtual void reattach(App::DocumentObject *); void update(const App::Property*) override; @@ -126,6 +123,18 @@ public: virtual void finishRestoring(); //@} + /** @name Tree rank */ + //@{ + int getTreeRank() const + { + return treeRank; + } + void setTreeRank(int value) + { + treeRank = value; + } + //@} + bool removeDynamicProperty(const char* prop) override; App::Property* addDynamicProperty( @@ -220,6 +229,7 @@ protected: private: bool _Showable = true; + int treeRank = -1; std::vector aDisplayEnumsArray; std::vector aDisplayModesArray;