X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=9015698d582966f93ae001765259990786f6314e;hb=59a007784d1e103bcb352c515eb6feafa170f1ff;hp=05778ad7fe6a44ff89c79c4b964fc3c79e0e9736;hpb=7fe754a6993eea325aee55c06816aa88311128c3;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 05778ad7f..9015698d5 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -17,6 +17,7 @@ #include #include "ModuleBase_OperationDescription.h" #include "ModuleBase_OperationFeature.h" +#include "ModuleBase_Tools.h" #include "ModelAPI_CompositeFeature.h" #include "ModelAPI_Session.h" @@ -25,6 +26,8 @@ #include #include +//#define DEBUG_CURRENT_FEATURE + XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent, ModuleBase_IWorkshop* theWorkshop) : QObject(theParent), myIsApplyEnabled(false), myWorkshop(theWorkshop) @@ -133,9 +136,10 @@ bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation) connect(aFOperation, SIGNAL(activatedByPreselection()), SIGNAL(operationActivatedByPreselection())); - theOperation->start(); - onValidateOperation(); - return true; + bool isStarted = theOperation->start(); + if (isStarted) + onValidateOperation(); + return isStarted; } bool XGUI_OperationMgr::abortAllOperations() @@ -195,8 +199,18 @@ void XGUI_OperationMgr::onValidateOperation() return; ModuleBase_OperationFeature* aFOperation = dynamic_cast (currentOperation()); - if(aFOperation && aFOperation->feature().get()) - setApplyEnabled(myWorkshop->module()->getFeatureError(aFOperation->feature()).isEmpty()); + if(aFOperation && aFOperation->feature().get()) { + QString anError = myWorkshop->module()->getFeatureError(aFOperation->feature()); + if (anError.isEmpty()) { + ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel(); + if (aPanel) { + ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget(); + if (anActiveWidget) + anError = myWorkshop->module()->getWidgetError(anActiveWidget); + } + } + setApplyEnabled(anError.isEmpty()); + } } void XGUI_OperationMgr::setApplyEnabled(const bool theEnabled) @@ -291,7 +305,7 @@ bool XGUI_OperationMgr::isGrantedOperation(const QString& theId) QListIterator anIt(myOperations); anIt.toBack(); ModuleBase_Operation* aPreviousOperation = 0; - while (anIt.hasPrevious()) { + while (anIt.hasPrevious() && !isGranted) { ModuleBase_Operation* anOp = anIt.previous(); if (anOp) isGranted = anOp->isGranted(theId); @@ -396,9 +410,30 @@ void XGUI_OperationMgr::onBeforeOperationStarted() // is disabled, sketch entity is disabled as extrusion cut is created earliest then sketch. // As a result the sketch disappears from the viewer. However after commit it is displayed back. aFOperation->setPreviousCurrentFeature(aDoc->currentFeature(false)); + +#ifdef DEBUG_CURRENT_FEATURE + FeaturePtr aFeature = aFOperation->feature(); + QString aKind = aFeature ? aFeature->getKind().c_str() : ""; + qDebug(QString("onBeforeOperationStarted(), edit operation = %1, feature = %2") + .arg(aFOperation->isEditOperation()) + .arg(ModuleBase_Tools::objectInfo(aFeature)).toStdString().c_str()); + + qDebug(QString("\tdocument->currentFeature(false) = %1").arg( + ModuleBase_Tools::objectInfo(ModelAPI_Session::get()->activeDocument()->currentFeature(false))).toStdString().c_str()); +#endif + if (aFOperation->isEditOperation()) // it should be performed by the feature edit only // in create operation, the current feature is changed by addFeature() aDoc->setCurrentFeature(aFOperation->feature(), false); + +#ifdef DEBUG_CURRENT_FEATURE + qDebug("\tdocument->setCurrentFeature"); + qDebug(QString("\tdocument->currentFeature(false) = %1").arg( + ModuleBase_Tools::objectInfo(ModelAPI_Session::get()->activeDocument()->currentFeature(false))).toStdString().c_str()); +#endif + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) + aModule->beforeOperationStarted(aFOperation); } } @@ -429,6 +464,16 @@ void XGUI_OperationMgr::onBeforeOperationCommitted() /// Restore the previous current feature ModuleBase_OperationFeature* aFOperation = dynamic_cast(aCurrentOperation); if (aFOperation) { +#ifdef DEBUG_CURRENT_FEATURE + QString aKind = aFOperation->feature()->getKind().c_str(); + qDebug(QString("onBeforeOperationCommitted(), edit operation = %1, feature = %2") + .arg(aFOperation->isEditOperation()) + .arg(ModuleBase_Tools::objectInfo(aFOperation->feature())).toStdString().c_str()); + + qDebug(QString("\tdocument->currentFeature(false) = %1").arg( + ModuleBase_Tools::objectInfo(ModelAPI_Session::get()->activeDocument()->currentFeature(false))).toStdString().c_str()); +#endif + if (aFOperation->isEditOperation()) { /// Restore the previous current feature setCurrentFeature(aFOperation->previousCurrentFeature()); @@ -440,6 +485,14 @@ void XGUI_OperationMgr::onBeforeOperationCommitted() if (myOperations.front() != aFOperation) setCurrentFeature(aFOperation->previousCurrentFeature()); } +#ifdef DEBUG_CURRENT_FEATURE + qDebug("\tdocument->setCurrentFeature"); + qDebug(QString("\tdocument->currentFeature(false) = %1").arg( + ModuleBase_Tools::objectInfo(ModelAPI_Session::get()->activeDocument()->currentFeature(false))).toStdString().c_str()); +#endif + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) + aModule->beforeOperationStopped(aFOperation); } } @@ -499,20 +552,21 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) switch (theEvent->key()) { case Qt::Key_Return: case Qt::Key_Enter: { - ModuleBase_Operation* aOperation = currentOperation(); + isAccepted = onProcessEnter(); + /*ModuleBase_Operation* aOperation = currentOperation(); ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); ModuleBase_ModelWidget* aActiveWgt = aPanel->activeWidget(); if (!aActiveWgt || !aActiveWgt->processEnter()) { if (!myWorkshop->module()->processEnter(aActiveWgt ? aActiveWgt->attributeID() : "")) { ModuleBase_OperationFeature* aFOperation = dynamic_cast(currentOperation()); - if (!aFOperation || myWorkshop->module()->getFeatureError(aFOperation->feature(), false).isEmpty()) { + if (!aFOperation || myWorkshop->module()->getFeatureError(aFOperation->feature()).isEmpty()) { emit keyEnterReleased(); commitOperation(); } else isAccepted = false; } - } + }*/ } break; case Qt::Key_N: @@ -542,6 +596,26 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) return isAccepted; } +bool XGUI_OperationMgr::onProcessEnter() +{ + bool isAccepted = true; + ModuleBase_Operation* aOperation = currentOperation(); + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + ModuleBase_ModelWidget* aActiveWgt = aPanel->activeWidget(); + if (!aActiveWgt || !aActiveWgt->processEnter()) { + if (!myWorkshop->module()->processEnter(aActiveWgt ? aActiveWgt->attributeID() : "")) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast(currentOperation()); + if (!aFOperation || myWorkshop->module()->getFeatureError(aFOperation->feature()).isEmpty()) { + emit keyEnterReleased(); + commitOperation(); + } + else + isAccepted = false; + } + } + return isAccepted; +} + XGUI_Workshop* XGUI_OperationMgr::workshop() const { XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop);