X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=4cf7f3b851ec29a9ef405a7f7b137fa040c5aa1d;hb=9129370ff85bfb4c0c37d9f32f9d107041ec2fe8;hp=007019a64b15e5180adb6ba7836cbaffb2b2ae03;hpb=0762e940f001e4860da8cfd16400df23e3dfb088;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 007019a64..4cf7f3b85 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -1,19 +1,26 @@ // Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> -// File: XGUI_OperationMgr.h +// File: XGUI_OperationMgr.cpp // Created: 20 Apr 2014 // Author: Natalia ERMOLAEVA #include "XGUI_OperationMgr.h" #include "ModuleBase_Operation.h" +#include "ModuleBase_IWorkshop.h" +#include "ModuleBase_IModule.h" + +#include "ModelAPI_CompositeFeature.h" +#include "ModelAPI_Session.h" #include #include #include -XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent) - : QObject(theParent), myIsValidationLock(false), myIsApplyEnabled(false) +XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent, + ModuleBase_IWorkshop* theWorkshop) +: QObject(theParent), myIsValidationLock(false), myIsApplyEnabled(false), + myWorkshop(theWorkshop) { } @@ -105,6 +112,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())); @@ -136,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; } @@ -151,11 +167,18 @@ void XGUI_OperationMgr::onValidateOperation() if (!hasOperation()) return; ModuleBase_Operation* anOperation = currentOperation(); - if(anOperation && (!myIsValidationLock)) { - setApplyEnabled(anOperation->isValid()); + if(anOperation) { + bool aCanCommit = myWorkshop->module()->canCommitOperation(); + setApplyEnabled(!myIsValidationLock && aCanCommit && anOperation->isValid()); } } +void XGUI_OperationMgr::setLockValidating(bool toLock) +{ + myIsValidationLock = toLock; + onValidateOperation(); +} + void XGUI_OperationMgr::setApplyEnabled(const bool theEnabled) { myIsApplyEnabled = theEnabled; @@ -167,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(); @@ -235,9 +276,13 @@ void XGUI_OperationMgr::onAbortOperation() void XGUI_OperationMgr::onOperationStarted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - if (myOperations.count() == 1) { - emit nestedStateChanged(false); - } + + 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); } @@ -250,7 +295,10 @@ void XGUI_OperationMgr::onOperationAborted() void XGUI_OperationMgr::onOperationCommitted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - emit nestedStateChanged(true); + // 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); } @@ -263,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; @@ -284,11 +332,33 @@ void XGUI_OperationMgr::onOperationStopped() } } if (aResultOp) { + bool isModified = aCurrentOperation->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. @@ -300,7 +370,7 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) emit keyEnterReleased(); commitOperation(); } - break; + break; default: isAccepted = false; break;