X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=5256eb7db48f75f414d198b75c883c046b2c1483;hb=564df60468b225bbce2f1cc055299b47c3be9355;hp=f93cb6b6a22a0b2f74a10be0d71596484de0ac36;hpb=5b841e9801c659d762d708378df8c4d85565fda0;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index f93cb6b6a..5256eb7db 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: XGUI_OperationMgr.h // Created: 20 Apr 2014 // Author: Natalia ERMOLAEVA @@ -11,7 +13,7 @@ #include XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent) - : QObject(theParent) + : QObject(theParent), myIsValidationLock(false), myIsApplyEnabled(false) { } @@ -36,6 +38,25 @@ bool XGUI_OperationMgr::hasOperation() const return !myOperations.isEmpty() && (myOperations.last() != NULL); } +bool XGUI_OperationMgr::hasOperation(const QString& theId) const +{ + foreach(ModuleBase_Operation* aOp, myOperations) { + if (aOp->id() == theId) + return true; + } + return false; +} + +ModuleBase_Operation* XGUI_OperationMgr::findOperation(const QString& theId) const +{ + foreach(ModuleBase_Operation* aOp, myOperations) { + if (aOp->id() == theId) + return aOp; + } + return 0; +} + + int XGUI_OperationMgr::operationsCount() const { return myOperations.count(); @@ -75,14 +96,18 @@ bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent) bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) { - if (!canStartOperation(theOperation)) - return false; - + if (hasOperation()) + currentOperation()->postpone(); myOperations.append(theOperation); - connect(theOperation, SIGNAL(stopped()), this, SLOT(onOperationStopped())); - connect(theOperation, SIGNAL(started()), this, SLOT(onOperationStarted())); - connect(theOperation, SIGNAL(resumed()), this, SIGNAL(operationResumed())); + connect(theOperation, SIGNAL(started()), SLOT(onOperationStarted())); + connect(theOperation, SIGNAL(aborted()), SLOT(onOperationAborted())); + 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())); theOperation->start(); onValidateOperation(); @@ -110,15 +135,54 @@ bool XGUI_OperationMgr::abortAllOperations() return result; } +bool XGUI_OperationMgr::commitAllOperations() +{ + while (hasOperation()) { + if (isApplyEnabled()) { + onCommitOperation(); + } else { + currentOperation()->abort(); + } + } + return true; +} + void XGUI_OperationMgr::onValidateOperation() { if (!hasOperation()) return; ModuleBase_Operation* anOperation = currentOperation(); - if(anOperation) { - bool isValid = anOperation->isValid(); - emit operationValidated(isValid); + if(anOperation && (!myIsValidationLock)) { + setApplyEnabled(anOperation->isValid()); + } +} + +void XGUI_OperationMgr::setApplyEnabled(const bool theEnabled) +{ + myIsApplyEnabled = theEnabled; + emit validationStateChanged(theEnabled); +} + +bool XGUI_OperationMgr::isApplyEnabled() const +{ + return myIsApplyEnabled; +} + +bool XGUI_OperationMgr::canStopOperation() +{ + ModuleBase_Operation* anOperation = currentOperation(); + if(operationsCount() > 1) //in case of nested (sketch) operation no confirmation needed + return true; + if (anOperation && anOperation->isModified()) { + QString aMessage = tr("%1 operation will be aborted.").arg(anOperation->id()); + int anAnswer = QMessageBox::question(qApp->activeWindow(), + tr("Abort operation"), + aMessage, + QMessageBox::Ok | QMessageBox::Cancel, + QMessageBox::Cancel); + return anAnswer == QMessageBox::Ok; } + return true; } bool XGUI_OperationMgr::commitOperation() @@ -135,14 +199,17 @@ void XGUI_OperationMgr::resumeOperation(ModuleBase_Operation* theOperation) theOperation->resume(); } -bool XGUI_OperationMgr::canStartOperation(ModuleBase_Operation* theOperation) +bool XGUI_OperationMgr::canStartOperation(QString theId) { bool aCanStart = true; ModuleBase_Operation* aCurrentOp = currentOperation(); if (aCurrentOp) { - if (!aCurrentOp->isGranted(theOperation)) { - if (canAbortOperation()) { - aCurrentOp->abort(); + if (!aCurrentOp->isGranted(theId)) { + if (canStopOperation()) { + if (myIsApplyEnabled) + aCurrentOp->commit(); + else + aCurrentOp->abort(); } else { aCanStart = false; } @@ -161,32 +228,38 @@ void XGUI_OperationMgr::onCommitOperation() void XGUI_OperationMgr::onAbortOperation() { - if (hasOperation() && canAbortOperation()) { + if (hasOperation() && canStopOperation()) { currentOperation()->abort(); } } -bool XGUI_OperationMgr::canAbortOperation() +void XGUI_OperationMgr::onOperationStarted() { - ModuleBase_Operation* anOperation = currentOperation(); - if(operationsCount() > 1) //in case of nested (sketch) operation no confirmation needed - return true; - if (anOperation && anOperation->isModified()) { - QString aMessage = tr("%1 operation will be aborted.").arg(anOperation->id()); - int anAnswer = QMessageBox::question(qApp->activeWindow(), - tr("Abort operation"), - aMessage, - QMessageBox::Ok | QMessageBox::Cancel, - QMessageBox::Cancel); - return anAnswer == QMessageBox::Ok; - } - return true; + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + + bool isNestedOk = (myOperations.count() >= 1) && + myOperations.at(0)->isValid(); + emit nestedStateChanged(isNestedOk); + emit operationStarted(aSenderOperation); } -void XGUI_OperationMgr::onOperationStarted() +void XGUI_OperationMgr::onOperationAborted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - emit operationStarted(aSenderOperation); + emit operationAborted(aSenderOperation); +} + +void XGUI_OperationMgr::onOperationCommitted() +{ + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + emit nestedStateChanged(myOperations.count() >= 1); + emit operationCommitted(aSenderOperation); +} + +void XGUI_OperationMgr::onOperationResumed() +{ + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + emit operationResumed(aSenderOperation); } void XGUI_OperationMgr::onOperationStopped() @@ -218,6 +291,26 @@ void XGUI_OperationMgr::onOperationStopped() } } +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. @@ -226,16 +319,17 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) switch (theEvent->key()) { case Qt::Key_Return: case Qt::Key_Enter: { + emit keyEnterReleased(); commitOperation(); } - break; + break; default: isAccepted = false; break; } - if(anOperation) { - anOperation->keyReleased(theEvent->key()); - } + //if(anOperation) { + // anOperation->keyReleased(theEvent->key()); + //} return isAccepted; }