]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #1440 Crash when edit box with parameter: erase custom presentation if it is...
authornds <nds@opencascade.com>
Mon, 25 Apr 2016 05:17:10 +0000 (08:17 +0300)
committernds <nds@opencascade.com>
Mon, 25 Apr 2016 05:17:10 +0000 (08:17 +0300)
src/PartSet/PartSet_CustomPrs.cpp
src/PartSet/PartSet_CustomPrs.h
src/PartSet/PartSet_OperationPrs.cpp
src/XGUI/XGUI_WorkshopListener.cpp

index bf4a8b8d69510de6c687584a9309113299e1d96d..e5a52ac7e3e548c387bb20c29e7856bf5aa72825 100755 (executable)
@@ -18,6 +18,8 @@
 #include <ModuleBase_Tools.h>
 
 #include <Config_PropManager.h>
+#include <Events_Loop.h>
+#include <ModelAPI_Events.h>
 
 #include <AIS_InteractiveContext.hxx>
 #include <AIS_InteractiveObject.hxx>
 //#define DO_NOT_VISUALIZE_CUSTOM_PRESENTATION
 
 PartSet_CustomPrs::PartSet_CustomPrs(ModuleBase_IWorkshop* theWorkshop)
-  : myWorkshop(theWorkshop), myFeature(FeaturePtr())
+  : myWorkshop(theWorkshop), myFeature(FeaturePtr()), myPresentationIsEmpty(false)
 {
+  Events_Loop* aLoop = Events_Loop::loop();
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION));
+
   initPresentation(ModuleBase_IModule::CustomizeArguments);
   initPresentation(ModuleBase_IModule::CustomizeResults);
   initPresentation(ModuleBase_IModule::CustomizeHighlightedObjects);
@@ -106,7 +111,9 @@ bool PartSet_CustomPrs::displayPresentation(
       return isModified;
   }
 
+  myPresentationIsEmpty = false;
   // redisplay AIS objects
+  bool aRedisplayed = false;
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
   if (!aContext.IsNull() && !aContext->IsDisplayed(anOperationPrs)) {
     // when the feature can not be visualized in the module, the operation preview should not
@@ -118,8 +125,8 @@ bool PartSet_CustomPrs::displayPresentation(
 
       PartSet_Module* aModule = dynamic_cast<PartSet_Module*>(myWorkshop->module());
       XGUI_Workshop* aWorkshop = workshop();
-      aWorkshop->displayer()->displayAIS(myPresentations[theFlag], false/*load object in selection*/,
-                                         theUpdateViewer);
+      aRedisplayed = aWorkshop->displayer()->displayAIS(myPresentations[theFlag],
+                                         false/*load object in selection*/, false);
       aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId());
       isModified = true;
     }
@@ -128,25 +135,32 @@ bool PartSet_CustomPrs::displayPresentation(
     // when the feature can not be visualized in the module, the operation preview should not
     // be visualized also
     if (!anOperationPrs->hasShapes() || !myWorkshop->module()->canDisplayObject(myFeature)) {
-      erasePresentation(theFlag, theUpdateViewer);
+      aRedisplayed = erasePresentation(theFlag, false);
       isModified = true;
     }
     else {
       anOperationPrs->Redisplay();
       isModified = true;
-      if (theUpdateViewer)
-        workshop()->displayer()->updateViewer();
+      aRedisplayed = true;
     }
   }
+  if (myPresentationIsEmpty) {
+    aRedisplayed = erasePresentation(theFlag, false);
+  }
+  if (aRedisplayed && theUpdateViewer)
+    workshop()->displayer()->updateViewer();
+
   return isModified;
 }
 
-void PartSet_CustomPrs::erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
+bool PartSet_CustomPrs::erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
                                           const bool theUpdateViewer)
 {
+  bool isErased = false;
   XGUI_Workshop* aWorkshop = workshop();
   if (myPresentations.contains(theFlag))
-    aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer);
+    isErased = aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer);
+  return isErased;
 }
 
 void PartSet_CustomPrs::clearPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
@@ -202,6 +216,12 @@ void PartSet_CustomPrs::clearPrs()
   clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects);
 }
 
+void PartSet_CustomPrs::processEvent(const std::shared_ptr<Events_Message>& theMessage)
+{
+  if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION))
+    myPresentationIsEmpty = true; /// store state to analize it after display/erase is finished
+}
+
 void PartSet_CustomPrs::initPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
 {
   AISObjectPtr anOperationPrs = AISObjectPtr(new GeomAPI_AISObject());
index 69393817f850e816156c8afa08ab38ed760d9d8e..ac99ab16709ae8c905fc1ccd38505fd3ea048115 100755 (executable)
@@ -16,6 +16,8 @@
 #include <ModelAPI_Result.h>
 #include <ModelAPI_Feature.h>
 
+#include <Events_Listener.h>
+
 #include <GeomAPI_ICustomPrs.h>
 #include <GeomAPI_AISObject.h>
 #include <GeomAPI_Shape.h>
@@ -27,7 +29,7 @@ class XGUI_Workshop;
  * This is the module custom presentation, which manage an AIS presentation, that can be filled
  * by a feature and visualized in the viewer additionally to usual workshop objects.
 */
-class PartSet_CustomPrs
+class PartSet_CustomPrs : public Events_Listener
 {
 public:
   /// Returns yellow color
@@ -79,6 +81,9 @@ public:
   /// it caused erroneus case because the presentation has linkage to the previous context.
   void clearPrs();
 
+  //! Redefinition of Events_Listener method to listen a moment that the presentation becomes empty
+  virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
+
 private:
   /// Creates the AIS operation presentation
   /// \param theFlag an object AIS presentation type
@@ -104,7 +109,8 @@ private:
   /// Erases the internal presentation from the viewer of workshop
   /// \param theFlag an object AIS presentation type
   /// \param theUpdateViewer the parameter whether the viewer should be update immediatelly
-  void erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
+  /// \param returns whether the presentation is erased
+  bool erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
                          const bool theUpdateViewer);
 
   /// Nullify the operation presentation. For example, it can be useful when the viewer/context
@@ -119,6 +125,7 @@ private:
   Quantity_Color getShapeColor(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag);
 
 private:
+  bool myPresentationIsEmpty; /// Boolean state about empty presentation
   FeaturePtr myFeature; /// Reference to a feature object
   ModuleBase_IWorkshop* myWorkshop; /// current workshop
   /// map of presentation type to AIS object
index c7180c56cab1c22dd0fa99a308a6806cd41e6fd4..7c0de6f9060688abfaf6136a1082482f27cec709 100755 (executable)
@@ -124,9 +124,9 @@ void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
 
   if (!aReadyToDisplay) {
     Events_Error::throwException("An empty AIS presentation: PartSet_OperationPrs");
-    //std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
-    //            new Events_Message(Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)));
-    //Events_Loop::loop()->send(aMsg);
+    std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
+                new Events_Message(Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)));
+    Events_Loop::loop()->send(aMsg);
   }
 }
 
index cd9e9482c72377bd3fd02e47939a112b4c2b2913..0d417f819fd16cadad43a997cb5a0737bfaef2b8 100755 (executable)
@@ -94,7 +94,6 @@ void XGUI_WorkshopListener::initializeEventListening()
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION));
-  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION));
 }
 
 //******************************************************