Salome HOME
Add new test
[modules/shaper.git] / src / XGUI / XGUI_OperationMgr.cpp
index 15455fe1b877d4719cb7eebcd86f77d2b3848721..fe2b72830ae95b4697dcf0850139e3788beb8bdc 100644 (file)
@@ -1,6 +1,6 @@
 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
 
-// File:        XGUI_OperationMgr.h
+// File:        XGUI_OperationMgr.cpp
 // Created:     20 Apr 2014
 // Author:      Natalia ERMOLAEVA
 
@@ -9,6 +9,7 @@
 #include "ModuleBase_Operation.h"
 #include "ModuleBase_IWorkshop.h"
 #include "ModuleBase_IModule.h"
+#include "ModuleBase_OperationDescription.h"
 
 #include "ModelAPI_CompositeFeature.h"
 #include "ModelAPI_Session.h"
@@ -123,23 +124,28 @@ bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation)
 
 bool XGUI_OperationMgr::abortAllOperations()
 {
-  if(!hasOperation()) {
-    return true;
-  } else if (operationsCount() == 1) {
-    onAbortOperation();
-    return true;
+  bool aResult = true;
+  if(!hasOperation())
+    return aResult;
+
+  if (operationsCount() == 1) {
+    if (canStopOperation()) {
+      abortOperation(currentOperation());
+    }
+    else
+      aResult = false;
   }
-  QString aMessage = tr("All active operations will be aborted.");
-  int anAnswer = QMessageBox::question(qApp->activeWindow(),
-                                       tr("Abort operation"),
-                                       aMessage,
-                                       QMessageBox::Ok | QMessageBox::Cancel,
-                                       QMessageBox::Cancel);
-  bool result = anAnswer == QMessageBox::Ok;
-  while(result && hasOperation()) {
-    currentOperation()->abort();
+  else {
+    aResult = QMessageBox::question(qApp->activeWindow(),
+                                    tr("Abort operation"),
+                                    tr("All active operations will be aborted."),
+                                    QMessageBox::Ok | QMessageBox::Cancel,
+                                    QMessageBox::Cancel) == QMessageBox::Ok;
+    while(aResult && hasOperation()) {
+      abortOperation(currentOperation());
+    }
   }
-  return result;
+  return aResult;
 }
 
 bool XGUI_OperationMgr::commitAllOperations()
@@ -150,7 +156,7 @@ bool XGUI_OperationMgr::commitAllOperations()
     if (isApplyEnabled()) {
       onCommitOperation();
     } else {
-      anOperation->abort();
+      abortOperation(anOperation);
     }
     FeaturePtr aFeature = anOperation->feature();
     CompositeFeaturePtr aComposite = 
@@ -185,6 +191,19 @@ void XGUI_OperationMgr::setApplyEnabled(const bool theEnabled)
   emit validationStateChanged(theEnabled);
 }
 
+void XGUI_OperationMgr::updateApplyOfOperations(ModuleBase_Operation* theOperation)
+{
+  if (theOperation)
+    emit nestedStateChanged(theOperation->getDescription()->operationId().toStdString(),
+                            theOperation->isValid());
+  else {
+    foreach(ModuleBase_Operation* anOperation, myOperations) {
+      emit nestedStateChanged(anOperation->getDescription()->operationId().toStdString(),
+                              anOperation->isValid());
+    }
+  }
+}
+
 bool XGUI_OperationMgr::isApplyEnabled() const
 {
   return myIsApplyEnabled;
@@ -195,7 +214,7 @@ bool XGUI_OperationMgr::isParentOperationValid() const
   bool isValid = false;
   // the enable state of the parent operation of the nested one is defined by the rules that
   // firstly there are nested operations and secondly the parent operation is valid
-  ModuleBase_Operation* aPrevOp;
+  ModuleBase_Operation* aPrevOp = 0;
   Operations::const_iterator anIt = myOperations.end();
   if (anIt != myOperations.begin()) { // there are items in the operations list
     --anIt;
@@ -249,7 +268,7 @@ bool XGUI_OperationMgr::canStartOperation(QString theId)
         if (myIsApplyEnabled)
           aCurrentOp->commit();
         else
-          aCurrentOp->abort();
+          abortOperation(aCurrentOp);
       } else {
         aCanStart = false;
       }
@@ -258,6 +277,23 @@ bool XGUI_OperationMgr::canStartOperation(QString theId)
   return aCanStart;
 }
 
+void XGUI_OperationMgr::abortOperation(ModuleBase_Operation* theOperation)
+{
+  ModuleBase_Operation* aCurrentOperation = currentOperation();
+  if (theOperation == aCurrentOperation)
+    theOperation->abort();
+  else {
+    // it is possible to trigger upper operation(e.g. sketch, current is sketch line)
+    // all operation from the current to triggered should also be aborted
+    // operations over the parameter one are not aborted(e.g. extrusion cut, sketch abort)
+    while(hasOperation()) {
+      ModuleBase_Operation* aCurrentOperation = currentOperation();
+      aCurrentOperation->abort();
+      if(theOperation == aCurrentOperation)
+        break;
+    }
+  }
+}
 
 void XGUI_OperationMgr::onCommitOperation()
 {
@@ -269,20 +305,14 @@ void XGUI_OperationMgr::onCommitOperation()
 void XGUI_OperationMgr::onAbortOperation()
 {
   if (hasOperation() && canStopOperation()) {
-    currentOperation()->abort();
+    abortOperation(currentOperation());
   }
 }
 
 void XGUI_OperationMgr::onOperationStarted()
 {
   ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
-  
-  bool aParentValid = isParentOperationValid();
-  // in order to apply is enabled only if there are modifications in the model
-  // e.g. sketch can be applyed only if at least one nested element modification is finished
-  bool aCanUndo = ModelAPI_Session::get()->canUndo();
-  emit nestedStateChanged(aParentValid && aCanUndo);
-
+  updateApplyOfOperations(aSenderOperation);
   emit operationStarted(aSenderOperation);
 }
 
@@ -294,11 +324,9 @@ void XGUI_OperationMgr::onOperationAborted()
 
 void XGUI_OperationMgr::onOperationCommitted()
 {
+  updateApplyOfOperations();
+
   ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
-  // in order to apply is enabled only if there are modifications in the model
-  // e.g. sketch can be applyed only if at least one nested element create is finished
-  bool aCanUndo = ModelAPI_Session::get()->canUndo();
-  emit nestedStateChanged(myOperations.count() >= 1 && aCanUndo);
   emit operationCommitted(aSenderOperation);
 }
 
@@ -333,32 +361,12 @@ void XGUI_OperationMgr::onOperationStopped()
   }
   if (aResultOp) {
     bool isModified = aCurrentOperation->isModified();
-    aResultOp->setIsModified(isModified);
+    aResultOp->setIsModified(aResultOp->isModified() || isModified);
     resumeOperation(aResultOp);
     onValidateOperation();
   }
 }
 
-void XGUI_OperationMgr::onOperationTriggered(bool theState)
-{
-  ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
-  if (aSenderOperation && !theState) {
-    ModuleBase_Operation* aCurrentOperation = currentOperation();
-    if (aSenderOperation == aCurrentOperation)
-      aCurrentOperation->abort();
-    else {
-      // it is possible to trigger upper operation(e.g. sketch, current is sketch line)
-      // all operation from the current to triggered should also be aborted
-      while(hasOperation()) {
-        ModuleBase_Operation* aCurrentOperation = currentOperation();
-        aCurrentOperation->abort();
-        if(aSenderOperation == aCurrentOperation)
-          break;
-      }
-    }
-  }
-}
-
 bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent)
 {
   // Let the manager decide what to do with the given key combination.