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\"";

View File

@@ -2661,7 +2661,7 @@ void TreeWidget::sortDroppedObjects(TargetItemInfo& targetInfo, std::vector<App:
auto vpA = dynamic_cast<Gui::ViewProviderDocumentObject*>(Gui::Application::Instance->getViewProvider(a));
auto vpB = dynamic_cast<Gui::ViewProviderDocumentObject*>(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<App:
// Then we move dropped objects to their correct position
sortIntoList(objList);
// Then we update the TreeRank properties
// Then we set the tree rank
for (size_t i = 0; i < sortedObjList.size(); ++i) {
auto vp = dynamic_cast<ViewProviderDocumentObject*>(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<ViewProviderDocumentObject*>(Application::Instance->getViewProvider(childObj));
@@ -4126,7 +4126,7 @@ int DocumentItem::findRootIndex(App::DocumentObject* childObj) {
if (citem->type() != TreeWidget::ObjectType)
continue;
auto vp = static_cast<DocumentObjectItem*>(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;

View File

@@ -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";
}

View File

@@ -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<const char*> aDisplayEnumsArray;
std::vector<std::string> aDisplayModesArray;