Salome HOME
Optimize the flushing: this improvement speed ups the unit test for 3-4 times
[modules/shaper.git] / src / ModuleBase / ModuleBase_ModelWidget.cpp
index c16c0b13f597d2911b9e6b1e35ac56d44c27d5e7..75d99535b6478adbd4926051cf2f006e18f5e243 100644 (file)
@@ -1,6 +1,6 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-// File:        ModuleBase_ModelWidget.h
+// File:        ModuleBase_ModelWidget.cpp
 // Created:     25 Apr 2014
 // Author:      Natalia ERMOLAEVA
 
@@ -30,6 +30,7 @@ ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
       myIsEditing(false)
 {
   myDefaultValue = theData->getProperty(ATTR_DEFAULT);
+  myUseReset = theData->getBooleanAttribute(ATTR_USE_RESET, true);
   myIsComputedDefault = theData->getProperty(ATTR_DEFAULT) == DOUBLE_WDG_DEFAULT_COMPUTED;
   myAttributeID = theData ? theData->widgetId() : "";
   myIsObligatory = theData->getBooleanAttribute(ATTR_OBLIGATORY, true);
@@ -114,7 +115,7 @@ void ModuleBase_ModelWidget::activate()
       if (isComputedDefault()) {
         if (myFeature->compute(myAttributeID)) {
           restoreValue();
-        }      
+        }
       }
       else {
         storeValue();
@@ -124,6 +125,11 @@ void ModuleBase_ModelWidget::activate()
   activateCustom();
 }
 
+void ModuleBase_ModelWidget::setDefaultValue(const std::string& theValue)
+{
+  myDefaultValue = theValue;
+}
+
 bool ModuleBase_ModelWidget::storeValue()
 {
   emit beforeValuesChanged();
@@ -133,18 +139,33 @@ bool ModuleBase_ModelWidget::storeValue()
   return isDone;
 }
 
-void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj) const
+bool ModuleBase_ModelWidget::restoreValue()
+{
+  emit beforeValuesRestored();
+  bool isDone = restoreValueCustom();
+  emit afterValuesRestored();
+
+  return isDone;
+}
+
+void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj)
 {
+  blockUpdateViewer(true);
+
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
-  static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY);
-  ModelAPI_EventCreator::get()->sendUpdated(theObj, anEvent);
+
+  blockUpdateViewer(false);
 }
 
-void ModuleBase_ModelWidget::moveObject(ObjectPtr theObj) const
+void ModuleBase_ModelWidget::moveObject(ObjectPtr theObj)
 {
+  //blockUpdateViewer(true);
+
   static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
   ModelAPI_EventCreator::get()->sendUpdated(theObj, anEvent);
   Events_Loop::loop()->flush(anEvent);
+
+  //blockUpdateViewer(false);
 }
 
 bool ModuleBase_ModelWidget::eventFilter(QObject* theObject, QEvent *theEvent)
@@ -159,7 +180,7 @@ bool ModuleBase_ModelWidget::eventFilter(QObject* theObject, QEvent *theEvent)
     if (getControls().contains(aWidget)) {
       emit focusInWidget(this);
     }
-  } 
+  }
   // pass the event on to the parent class
 
   return QObject::eventFilter(theObject, theEvent);
@@ -170,3 +191,23 @@ void ModuleBase_ModelWidget::onWidgetValuesChanged()
 {
   storeValue();
 }
+
+//**************************************************************
+void ModuleBase_ModelWidget::blockUpdateViewer(const bool theValue)
+{
+  // the viewer update should be blocked in order to avoid the temporary feature content
+  // when the solver processes the feature, the redisplay message can be flushed
+  // what caused the display in the viewer preliminary states of object
+  // e.g. fillet feature, angle value change
+  std::shared_ptr<Events_Message> aMsg;
+  if (theValue) {
+    aMsg = std::shared_ptr<Events_Message>(
+        new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)));
+  }
+  else {
+    // the viewer update should be unblocked
+    aMsg = std::shared_ptr<Events_Message>(
+        new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED)));
+  }
+  Events_Loop::loop()->send(aMsg);
+}