Salome HOME
Reset value state is provided in ModelWidget to remove 'myIsResetCurrentValue' in...
[modules/shaper.git] / src / ModuleBase / ModuleBase_ModelWidget.cpp
index c47c42ca6522483ccf6f8eca0baf283adf1261d6..66fe88f12b0f98a2d7a40a75c6c6907c8f3f0c23 100644 (file)
@@ -27,7 +27,8 @@ ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
                                                const std::string& theParentId)
     : QWidget(theParent),
       myParentId(theParentId),
-      myIsEditing(false)
+      myIsEditing(false),
+      myState(Stored)
 {
   myDefaultValue = theData->getProperty(ATTR_DEFAULT);
   myUseReset = theData->getBooleanAttribute(ATTR_USE_RESET, true);
@@ -36,6 +37,16 @@ ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
   myIsObligatory = theData->getBooleanAttribute(ATTR_OBLIGATORY, true);
 
   connect(this, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged()));
+  connect(this, SIGNAL(valuesModified()), this, SLOT(onWidgetValuesModified()));
+}
+
+bool ModuleBase_ModelWidget::reset()
+{
+  bool aResult = resetCustom();
+  if (aResult)
+    setValueState(Reset);
+
+  return aResult;
 }
 
 bool ModuleBase_ModelWidget::isInitialized(ObjectPtr theObject) const
@@ -115,7 +126,7 @@ void ModuleBase_ModelWidget::activate()
       if (isComputedDefault()) {
         if (myFeature->compute(myAttributeID)) {
           restoreValue();
-        }      
+        }
       }
       else {
         storeValue();
@@ -132,6 +143,8 @@ void ModuleBase_ModelWidget::setDefaultValue(const std::string& theValue)
 
 bool ModuleBase_ModelWidget::storeValue()
 {
+  setValueState(Stored);
+
   emit beforeValuesChanged();
   bool isDone = storeValueCustom();
   emit afterValuesChanged();
@@ -139,6 +152,15 @@ bool ModuleBase_ModelWidget::storeValue()
   return isDone;
 }
 
+void ModuleBase_ModelWidget::setValueState(const ValueState& theState)
+{
+  if (myState == theState)
+    return;
+
+  myState = theState;
+  emit valueStateChanged();
+}
+
 bool ModuleBase_ModelWidget::restoreValue()
 {
   emit beforeValuesRestored();
@@ -148,29 +170,37 @@ bool ModuleBase_ModelWidget::restoreValue()
   return isDone;
 }
 
+void ModuleBase_ModelWidget::storeValueByApply()
+{
+  // do not emit signal about update the currenty feature object
+  // in order to do not perform additional redisplay in the viewer.
+  // It should happens by finish operation of the apply action
+  storeValueCustom();
+}
+
 void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj)
 {
-  // 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 = std::shared_ptr<Events_Message>(
-      new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)));
-  Events_Loop::loop()->send(aMsg);
+  blockUpdateViewer(true);
 
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
 
-  // 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);
+  blockUpdateViewer(false);
 }
 
 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::isEventProcessed(QKeyEvent* theEvent)
+{
+  return false;
 }
 
 bool ModuleBase_ModelWidget::eventFilter(QObject* theObject, QEvent *theEvent)
@@ -185,7 +215,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);
@@ -196,3 +226,29 @@ void ModuleBase_ModelWidget::onWidgetValuesChanged()
 {
   storeValue();
 }
+
+//**************************************************************
+void ModuleBase_ModelWidget::onWidgetValuesModified()
+{
+  setValueState(Modified);
+}
+
+//**************************************************************
+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);
+}