X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=fe2b72830ae95b4697dcf0850139e3788beb8bdc;hb=7c06295aea6523048b676312fbeb5da673c0659d;hp=85892d74b037a2c269a69028b060feadd5e1eaee;hpb=f7e22794dc9f7e96ed777cc22c72aebe7eccbe9f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 85892d74b..fe2b72830 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -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; @@ -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(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(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(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.