X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=514c5b2f116c1f760e975a7dbc1f86efb86bda20;hb=8da742ab694198bf02ffd7c4b876128774fd2c92;hp=ae5aeb04732b065d042ee57b34a82ad61e128894;hpb=11fca61445a4c008b1b703bfd4bb512fcac65135;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index ae5aeb047..514c5b2f1 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -1,76 +1,133 @@ +// File: XGUI_OperationMgr.h +// Created: 20 Apr 2014 +// Author: Natalia ERMOLAEVA + #include "XGUI_OperationMgr.h" #include "ModuleBase_Operation.h" #include +#include +#include -/*! - \brief Constructor - */ XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent) : QObject(theParent) { + // listen to Escape signal to stop the current operation + qApp->installEventFilter(this); } -/*! - \brief Destructor - */ XGUI_OperationMgr::~XGUI_OperationMgr() { } -/*! - \brief Returns the current operation or NULL - * \return the current operation - */ ModuleBase_Operation* XGUI_OperationMgr::currentOperation() const { return myOperations.count() > 0 ? myOperations.last() : 0; } -/*! - \brief Sets the current operation or NULL - * \return the current operation - */ +bool XGUI_OperationMgr::hasOperation() const +{ + return (myOperations.count() > 0) && (myOperations.last() != NULL); +} + +int XGUI_OperationMgr::operationsCount() const +{ + return myOperations.count(); +} + bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) { if (!canStartOperation(theOperation)) return false; myOperations.append(theOperation); - emit beforeOperationStart(); connect(theOperation, SIGNAL(stopped()), this, SLOT(onOperationStopped())); + connect(theOperation, SIGNAL(started()), this, SIGNAL(operationStarted())); + connect(theOperation, SIGNAL(resumed()), this, SIGNAL(operationResumed())); + theOperation->start(); + return true; +} - emit afterOperationStart(); +bool XGUI_OperationMgr::abortOperation() +{ + ModuleBase_Operation* aCurrentOp = currentOperation(); + if (!aCurrentOp || !canStopOperation()) + return false; + + aCurrentOp->abort(); return true; } +QStringList XGUI_OperationMgr::operationList() +{ + QStringList result; + foreach(ModuleBase_Operation* eachOperation, myOperations) { + result << eachOperation->id(); + } + return result; +} + +bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent) +{ + 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; + } + } + return QObject::eventFilter(theObject, theEvent); +} + +void XGUI_OperationMgr::resumeOperation(ModuleBase_Operation* theOperation) +{ + theOperation->resume(); +} + bool XGUI_OperationMgr::canStartOperation(ModuleBase_Operation* theOperation) { bool aCanStart = true; ModuleBase_Operation* aCurrentOp = currentOperation(); - if (aCurrentOp && !theOperation->isGranted()) + if (aCurrentOp && !theOperation->isGranted(aCurrentOp)) { - int anAnswer = QMessageBox::question(0, tr("Operation launch"), - tr("Previous operation is not finished and will be aborted"), - QMessageBox::Ok, QMessageBox::Cancel); - if (anAnswer == QMessageBox::Ok) + if (canStopOperation()) { aCurrentOp->abort(); - else + } else { aCanStart = false; + } } return aCanStart; } -void XGUI_OperationMgr::commitCurrentOperation() +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) - return; + if (anOperation) { + if (anOperation->canBeCommitted()) + anOperation->commit(); + else + anOperation->abort(); + } +} - anOperation->commit(); +void XGUI_OperationMgr::onAbortOperation() +{ + ModuleBase_Operation* anOperation = currentOperation(); + if (anOperation) + anOperation->abort(); } void XGUI_OperationMgr::onOperationStopped() @@ -81,6 +138,9 @@ void XGUI_OperationMgr::onOperationStopped() return; myOperations.removeAll(anOperation); + anOperation->deleteLater(); + + emit operationStopped(anOperation); // get last operation which can be resumed ModuleBase_Operation* aResultOp = 0; @@ -95,5 +155,12 @@ void XGUI_OperationMgr::onOperationStopped() } } if (aResultOp) - startOperation(aResultOp); + resumeOperation(aResultOp); +} + +void XGUI_OperationMgr::onKeyReleased(const std::string& theName, QKeyEvent* theEvent) +{ + ModuleBase_Operation* anOperation = currentOperation(); + if (anOperation) + anOperation->keyReleased(theName, theEvent); }