-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
-
-// File: XGUI_OperationMgr.cpp
-// Created: 20 Apr 2014
-// Author: Natalia ERMOLAEVA
+// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
#include "XGUI_OperationMgr.h"
#include "XGUI_ModuleConnector.h"
bool isAccepted = false;
if (myIsActive && theEvent->type() == QEvent::KeyRelease) {
QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
- if(aKeyEvent) {
+ if (aKeyEvent) {
switch (aKeyEvent->key()) {
- case Qt::Key_Delete: {
+ case Qt::Key_Delete:
isAccepted = myOperationMgr->onProcessDelete(theObject);
- }
+ break;
+ default:
+ isAccepted = myOperationMgr->onKeyReleased(theObject, aKeyEvent);
+ break;
}
}
}
return myOperations.at(idx - 1);
}
-bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent)
-{
- bool isAccepted = false;
- if (theEvent->type() == QEvent::KeyRelease) {
- QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
- if(aKeyEvent)
- isAccepted = onKeyReleased(theObject, aKeyEvent);
- }
- if (!isAccepted)
- isAccepted = QObject::eventFilter(theObject, theEvent);
-
- return isAccepted;
-}
-
bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation)
{
if (hasOperation())
aMgr->startOperation(QString("Set current feature: %1")
.arg(theFeature->getKind().c_str()).toStdString());
aDoc->setCurrentFeature(theFeature, false);
+#ifdef DEBUG_CURRENT_FEATURE
+ qDebug(QString(" document->setCurrentFeature(false) = %1 SET").arg(
+ ModuleBase_Tools::objectName(
+ ModelAPI_Session::get()->activeDocument()->currentFeature(false))).toStdString().c_str());
+#endif
+
if (!aIsOp)
aMgr->finishOperation();
}
-bool XGUI_OperationMgr::canStartOperation(const QString& theId)
+bool XGUI_OperationMgr::canStartOperation(const QString& theId, bool& isCommitted)
{
bool aCanStart = true;
+ isCommitted = false;
ModuleBase_Operation* aCurrentOp = currentOperation();
if (aCurrentOp) {
bool aGranted = aCurrentOp->isGranted(theId);
else if (canStopOperation(aCurrentOp)) {
// the started operation is granted in the parrent operation,
// e.g. current - Line in Sketch, started Circle
- stopOperation(aCurrentOp);
+ stopOperation(aCurrentOp, isCommitted);
} else {
aCanStart = false;
}
return aCanStart;
}
-void XGUI_OperationMgr::stopOperation(ModuleBase_Operation* theOperation)
+void XGUI_OperationMgr::stopOperation(ModuleBase_Operation* theOperation, bool& isCommitted)
{
if (XGUI_Tools::workshop(myWorkshop)->errorMgr()->isApplyEnabled() && theOperation->isModified())
- theOperation->commit();
- else
+ isCommitted = theOperation->commit();
+ else {
+ isCommitted = false;
abortOperation(theOperation);
+ }
}
void XGUI_OperationMgr::abortOperation(ModuleBase_Operation* theOperation)
#ifdef DEBUG_CURRENT_FEATURE
FeaturePtr aFeature = aFOperation->feature();
QString aKind = aFeature ? aFeature->getKind().c_str() : "";
- qDebug(QString("onBeforeOperationStarted(), edit operation = %1, feature = %2")
+ qDebug("");
+ qDebug(QString("onBeforeOperationStarted() isEditOperation = %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());
+ .arg(ModuleBase_Tools::objectName(aFeature)).toStdString().c_str());
+ qDebug(QString(" document->currentFeature(false) = %1 : DO: setPreviousCurrentFeature").arg(
+ ModuleBase_Tools::objectName(aDoc->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(QString(" document->setCurrentFeature(false) = %1").arg(
+ ModuleBase_Tools::objectName(aDoc->currentFeature(false))).toStdString().c_str());
+#endif
// this is the only place where flushes must be called after setCurrentFeature for the
// current moment: after this the opertion is not finished, so, the ObjectBrowser
// state may be corrupted (issue #1457)
static Events_ID aDeleteEvent = aLoop->eventByName(EVENT_OBJECT_DELETED);
aLoop->flush(aDeleteEvent);
}
-
-#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
}
}
if (aFOperation) {
#ifdef DEBUG_CURRENT_FEATURE
QString aKind = aFOperation->feature()->getKind().c_str();
- qDebug(QString("onBeforeOperationCommitted(), edit operation = %1, feature = %2")
+ qDebug(QString("onBeforeOperationCommitted() isEditOperation = %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(
+ .arg(ModuleBase_Tools::objectName(aFOperation->feature())).toStdString().c_str());
+ qDebug(QString(" document->currentFeature(false) = %1").arg(
+ ModuleBase_Tools::objectName(
ModelAPI_Session::get()->activeDocument()->currentFeature(false)))
.toStdString().c_str());
#endif
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);
ModuleBase_Operation* anOperation = currentOperation();
bool isAccepted = false;
switch (theEvent->key()) {
+ case Qt::Key_Escape: {
+ ModuleBase_Operation* aOperation = currentOperation();
+ if (aOperation) {
+ onAbortOperation();
+ isAccepted = true;
+ }
+ }
+ break;
+ case Qt::Key_Tab:
+ case Qt::Key_Backtab:
+ {
+ ModuleBase_Operation* aOperation = currentOperation();
+ if (aOperation) {
+ ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel();
+ if (aPanel) {
+ QWidget* aFocusedWidget = qApp->focusWidget();
+ bool isPPChildObject = aFocusedWidget && isChildObject(aFocusedWidget, aPanel);
+ if (!isPPChildObject) {
+ // check for case when the operation is started but property panel is not filled
+ XGUI_PropertyPanel* aPP = dynamic_cast<XGUI_PropertyPanel*>(aPanel);
+ aPP->setFocusNextPrevChild(theEvent->key() == Qt::Key_Tab);
+ isAccepted = true;
+ }
+ }
+ }
+ }
+ break;
case Qt::Key_Return:
case Qt::Key_Enter: {
isAccepted = onProcessEnter(theObject);
if (!aOperation)
return isAccepted;
ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+ // the next code is obsolete as we want to process Enter in property panel always
// only property panel enter is processed in order to do not process enter in application dialogs
- bool isPPChild = isChildObject(theObject, aPanel);
- if (!isPPChild)
- return isAccepted;
+ //bool isPPChild = isChildObject(theObject, aPanel);
+ //if (!isPPChild)
+ // return isAccepted;
ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget();
bool isAborted = false;