Salome HOME
Merge branch 'Dev_1.2.0' of newgeom:newgeom.git into Dev_1.2.0
[modules/shaper.git] / src / XGUI / XGUI_OperationMgr.cpp
index dacd82f21309e94748432d0812e3d88dc9c5e504..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()));
 
@@ -290,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.