Salome HOME
Fix for other than bodies results renaming and issue #908
[modules/shaper.git] / src / Model / Model_ResultCompSolid.cpp
index 5209b2d686648376481fb6b48f563898be6301d9..633e8cd08d920035e40ca45483629af46de0ff02 100755 (executable)
@@ -23,7 +23,9 @@
 Model_ResultCompSolid::Model_ResultCompSolid()
 {
   myBuilder = new Model_BodyBuilder(this);
-  setIsConcealed(false);
+  myLastConcealed = false;
+  setIsConcealed(myLastConcealed);
+  myIsDisabled = true; // by default it is not initialized and false to be after created
   updateSubs(shape()); // in case of open, etc.
 }
 
@@ -98,13 +100,41 @@ bool Model_ResultCompSolid::setDisabled(std::shared_ptr<ModelAPI_Result> theThis
 
 bool Model_ResultCompSolid::isConcealed()
 {
-  if (ModelAPI_ResultCompSolid::isConcealed())
-    return true;
+  bool aResult = false;;
+  if (ModelAPI_ResultCompSolid::isConcealed()) {
+    aResult = true;
+  } else {
+    std::vector<std::shared_ptr<ModelAPI_ResultBody> >::const_iterator aSubIter = mySubs.cbegin();
+    for(; aSubIter != mySubs.cend(); aSubIter++)
+      if ((*aSubIter)->isConcealed())
+        aResult = true;
+  }
+  if (myLastConcealed != aResult) {
+    myLastConcealed = aResult;
+    setIsConcealed(aResult); // set for all subs the same result
+  }
+  return aResult;
+}
+
+void Model_ResultCompSolid::setIsConcealed(const bool theValue)
+{
+  ModelAPI_ResultCompSolid::setIsConcealed(theValue);
   std::vector<std::shared_ptr<ModelAPI_ResultBody> >::const_iterator aSubIter = mySubs.cbegin();
-  for(; aSubIter != mySubs.cend(); aSubIter++)
-    if ((*aSubIter)->isConcealed())
-      return true;
-  return false;
+  for(; aSubIter != mySubs.cend(); aSubIter++) {
+    if ((*aSubIter)->isConcealed() != theValue) {
+      (*aSubIter)->setIsConcealed(theValue);
+      if (theValue) { // hidden unit must be redisplayed (hidden)
+        ModelAPI_EventCreator::get()->sendDeleted(document(), (*aSubIter)->groupName());
+        // redisplay for the viewer (it must be disappeared also)
+        static Events_ID EVENT_DISP = 
+          Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+        ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, EVENT_DISP);
+      } else { // was not concealed become concealed => delete event
+        static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
+        ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, anEvent);
+      }
+    }
+  }
 }
 
 void Model_ResultCompSolid::updateSubs(const std::shared_ptr<GeomAPI_Shape>& theThisShape)
@@ -138,6 +168,7 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr<GeomAPI_Shape>& the
         aECreator->sendUpdated(aSub, EVENT_UPD);
       }
       aSub->setDisabled(aSub, isDisabled());
+      aSub->setIsConcealed(myLastConcealed);
     }
     // erase left, unused results
     while(mySubs.size() > aSubIndex) {