Gui: Replace TreeRank property with a simple int

This fixes that copied & pasted objects are not added at the end of the tree view.
See https://forum.freecad.org/viewtopic.php?p=755532#p755532
This commit is contained in:
wmayer
2024-05-05 18:50:55 +02:00
committed by Yorik van Havre
parent 638cbd02ae
commit d89bece39a
4 changed files with 41 additions and 24 deletions

View File

@@ -1419,6 +1419,7 @@ void Document::RestoreDocFile(Base::Reader &reader)
for (int i=0; i<Cnt; i++) {
localreader->readElement("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<ViewProviderDocumentObject*>(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<Gui::ViewProviderDocumentObject*>(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 App::DocumentObject*,ViewProviderDocumentObject*>::const_iterator it;
// writing the view provider names itself
writer.Stream() << writer.ind() << "<ViewProviderData Count=\""
<< d->_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() << "<ViewProvider name=\""
<< doc->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\"";