X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=fe2b72830ae95b4697dcf0850139e3788beb8bdc;hb=7c06295aea6523048b676312fbeb5da673c0659d;hp=dacd82f21309e94748432d0812e3d88dc9c5e504;hpb=feaeb677047efcb01c02b861691810750e2b32e1;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index dacd82f21..fe2b72830 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -1,19 +1,27 @@ // 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 "ModuleBase_OperationDescription.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 +113,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())); @@ -115,33 +124,46 @@ 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() { + bool isCompositeCommitted = false; while (hasOperation()) { + ModuleBase_Operation* anOperation = currentOperation(); if (isApplyEnabled()) { onCommitOperation(); } else { - currentOperation()->abort(); + abortOperation(anOperation); } + FeaturePtr aFeature = anOperation->feature(); + CompositeFeaturePtr aComposite = + std::dynamic_pointer_cast(aFeature); + isCompositeCommitted = aComposite.get(); + if (isCompositeCommitted) + break; } return true; } @@ -151,22 +173,60 @@ 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; 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; } +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(); @@ -208,7 +268,7 @@ bool XGUI_OperationMgr::canStartOperation(QString theId) if (myIsApplyEnabled) aCurrentOp->commit(); else - aCurrentOp->abort(); + abortOperation(aCurrentOp); } else { aCanStart = false; } @@ -217,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() { @@ -228,17 +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 isNestedOk = (myOperations.count() >= 1) && - myOperations.at(0)->isValid(); - emit nestedStateChanged(isNestedOk); + updateApplyOfOperations(aSenderOperation); emit operationStarted(aSenderOperation); } @@ -250,8 +324,9 @@ void XGUI_OperationMgr::onOperationAborted() void XGUI_OperationMgr::onOperationCommitted() { + updateApplyOfOperations(); + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - emit nestedStateChanged(myOperations.count() >= 1); emit operationCommitted(aSenderOperation); } @@ -264,14 +339,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; @@ -285,6 +360,8 @@ void XGUI_OperationMgr::onOperationStopped() } } if (aResultOp) { + bool isModified = aCurrentOperation->isModified(); + aResultOp->setIsModified(aResultOp->isModified() || isModified); resumeOperation(aResultOp); onValidateOperation(); }