X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=85892d74b037a2c269a69028b060feadd5e1eaee;hb=f7e22794dc9f7e96ed777cc22c72aebe7eccbe9f;hp=fc45ef3f8052088dfc84793265fb7bd591d5dabf;hpb=6fbb6b77447a0c4a4a21c12e216ce56833ac766b;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index fc45ef3f8..85892d74b 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -10,6 +10,9 @@ #include "ModuleBase_IWorkshop.h" #include "ModuleBase_IModule.h" +#include "ModelAPI_CompositeFeature.h" +#include "ModelAPI_Session.h" + #include #include #include @@ -141,12 +144,20 @@ bool XGUI_OperationMgr::abortAllOperations() bool XGUI_OperationMgr::commitAllOperations() { + bool isCompositeCommitted = false; while (hasOperation()) { + ModuleBase_Operation* anOperation = currentOperation(); if (isApplyEnabled()) { onCommitOperation(); } else { - currentOperation()->abort(); + anOperation->abort(); } + FeaturePtr aFeature = anOperation->feature(); + CompositeFeaturePtr aComposite = + std::dynamic_pointer_cast(aFeature); + isCompositeCommitted = aComposite.get(); + if (isCompositeCommitted) + break; } return true; } @@ -179,6 +190,24 @@ bool XGUI_OperationMgr::isApplyEnabled() const return myIsApplyEnabled; } +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 = 0; + Operations::const_iterator anIt = myOperations.end(); + if (anIt != myOperations.begin()) { // there are items in the operations list + --anIt; + aPrevOp = *anIt; // the last top operation, the operation which is started + if (anIt != myOperations.begin()) { // find the operation where the started operation is nested + --anIt; + aPrevOp = *anIt; + } + } + return aPrevOp && aPrevOp->isValid(); +} + bool XGUI_OperationMgr::canStopOperation() { ModuleBase_Operation* anOperation = currentOperation(); @@ -248,9 +277,12 @@ void XGUI_OperationMgr::onOperationStarted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - bool isNestedOk = (myOperations.count() >= 1) && - myOperations.at(0)->isValid(); - emit nestedStateChanged(isNestedOk); + 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); + emit operationStarted(aSenderOperation); } @@ -263,7 +295,10 @@ void XGUI_OperationMgr::onOperationAborted() void XGUI_OperationMgr::onOperationCommitted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - emit nestedStateChanged(myOperations.count() >= 1); + // 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); } @@ -276,14 +311,14 @@ void XGUI_OperationMgr::onOperationResumed() void XGUI_OperationMgr::onOperationStopped() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - ModuleBase_Operation* anOperation = currentOperation(); - if (!aSenderOperation || !anOperation || aSenderOperation != anOperation) + ModuleBase_Operation* aCurrentOperation = currentOperation(); + if (!aSenderOperation || !aCurrentOperation || aSenderOperation != aCurrentOperation) return; - myOperations.removeAll(anOperation); - anOperation->deleteLater(); + myOperations.removeAll(aCurrentOperation); + aCurrentOperation->deleteLater(); - emit operationStopped(anOperation); + emit operationStopped(aCurrentOperation); // get last operation which can be resumed ModuleBase_Operation* aResultOp = 0; @@ -297,6 +332,8 @@ void XGUI_OperationMgr::onOperationStopped() } } if (aResultOp) { + bool isModified = aCurrentOperation->isModified(); + aResultOp->setIsModified(isModified); resumeOperation(aResultOp); onValidateOperation(); }