Salome HOME
Issue #2594: sort children if after deletion children have a wrong order.
authorvsv <vsv@opencascade.com>
Fri, 24 Aug 2018 12:35:17 +0000 (15:35 +0300)
committervsv <vsv@opencascade.com>
Fri, 24 Aug 2018 14:59:06 +0000 (17:59 +0300)
src/ModuleBase/ModuleBase_ITreeNode.h
src/PartSet/PartSet_TreeNodes.cpp

index 362dad470aa556b62e244e224f015ad2f3c54176..fcd6c7bd46b2560519cb26c0a7ad81a60820c990 100644 (file)
@@ -177,6 +177,27 @@ protected:
     }
   }
 
+  void sortChildren() {
+    int i = 0;
+    ModuleBase_ITreeNode* aNode = 0;
+    ObjectPtr aObject;
+    int aIdx;
+    while (i < myChildren.size()) {
+      aNode = myChildren.at(i);
+      aObject = aNode->object();
+      if (aObject.get()) {
+        aIdx = aObject->document()->index(aObject, true);
+        if (aIdx != i) {
+          myChildren.removeAll(aNode);
+          myChildren.insert(aIdx, aNode);
+          i = 0;
+          continue;
+        }
+      }
+      i++;
+    }
+  }
+
   ModuleBase_ITreeNode* myParent; //!< Parent of the node
   QTreeNodesList myChildren; //!< Children of the node
 };
index 4bbd2b593902903a869d530710ee94688f6ab504..81b3fec0f09faa72e9b6d8917b5d3d75c076bcc6 100644 (file)
@@ -571,19 +571,23 @@ QTreeNodesList PartSet_FolderNode::objectsDeleted(const DocumentPtr& theDoc,
     int aIndex;
     int aId = 0;
     bool aRemoved = false;
+    bool aToSort = false;
     while (aId < myChildren.size()) {
       ModuleBase_ITreeNode* aNode = myChildren.at(aId);
       aIndex = aDoc->index(aNode->object(), true);
-      if ((aIndex == -1) || (aId != aIndex)) {
+      aToSort |= ((aIndex != -1) && (aId != aIndex));
+      if (aIndex == -1) {
         myChildren.removeAll(aNode);
         delete aNode;
         aRemoved = true;
-      }  else
+      }
+      else
         aId++;
     }
     if (aRemoved)
       aResult.append(this);
-
+    if (aToSort)
+      sortChildren();
     foreach(ModuleBase_ITreeNode* aNode, myChildren) {
       aResult.append(aNode->objectsDeleted(theDoc, theGroup));
     }
@@ -662,11 +666,13 @@ QTreeNodesList PartSet_FeatureFolderNode::objectsDeleted(const DocumentPtr& theD
     int aIndex;
     int aId = 0;
     bool aRemoved = false;
+    bool aToSort = false;
     while (aId < myChildren.size()) {
       ModuleBase_ITreeNode* aNode = myChildren.at(aId);
       if (aNode->object().get()) {
         aIndex = aDoc->index(aNode->object(), true);
-        if ((aIndex == -1) || (aId != (aIndex + aNb))) {
+        aToSort |= ((aIndex != -1) && (aId != (aIndex + aNb)));
+        if (aIndex == -1) {
           myChildren.removeAll(aNode);
           delete aNode;
           aRemoved = true;
@@ -677,6 +683,8 @@ QTreeNodesList PartSet_FeatureFolderNode::objectsDeleted(const DocumentPtr& theD
     }
     if (aRemoved)
       aResult.append(this);
+    if (aToSort)
+      sortChildren();
   }
   return aResult;
 }