X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_IModule.cpp;h=9b584ab63961c1b5c9de35fccd2fbec9f31ce7fc;hb=50a8df0c6a66da8067b16155e5ae39f8f26a7ebc;hp=ca6c1b1bc234dec3a25fd0bdcfc333319b33c24e;hpb=b57258dba9f8575728ecb92e48c07c9fd6652f9b;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_IModule.cpp b/src/ModuleBase/ModuleBase_IModule.cpp index ca6c1b1bc..9b584ab63 100644 --- a/src/ModuleBase/ModuleBase_IModule.cpp +++ b/src/ModuleBase/ModuleBase_IModule.cpp @@ -1,4 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 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 +// #include "ModelAPI_IReentrant.h" #include "ModelAPI_EventReentrantMessage.h" @@ -54,6 +71,18 @@ ModuleBase_IModule::ModuleBase_IModule(ModuleBase_IWorkshop* theParent) // SLOT(onMouseDoubleClick(QMouseEvent*))); } +ModuleBase_IModule::~ModuleBase_IModule() +{ + std::map::const_iterator aFiltersIt = + mySelectionFilters.begin(); + for (; aFiltersIt != mySelectionFilters.end(); aFiltersIt++) { + Handle(SelectMgr_Filter) aFilter = aFiltersIt->second; + if (!aFilter.IsNull()) + aFilter.Nullify(); + } +} + + void ModuleBase_IModule::launchModal(const QString& theCmdId) { bool isCommitted; @@ -88,8 +117,7 @@ void ModuleBase_IModule::launchOperation(const QString& theCmdId, ModuleBase_OperationFeature* aCurOperation = dynamic_cast (myWorkshop->currentOperation()); - QString anOperationKind = aCurOperation ? aCurOperation->getDescription()->operationId() : ""; - + QString aCurOperationKind = aCurOperation ? aCurOperation->getDescription()->operationId() : ""; bool isCommitted; if (!myWorkshop->canStartOperation(theCmdId, isCommitted)) @@ -106,9 +134,10 @@ void ModuleBase_IModule::launchOperation(const QString& theCmdId, if (aMessage.get()) { setReentrantPreSelection(aMessage); } - else if (anOperationKind == theCmdId) // restore of selection only if the kind is the same + 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) { @@ -130,9 +159,9 @@ void ModuleBase_IModule::launchOperation(const QString& theCmdId, } } -Handle(AIS_InteractiveObject) ModuleBase_IModule::createPresentation(const ResultPtr& theResult) +AISObjectPtr ModuleBase_IModule::createPresentation(const ObjectPtr& theResult) { - return Handle(AIS_InteractiveObject)(); + return AISObjectPtr(); } bool ModuleBase_IModule::canBeShaded(Handle(AIS_InteractiveObject) theAIS) const @@ -157,13 +186,6 @@ ModuleBase_Operation* ModuleBase_IModule::getNewOperation(const std::string& the return new ModuleBase_OperationFeature(theFeatureId.c_str(), this); } -bool ModuleBase_IModule::customizeObject(ObjectPtr theObject, - const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, - const bool theUpdateViewer) -{ - return false; -} - ModuleBase_Operation* ModuleBase_IModule::createOperation(const std::string& theFeatureId) { ModuleBase_OperationFeature* aFOperation = dynamic_cast @@ -215,6 +237,23 @@ bool ModuleBase_IModule::canDisplayObject(const ObjectPtr& theObject) const 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(); @@ -248,7 +287,6 @@ void ModuleBase_IModule::onFeatureTriggered() launchModal(aCmdId); } else { launchOperation(aCmdId, false); - emit operationLaunched(); } } } @@ -290,3 +328,35 @@ void ModuleBase_IModule::getXMLRepresentation(const std::string& theFeatureId, theXmlCfg = aWdgReader.featureWidgetCfg(theFeatureId); theDescription = aWdgReader.featureDescription(theFeatureId); } + + +//****************************************************** +QIntList ModuleBase_IModule::selectionFilters() +{ + QIntList aTypes; + + std::map::const_iterator aFiltersIt = + mySelectionFilters.begin(); + for (; aFiltersIt != mySelectionFilters.end(); aFiltersIt++) + aTypes.append(aFiltersIt->first); + + return aTypes; +} + +//****************************************************** +void ModuleBase_IModule::registerSelectionFilter(const ModuleBase_SelectionFilterType theFilterType, + const Handle(SelectMgr_Filter)& theFilter) +{ + mySelectionFilters[theFilterType] = theFilter; +} + +//****************************************************** +Handle(SelectMgr_Filter) ModuleBase_IModule::selectionFilter(const int theType) +{ + ModuleBase_SelectionFilterType aType = (ModuleBase_SelectionFilterType)theType; + + if (mySelectionFilters.find(aType) != mySelectionFilters.end()) + return mySelectionFilters[aType]; + else + return Handle(SelectMgr_Filter)(); +}