X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=fa74ed50313618c714699ef4699d11c6714564fe;hb=e41462efa92b485f31903e3653d523b0a77a5296;hp=514c5b2f116c1f760e975a7dbc1f86efb86bda20;hpb=fb6327a29cb44836388e29ef7d06137fad863a49;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 514c5b2f1..fa74ed503 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,10 +13,8 @@ #include XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent) -: QObject(theParent) + : QObject(theParent), myIsValidationLock(false), myIsApplyEnabled(false) { - // listen to Escape signal to stop the current operation - qApp->installEventFilter(this); } XGUI_OperationMgr::~XGUI_OperationMgr() @@ -26,62 +26,159 @@ ModuleBase_Operation* XGUI_OperationMgr::currentOperation() const return myOperations.count() > 0 ? myOperations.last() : 0; } +bool XGUI_OperationMgr::isCurrentOperation(ModuleBase_Operation* theOperation) +{ + if(!hasOperation()) + return false; + return currentOperation() == theOperation; +} + bool XGUI_OperationMgr::hasOperation() const { - return (myOperations.count() > 0) && (myOperations.last() != NULL); + 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(); } -bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) +QStringList XGUI_OperationMgr::operationList() const { - if (!canStartOperation(theOperation)) - return false; + QStringList result; + foreach(ModuleBase_Operation* eachOperation, myOperations) { + FeaturePtr aFeature = eachOperation->feature(); + if(aFeature) { + result << QString::fromStdString(aFeature->getKind()); + } + } + return result; +} + +ModuleBase_Operation* XGUI_OperationMgr::previousOperation(ModuleBase_Operation* theOperation) const +{ + int idx = myOperations.lastIndexOf(theOperation); + if(idx == -1 || idx == 0) { + return NULL; + } + return myOperations.at(idx - 1); +} + +bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent) +{ + if (theEvent->type() == QEvent::KeyRelease) { + QKeyEvent* aKeyEvent = dynamic_cast(theEvent); + if(aKeyEvent) { + return onKeyReleased(aKeyEvent); + } + } + return QObject::eventFilter(theObject, theEvent); +} +bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) +{ + if (hasOperation()) + currentOperation()->postpone(); myOperations.append(theOperation); - connect(theOperation, SIGNAL(stopped()), this, SLOT(onOperationStopped())); - connect(theOperation, SIGNAL(started()), this, SIGNAL(operationStarted())); - 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(activatedByPreselection()), + SIGNAL(operationActivatedByPreselection())); theOperation->start(); + onValidateOperation(); return true; } -bool XGUI_OperationMgr::abortOperation() +bool XGUI_OperationMgr::abortAllOperations() { - ModuleBase_Operation* aCurrentOp = currentOperation(); - if (!aCurrentOp || !canStopOperation()) - return false; + if(!hasOperation()) { + return true; + } else if (operationsCount() == 1) { + onAbortOperation(); + return true; + } + 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(); + } + return result; +} - aCurrentOp->abort(); - return true; +void XGUI_OperationMgr::onValidateOperation() +{ + if (!hasOperation()) + return; + ModuleBase_Operation* anOperation = currentOperation(); + if(anOperation && (!myIsValidationLock)) { + setApplyEnabled(anOperation->isValid()); + } } -QStringList XGUI_OperationMgr::operationList() +void XGUI_OperationMgr::setApplyEnabled(const bool theEnabled) { - QStringList result; - foreach(ModuleBase_Operation* eachOperation, myOperations) { - result << eachOperation->id(); + myIsApplyEnabled = theEnabled; + emit applyEnableChanged(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 result; + return true; } -bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent) +bool XGUI_OperationMgr::commitOperation() { - if (theEvent->type() == QEvent::KeyRelease) { - QKeyEvent* aKeyEvent = (QKeyEvent*)theEvent; - if (aKeyEvent && aKeyEvent->key() == Qt::Key_Escape) { - // TODO: this is Escape button processing when the property panel has empty content, - // but the operation should be stopped by the Enter has been clicked - onKeyReleased("", aKeyEvent); - return true; - } + if (hasOperation() && currentOperation()->isValid()) { + onCommitOperation(); + return true; } - return QObject::eventFilter(theObject, theEvent); + return false; } void XGUI_OperationMgr::resumeOperation(ModuleBase_Operation* theOperation) @@ -89,52 +186,69 @@ 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 && !theOperation->isGranted(aCurrentOp)) - { - if (canStopOperation()) { - aCurrentOp->abort(); - } else { - aCanStart = false; + if (aCurrentOp) { + if (!aCurrentOp->isGranted(theId)) { + if (canStopOperation()) { + if (myIsApplyEnabled) + aCurrentOp->commit(); + else + aCurrentOp->abort(); + } else { + aCanStart = false; + } } } return aCanStart; } -bool XGUI_OperationMgr::canStopOperation() -{ - int anAnswer = QMessageBox::question(0, tr("Operation launch"), - tr("Previous operation is not finished and will be aborted"), - QMessageBox::Ok, QMessageBox::Cancel); - return anAnswer == QMessageBox::Ok; -} void XGUI_OperationMgr::onCommitOperation() { ModuleBase_Operation* anOperation = currentOperation(); - if (anOperation) { - if (anOperation->canBeCommitted()) - anOperation->commit(); - else - anOperation->abort(); - } + if (anOperation) + anOperation->commit(); } void XGUI_OperationMgr::onAbortOperation() { - ModuleBase_Operation* anOperation = currentOperation(); - if (anOperation) - anOperation->abort(); + if (hasOperation() && canStopOperation()) { + currentOperation()->abort(); + } +} + +void XGUI_OperationMgr::onOperationStarted() +{ + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + emit operationStarted(aSenderOperation); +} + +void XGUI_OperationMgr::onOperationAborted() +{ + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + emit operationAborted(aSenderOperation); +} + +void XGUI_OperationMgr::onOperationCommitted() +{ + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + emit operationCommitted(aSenderOperation); +} + +void XGUI_OperationMgr::onOperationResumed() +{ + ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); + emit operationResumed(aSenderOperation); } void XGUI_OperationMgr::onOperationStopped() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); ModuleBase_Operation* anOperation = currentOperation(); - if (!aSenderOperation || !anOperation || aSenderOperation != anOperation ) + if (!aSenderOperation || !anOperation || aSenderOperation != anOperation) return; myOperations.removeAll(anOperation); @@ -146,21 +260,38 @@ void XGUI_OperationMgr::onOperationStopped() ModuleBase_Operation* aResultOp = 0; QListIterator anIt(myOperations); anIt.toBack(); - while(anIt.hasPrevious()) - { + while (anIt.hasPrevious()) { ModuleBase_Operation* anOp = anIt.previous(); if (anOp) { aResultOp = anOp; break; } } - if (aResultOp) + if (aResultOp) { resumeOperation(aResultOp); + onValidateOperation(); + } } -void XGUI_OperationMgr::onKeyReleased(const std::string& theName, QKeyEvent* theEvent) +bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) { + // Let the manager decide what to do with the given key combination. ModuleBase_Operation* anOperation = currentOperation(); - if (anOperation) - anOperation->keyReleased(theName, theEvent); + bool isAccepted = true; + switch (theEvent->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: { + emit keyEnterReleased(); + commitOperation(); + } + break; + default: + isAccepted = false; + break; + } + //if(anOperation) { + // anOperation->keyReleased(theEvent->key()); + //} + return isAccepted; } +