Salome HOME
Prevent usage of uninitialized variable
[modules/shaper.git] / src / XGUI / XGUI_WorkshopListener.cpp
index 5796ddef17d4d8b1262bf596482766279863fe48..b1092af83136403d6777998c1cffde2e88b4909a 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2021  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -38,6 +38,7 @@
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultField.h>
 
 #include <ModuleBase_Events.h>
 #include <ModuleBase_IModule.h>
@@ -85,7 +86,6 @@ XGUI_WorkshopListener::XGUI_WorkshopListener(XGUI_Workshop* theWorkshop)
   : myWorkshop(theWorkshop),
     myUpdatePrefs(false)
 {
-  XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr();
 }
 
 //******************************************************
@@ -102,6 +102,7 @@ void XGUI_WorkshopListener::initializeEventListening()
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES));
   aLoop->registerListener(this, Events_LongOp::eventID());
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED));
 
@@ -148,8 +149,32 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr<Events_Message>&
   // Redisplay feature
   else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) {
     std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
-        std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
     onFeatureRedisplayMsg(aUpdMsg);
+  }
+  else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES)) {
+    std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+    std::set<ObjectPtr> aObjList = aUpdMsg->objects();
+    std::set<ObjectPtr>::const_iterator aIt;
+    std::list<ResultPtr>::const_iterator aResIt;
+    XGUI_Displayer* aDisplayer = workshop()->displayer();
+    AISObjectPtr aAIS;
+    for (aIt = aObjList.begin(); aIt != aObjList.end(); ++aIt) {
+      FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*aIt);
+      if (aFeature) {
+        aAIS = aDisplayer->getAISObject(aFeature);
+        if (aAIS.get())
+          workshop()->module()->customizePresentation(aFeature, aAIS);
+
+        std::list<ResultPtr> aResults = aFeature->results();
+        for (aResIt = aResults.begin(); aResIt != aResults.end(); ++aResIt) {
+          aAIS = aDisplayer->getAISObject(*aResIt);
+          if (aAIS.get())
+            workshop()->module()->customizePresentation(*aResIt, aAIS);
+        }
+      }
+    }
   } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)) {
     std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
         std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
@@ -272,6 +297,7 @@ void XGUI_WorkshopListener::
     // Hide the object if it is invalid or concealed one
     bool aHide = !aObj->data() || !aObj->data()->isValid() ||
       aObj->isDisabled() || (!aObj->isDisplayed());
+
     if (!aHide) { // check that this is not hidden result
       ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aObj);
       aHide = aRes && aRes->isConcealed();
@@ -352,11 +378,13 @@ void XGUI_WorkshopListener::
   //if (aHiddenObjects.size() > 0)
   //  myWorkshop->module()->processHiddenObject(aHiddenObjects);
 
-  bool isCustomized = customizeCurrentObject(anObjects, aRedisplayed);
+  bool isCustomized = customizeFeature(anObjects, aRedisplayed);
   if (aRedisplayed || isCustomized) {
     Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION));
 
-    aDisplayer->updateViewer();
+    // Do not update viewer here because it can be called in a loop
+    // In this case Update has to be called after redisplay event
+    //aDisplayer->updateViewer();
   }
 }
 
@@ -401,7 +429,6 @@ void XGUI_WorkshopListener::
                  !anObject->isDisplayed();
     if (!aHide) { // check that this is not hidden result
       ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
-      bool isConcealed = aRes && aRes->isConcealed();
       aHide = aRes && aRes->isConcealed();
       // Hide the presentation with an empty shape. But isDisplayed state of the object should not
       // be changed to the object becomes visible when the shape becomes not empty
@@ -419,7 +446,7 @@ void XGUI_WorkshopListener::
     }
   }
 
-  bool isCustomized = customizeCurrentObject(anObjects, aDisplayed);
+  MAYBE_UNUSED bool isCustomized = customizeFeature(anObjects, aDisplayed);
 
   //if (myObjectBrowser)
   //  myObjectBrowser->processEvent(theMsg);
@@ -493,11 +520,10 @@ bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj)
     return aDisplayed;
 
   XGUI_Displayer* aDisplayer = aWorkshop->displayer();
-  int aNb = aDisplayer->objectsCount();
   return aDisplayer->display(theObj, false);
 }
 
-bool XGUI_WorkshopListener::customizeCurrentObject(const std::set<ObjectPtr>& theObjects,
+bool XGUI_WorkshopListener::customizeFeature(const std::set<ObjectPtr>& theObjects,
                                                    bool theForceRedisplay)
 {
   XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr();
@@ -517,11 +543,11 @@ bool XGUI_WorkshopListener::customizeCurrentObject(const std::set<ObjectPtr>& th
     // the feature is hidden, but arguments of the feature are modified
     // e.g. extrusion is hidden(h=0) but sketch is chosen
     if (theForceRedisplay || theObjects.find(aCurrentFeature) != theObjects.end()) {
-      aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature,
+      aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature,
                                  ModuleBase_IModule::CustomizeArguments, false) || aCustomized;
-      aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature,
+      aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature,
                                    ModuleBase_IModule::CustomizeResults, false) || aCustomized;
-      aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature,
+      aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature,
                         ModuleBase_IModule::CustomizeHighlightedObjects, false) || aCustomized;
     }
   }