Salome HOME
Preselection using in operations
[modules/shaper.git] / src / XGUI / XGUI_OperationMgr.cpp
index 007019a64b15e5180adb6ba7836cbaffb2b2ae03..5256eb7db48f75f414d198b75c883c046b2c1483 100644 (file)
@@ -105,6 +105,7 @@ bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation)
   connect(theOperation, SIGNAL(committed()), SLOT(onOperationCommitted()));
   connect(theOperation, SIGNAL(stopped()), SLOT(onOperationStopped()));
   connect(theOperation, SIGNAL(resumed()), SLOT(onOperationResumed()));
+  connect(theOperation, SIGNAL(triggered(bool)), SLOT(onOperationTriggered(bool)));
   connect(theOperation, SIGNAL(activatedByPreselection()),
           SIGNAL(operationActivatedByPreselection()));
 
@@ -235,9 +236,10 @@ void XGUI_OperationMgr::onAbortOperation()
 void XGUI_OperationMgr::onOperationStarted()
 {
   ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
-  if (myOperations.count() == 1) {
-    emit nestedStateChanged(false);
-  }
+  
+  bool isNestedOk = (myOperations.count() >= 1) && 
+                     myOperations.at(0)->isValid();
+  emit nestedStateChanged(isNestedOk);
   emit operationStarted(aSenderOperation);
 }
 
@@ -250,7 +252,7 @@ void XGUI_OperationMgr::onOperationAborted()
 void XGUI_OperationMgr::onOperationCommitted()
 {
   ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
-  emit nestedStateChanged(true);
+  emit nestedStateChanged(myOperations.count() >= 1);
   emit operationCommitted(aSenderOperation);
 }
 
@@ -289,6 +291,26 @@ void XGUI_OperationMgr::onOperationStopped()
   }
 }
 
+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.
@@ -300,7 +322,7 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent)
       emit keyEnterReleased();
       commitOperation();
     }
-      break;
+    break;
     default:
       isAccepted = false;
       break;