-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+// 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 "ModelAPI_IReentrant.h"
#include "ModelAPI_EventReentrantMessage.h"
void ModuleBase_IModule::launchModal(const QString& theCmdId)
{
- if (!myWorkshop->canStartOperation(theCmdId))
+ bool isCommitted;
+ if (!myWorkshop->canStartOperation(theCmdId, isCommitted))
return;
std::string aXmlCfg, aDescription;
}
-void ModuleBase_IModule::launchOperation(const QString& theCmdId)
+void ModuleBase_IModule::launchOperation(const QString& theCmdId,
+ const bool& isStartAfterCommitOnly)
{
/// selection should be obtained from workshop before ask if the operation can be started as
/// the canStartOperation method performs commit/abort of previous operation.
QList<ModuleBase_ViewerPrsPtr> aPreSelected =
aSelection->getSelected(ModuleBase_ISelection::AllControls);
- if (!myWorkshop->canStartOperation(theCmdId))
+ ModuleBase_OperationFeature* aCurOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (myWorkshop->currentOperation());
+ QString aCurOperationKind = aCurOperation ? aCurOperation->getDescription()->operationId() : "";
+
+ bool isCommitted;
+ if (!myWorkshop->canStartOperation(theCmdId, isCommitted))
+ return;
+
+ /// reentrant operation(Sketch Line) should not be started if operation is aborted
+ if (isStartAfterCommitOnly && !isCommitted)
return;
ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
if (aMessage.get()) {
setReentrantPreSelection(aMessage);
}
- else
+ else if (canUsePreselection(aCurOperationKind, theCmdId)) {
+ // restore of previous opeation is absent or new launched operation has the same kind
aFOperation->initSelection(aPreSelected);
-
+ }
workshop()->processLaunchOperation(aFOperation);
if (aFOperation) {
if (aMessage.get()) {
ModuleBase_IPropertyPanel* aPanel = workshop()->propertyPanel();
std::string aPrevAttribute = aReentrantFeature->processEvent(aMessage);
- workshop()->errorMgr()->updateActions(aFeature);
-
- ModuleBase_ModelWidget* aPrevWidget = aPanel->modelWidget(aPrevAttribute);
- aPanel->activateNextWidget(aPrevWidget);
+ if (!aPrevAttribute.empty()) {
+ workshop()->errorMgr()->updateActions(aFeature);
+ ModuleBase_ModelWidget* aPrevWidget = aPanel->modelWidget(aPrevAttribute);
+ aPanel->activateNextWidget(aPrevWidget);
+ }
}
}
}
return true;
}
+bool ModuleBase_IModule::canUsePreselection(const QString& thePreviousOperationKind,
+ const QString& theStartedOperationKind)
+{
+ // no previous operation
+ if (thePreviousOperationKind.isEmpty())
+ return true;
+ // edit operation
+ if (thePreviousOperationKind.endsWith(ModuleBase_OperationFeature::EditSuffix()))
+ return true;
+
+ // reentrant operation
+ if (thePreviousOperationKind == theStartedOperationKind)
+ return true;
+
+ return false;
+}
+
bool ModuleBase_IModule::canUndo() const
{
SessionPtr aMgr = ModelAPI_Session::get();
//Do nothing on uncheck
if (aCmd->isCheckable() && !aCmd->isChecked()) {
ModuleBase_Operation* anOperation = myWorkshop->findStartedOperation(aCmd->data().toString());
- if (myWorkshop->canStopOperation(anOperation))
- myWorkshop->stopOperation(anOperation);
+ if (myWorkshop->canStopOperation(anOperation)) {
+ bool isCommitted;
+ myWorkshop->stopOperation(anOperation, isCommitted);
+ }
else {
aCmd->setChecked(true);
}
if (aInfo.get() && aInfo->isModal()) {
launchModal(aCmdId);
} else {
- launchOperation(aCmdId);
- emit operationLaunched();
+ launchOperation(aCmdId, false);
}
}
}
void ModuleBase_IModule::editFeature(FeaturePtr theFeature)
{
std::string aFeatureId = theFeature->getKind();
- if (!myWorkshop->canStartOperation(aFeatureId.c_str()))
+ bool isCommitted;
+ if (!myWorkshop->canStartOperation(aFeatureId.c_str(), isCommitted))
return;
ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>