Salome HOME
Issue #2594: sort children if after deletion children have a wrong order.
[modules/shaper.git] / src / PartSet / PartSet_TreeNodes.cpp
index dbdbc4214b4c447ed92b43e2935a5dfb7b5a6141..81b3fec0f09faa72e9b6d8917b5d3d75c076bcc6 100644 (file)
@@ -159,21 +159,24 @@ PartSet_ObjectNode::VisibilityState PartSet_ObjectNode::visibilityState() const
     ModuleBase_IWorkshop* aWork = workshop();
     ResultBodyPtr aCompRes = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aResObj);
     if (aCompRes.get()) {
-      VisibilityState aState = aCompRes->numberOfSubs(true) == 0 ?
-        (aWork->isVisible(aCompRes) ? Visible : Hidden) : NoneState;
       std::list<ResultPtr> aResultsList;
       ModelAPI_Tools::allSubs(aCompRes, aResultsList);
+      VisibilityState aState = aResultsList.size() == 0 ?
+        (aWork->isVisible(aCompRes) ? Visible : Hidden) : NoneState;
 
       std::list<ResultPtr>::const_iterator aIt;
-      //for (int i = 0; i < aCompRes->numberOfSubs(true); i++) {
+      ResultBodyPtr aCompSub;
       for (aIt = aResultsList.cbegin(); aIt != aResultsList.cend(); aIt++) {
-        ResultPtr aSubRes = (*aIt); // aCompRes->subResult(i, true);
-        VisibilityState aS = aWork->isVisible(aSubRes) ? Visible : Hidden;
-        if (aState == NoneState)
-          aState = aS;
-        else if (aState != aS) {
-          aState = SemiVisible;
-          break;
+        ResultPtr aSubRes = (*aIt);
+        aCompSub = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aSubRes);
+        if (!(aCompSub.get() && aCompSub->numberOfSubs() > 0)) {
+          VisibilityState aS = aWork->isVisible(aSubRes) ? Visible : Hidden;
+          if (aState == NoneState)
+            aState = aS;
+          else if (aState != aS) {
+            aState = SemiVisible;
+            break;
+          }
         }
       }
       return aState;
@@ -235,6 +238,21 @@ void PartSet_ObjectNode::update()
         delete aNode;
       }
     }
+    else {
+      ObjectPtr aObj;
+      ModuleBase_ITreeNode* aNode;
+      int aId = 0;
+      while (aId < myChildren.size()) {
+        aNode = myChildren.at(aId);
+        aObj = subObject(aId);
+        if (aNode->object() != aObj) {
+          myChildren.removeAll(aNode);
+          delete aNode;
+        }
+        else
+          aId++;
+      }
+    }
 
     ModuleBase_ITreeNode* aNode;
     ObjectPtr aBody;
@@ -333,24 +351,38 @@ QTreeNodesList PartSet_ObjectNode::objectsDeleted(
 {
   QTreeNodesList aResult;
   int aNb = numberOfSubs();
-  if (aNb > 0) {
-    ModuleBase_ITreeNode* aNode;
-    // Delete extra objects
-    bool isDeleted = false;
-    while (myChildren.size() > aNb) {
-      aNode = myChildren.takeLast();
-      delete aNode;
-      isDeleted = true;
-    }
-    if (isDeleted)
+  if (aNb != myChildren.size()) {
+    if (aNb == 0) {
+      deleteChildren();
       aResult.append(this);
-    int i = 0;
-    ObjectPtr aBody;
-    foreach(ModuleBase_ITreeNode* aNode, myChildren) {
-      aBody = subObject(i);
-      ((PartSet_ObjectNode*)aNode)->setObject(aBody);
-      aResult.append(aNode->objectsDeleted(theDoc, theGroup));
-      i++;
+    }
+    else {
+      // Delete extra objects
+      bool isDeleted = false;
+      ObjectPtr aObj;
+      ModuleBase_ITreeNode* aNode;
+      int aId = 0;
+      while (aId < myChildren.size()) {
+        aNode = myChildren.at(aId);
+        aObj = subObject(aId);
+        if (aNode->object() != aObj) {
+          myChildren.removeAll(aNode);
+          delete aNode;
+          isDeleted = true;
+        }
+        else
+          aId++;
+      }
+      if (isDeleted)
+        aResult.append(this);
+      int i = 0;
+      ObjectPtr aBody;
+      foreach(ModuleBase_ITreeNode* aNode, myChildren) {
+        aBody = subObject(i);
+        ((PartSet_ObjectNode*)aNode)->setObject(aBody);
+        aResult.append(aNode->objectsDeleted(theDoc, theGroup));
+        i++;
+      }
     }
   }
   return aResult;
@@ -539,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));
     }
@@ -630,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;
@@ -645,6 +683,8 @@ QTreeNodesList PartSet_FeatureFolderNode::objectsDeleted(const DocumentPtr& theD
     }
     if (aRemoved)
       aResult.append(this);
+    if (aToSort)
+      sortChildren();
   }
   return aResult;
 }