#include "XGUI_OperationMgr.h"
#include "ModuleBase_Operation.h"
-#include <ModelAPI_Validator.h>
-#include <ModelAPI_FeatureValidator.h>
#include <QMessageBox>
#include <QApplication>
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);
}
int XGUI_OperationMgr::operationsCount() const
return myOperations.count();
}
+QStringList XGUI_OperationMgr::operationList() const
+{
+ 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<QKeyEvent*>(theEvent);
+ if(aKeyEvent && onKeyReleased(aKeyEvent)) {
+ return true;
+ }
+ }
+ return QObject::eventFilter(theObject, theEvent);
+}
+
bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation)
{
if (!canStartOperation(theOperation))
myOperations.append(theOperation);
connect(theOperation, SIGNAL(stopped()), this, SLOT(onOperationStopped()));
- connect(theOperation, SIGNAL(started()), this, SIGNAL(operationStarted()));
+ connect(theOperation, SIGNAL(started()), this, SLOT(onOperationStarted()));
connect(theOperation, SIGNAL(resumed()), this, SIGNAL(operationResumed()));
- connect(theOperation, SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)), this,
- SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)));
theOperation->start();
- validateCurrentOperation();
+ onValidateOperation();
return true;
}
-bool XGUI_OperationMgr::abortOperation()
+bool XGUI_OperationMgr::abortAllOperations()
{
- 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();
+ 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;
}
-void XGUI_OperationMgr::validateOperation(ModuleBase_Operation* theOperation)
-{
- //Get operation Id and feature to validate
- QString anOperationId = theOperation->id();
- 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);
-}
-
-void XGUI_OperationMgr::validateCurrentOperation()
+void XGUI_OperationMgr::onValidateOperation()
{
if (!hasOperation())
return;
ModuleBase_Operation* anOperation = currentOperation();
- validateOperation(currentOperation());
+ if(anOperation) {
+ bool isValid = anOperation->isValid();
+ emit operationValidated(isValid);
+ }
}
-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)
bool aCanStart = true;
ModuleBase_Operation* aCurrentOp = currentOperation();
if (aCurrentOp) {
- if (!theOperation->isGranted()) {
- if (!aCurrentOp->isValid(theOperation)) {
- if (canStopOperation()) {
- aCurrentOp->abort();
- } else {
- aCanStart = false;
- }
+ if (!aCurrentOp->isGranted(theOperation)) {
+ if (canAbortOperation()) {
+ aCurrentOp->abort();
+ } else {
+ aCanStart = false;
}
}
}
return aCanStart;
}
-bool XGUI_OperationMgr::canStopOperation()
-{
- ModuleBase_Operation* anOperation = currentOperation();
- if (anOperation) {
- if (anOperation->isModified()) {
- int anAnswer = QMessageBox::question(
- qApp->activeWindow(), tr("Operation launch"),
- tr("Previous operation is not finished, abort it?"),
- QMessageBox::Abort | QMessageBox::Cancel,
- QMessageBox::Cancel);
- return anAnswer == QMessageBox::Abort;
- }
- }
- return true;
-}
void XGUI_OperationMgr::onCommitOperation()
{
ModuleBase_Operation* anOperation = currentOperation();
- anOperation->onWidgetActivated(NULL);
if (anOperation)
anOperation->commit();
}
void XGUI_OperationMgr::onAbortOperation()
{
- ModuleBase_Operation* anOperation = currentOperation();
- if (anOperation && canAbortOperation())
- anOperation->abort();
+ if (hasOperation() && canAbortOperation()) {
+ currentOperation()->abort();
+ }
}
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()) {
- int anAnswer = QMessageBox::question(
- qApp->activeWindow(), tr("Cancel operation"),
- tr("Operation %1 will be cancelled. Continue?").arg(anOperation->id()), QMessageBox::Yes,
- QMessageBox::No);
- return anAnswer == QMessageBox::Yes;
+ 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;
}
+void XGUI_OperationMgr::onOperationStarted()
+{
+ ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
+ emit operationStarted(aSenderOperation);
+}
+
void XGUI_OperationMgr::onOperationStopped()
{
ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(sender());
}
if (aResultOp) {
resumeOperation(aResultOp);
- validateCurrentOperation();
+ onValidateOperation();
}
}
-void XGUI_OperationMgr::onKeyReleased(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)
+ bool isAccepted = true;
+ switch (theEvent->key()) {
+ case Qt::Key_Escape: {
+ onAbortOperation();
+ }
+ break;
+ case Qt::Key_Return:
+ case Qt::Key_Enter: {
+ 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);
-}