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:
@@ -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\"";
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user