X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=a8f68277b5aa2266d32b6cb4f4d6c4b33730a9d8;hb=dfdb2899a4cb4eaea4cdce45fa7c05ec0c5c807a;hp=3a5060d8cda0538d3f8c7f90b36c4c85e42980aa;hpb=02bc870879ae19215d5ef6f721acd5b12d245473;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 3a5060d8c..a8f68277b 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 @@ -5,18 +7,14 @@ #include "XGUI_OperationMgr.h" #include "ModuleBase_Operation.h" -#include -#include #include #include #include XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent) - : QObject(theParent) + : QObject(theParent), myIsValidationLock(false) { - // listen to Escape signal to stop the current operation - qApp->installEventFilter(this); } XGUI_OperationMgr::~XGUI_OperationMgr() @@ -28,38 +26,87 @@ 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(); } -QStringList XGUI_OperationMgr::operationList() +QStringList XGUI_OperationMgr::operationList() const { QStringList result; - foreach(ModuleBase_Operation* eachOperation, myOperations) - { - result << eachOperation->id(); + foreach(ModuleBase_Operation* eachOperation, myOperations) { + FeaturePtr aFeature = eachOperation->feature(); + if(aFeature) { + result << QString::fromStdString(aFeature->getKind()); + } } return result; } -bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) +ModuleBase_Operation* XGUI_OperationMgr::previousOperation(ModuleBase_Operation* theOperation) const { - if (!canStartOperation(theOperation)) - return false; + 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(activateNextWidget(ModuleBase_ModelWidget*)), this, - SIGNAL(activateNextWidget(ModuleBase_ModelWidget*))); + 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(); @@ -68,7 +115,9 @@ bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) bool XGUI_OperationMgr::abortAllOperations() { - if (operationsCount() == 1) { + if(!hasOperation()) { + return true; + } else if (operationsCount() == 1) { onAbortOperation(); return true; } @@ -85,46 +134,24 @@ bool XGUI_OperationMgr::abortAllOperations() return result; } -bool XGUI_OperationMgr::validateOperation(ModuleBase_Operation* theOperation) -{ - //Get operation feature to validate - FeaturePtr aFeature = theOperation->feature(); - //Get validators for the Id - SessionPtr aMgr = ModelAPI_Session::get(); - ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - - bool isValid = aFactory->validate(aFeature); - emit operationValidated(isValid); - return isValid; -} - void XGUI_OperationMgr::onValidateOperation() { if (!hasOperation()) return; ModuleBase_Operation* anOperation = currentOperation(); - validateOperation(currentOperation()); -} - -bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent) -{ - if (theEvent->type() == QEvent::KeyRelease) { - QKeyEvent* aKeyEvent = dynamic_cast(theEvent); - // 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 - if(aKeyEvent) { - onKeyReleased(aKeyEvent); - return true; - } + if(anOperation && (!myIsValidationLock)) { + bool isValid = anOperation->isValid(); + emit operationValidated(isValid); } - return QObject::eventFilter(theObject, theEvent); } -void XGUI_OperationMgr::commitOperation() +bool XGUI_OperationMgr::commitOperation() { - if (validateOperation(currentOperation())) { + if (hasOperation() && currentOperation()->isValid()) { onCommitOperation(); + return true; } + return false; } void XGUI_OperationMgr::resumeOperation(ModuleBase_Operation* theOperation) @@ -132,18 +159,16 @@ 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 (!theOperation->isGranted()) { - if (!aCurrentOp->isValid(theOperation)) { - if (canAbortOperation()) { - aCurrentOp->abort(); - } else { - aCanStart = false; - } + if (!aCurrentOp->isGranted(theId)) { + if (canAbortOperation()) { + aCurrentOp->abort(); + } else { + aCanStart = false; } } } @@ -154,7 +179,6 @@ bool XGUI_OperationMgr::canStartOperation(ModuleBase_Operation* theOperation) void XGUI_OperationMgr::onCommitOperation() { ModuleBase_Operation* anOperation = currentOperation(); - anOperation->onWidgetActivated(NULL); if (anOperation) anOperation->commit(); } @@ -169,6 +193,8 @@ void XGUI_OperationMgr::onAbortOperation() bool XGUI_OperationMgr::canAbortOperation() { 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(), @@ -181,6 +207,30 @@ bool XGUI_OperationMgr::canAbortOperation() return true; } +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()); @@ -210,31 +260,25 @@ void XGUI_OperationMgr::onOperationStopped() } } -void XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) +bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) { - ModuleBase_Operation* anOperation = currentOperation(); - if (anOperation) { - bool isFinished = anOperation->keyReleased(theEvent->key()); - if(isFinished) - return; - } // Let the manager decide what to do with the given key combination. + ModuleBase_Operation* anOperation = currentOperation(); + bool isAccepted = true; switch (theEvent->key()) { - case Qt::Key_Escape: - onAbortOperation(); - break; case Qt::Key_Return: - case Qt::Key_Enter: + case Qt::Key_Enter: { + emit keyEnterReleased(); commitOperation(); + } break; default: + isAccepted = false; break; } + //if(anOperation) { + // anOperation->keyReleased(theEvent->key()); + //} + return isAccepted; } -void XGUI_OperationMgr::onWidgetActivated(ModuleBase_ModelWidget* theWidget) -{ - ModuleBase_Operation* anOperation = currentOperation(); - if (anOperation) - anOperation->onWidgetActivated(theWidget); -}