X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetValidated.cpp;h=55abdb5035e40020379be97f8b0697d81c85d337;hb=ed4a3feb663344c4a785133c5f025a2687192c6d;hp=619548f39916c93f810f1eee8a1267d93794de66;hpb=5bce2e602b6e47f3a56f9e0886baca1703342d2a;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetValidated.cpp b/src/ModuleBase/ModuleBase_WidgetValidated.cpp index 619548f39..55abdb503 100644 --- a/src/ModuleBase/ModuleBase_WidgetValidated.cpp +++ b/src/ModuleBase/ModuleBase_WidgetValidated.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D #include #include @@ -12,15 +12,20 @@ #include #include +#include #include #include +//#define DEBUG_VALID_STATE + ModuleBase_WidgetValidated::ModuleBase_WidgetValidated(QWidget* theParent, + ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, const std::string& theParentId) - : ModuleBase_ModelWidget(theParent, theData, theParentId) +: ModuleBase_ModelWidget(theParent, theData, theParentId), + myWorkshop(theWorkshop), myIsInValidate(false) { } @@ -29,26 +34,108 @@ ModuleBase_WidgetValidated::~ModuleBase_WidgetValidated() } //******************************************************************** -bool ModuleBase_WidgetValidated::setSelection(const QList& theValues, int& thePosition) +bool ModuleBase_WidgetValidated::setSelection(QList& theValues, + const bool theToValidate) { - if (thePosition < 0 || thePosition >= theValues.size()) + if (theValues.empty()) return false; - ModuleBase_ViewerPrs aValue = theValues[thePosition]; - thePosition++; - + // it removes the processed value from the parameters list + ModuleBase_ViewerPrs aValue = theValues.takeFirst(); bool isDone = false; - if (isValidSelection(aValue)) { + if (!theToValidate || isValidInFilters(aValue)) { isDone = setSelectionCustom(aValue); - updateObject(myFeature); - emit valuesChanged(); + // updateObject - to update/redisplay feature + // it is commented in order to perfom it outside the method + //updateObject(myFeature); + // to storeValue() + //emit valuesChanged(); } return isDone; } +//******************************************************************** +ObjectPtr ModuleBase_WidgetValidated::findPresentedObject(const AISObjectPtr& theAIS) const +{ + return myPresentedObject; +} + +//******************************************************************** +void ModuleBase_WidgetValidated::storeAttributeValue() +{ + myIsInValidate = true; +} + +//******************************************************************** +void ModuleBase_WidgetValidated::restoreAttributeValue(const bool theValid) +{ + myIsInValidate = false; +} + +//******************************************************************** +bool ModuleBase_WidgetValidated::isValidInFilters(const ModuleBase_ViewerPrs& thePrs) +{ + bool aValid = true; + Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner(); + + // if an owner is null, the selection happens in the Object browser. + // creates a selection owner on the base of object shape and the object AIS object + if (anOwner.IsNull() && thePrs.owner().IsNull() && thePrs.object().get()) { + ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); + if (aResult.get() && aResult->shape().get()) { + // some results have no shape, e.g. the parameter one. So, they should not be validated + GeomShapePtr aShape = aResult->shape(); + const TopoDS_Shape aTDShape = aShape->impl(); + Handle(AIS_InteractiveObject) anIO = myWorkshop->selection()->getIO(thePrs); + anOwner = new StdSelect_BRepOwner(aTDShape, anIO); + myPresentedObject = aResult; + } + else + aValid = false; // only results with a shape can be filtered + } + // checks the owner by the AIS context activated filters + if (!anOwner.IsNull()) { + // the widget validator filter should be active, but during check by preselection + // it is not yet activated, so we need to activate/deactivate it manually + bool isActivated = isFilterActivated(); + if (!isActivated) + activateFilters(true); + + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (!aContext.IsNull()) { + const SelectMgr_ListOfFilter& aFilters = aContext->Filters(); + SelectMgr_ListIteratorOfListOfFilter anIt(aFilters); + for (; anIt.More() && aValid; anIt.Next()) { + Handle(SelectMgr_Filter) aFilter = anIt.Value(); + aValid = aFilter->IsOk(anOwner); + } + } + if (!isActivated) + activateFilters(false); + } + + // removes created owner + if (!anOwner.IsNull() && anOwner != thePrs.owner()) { + anOwner.Nullify(); + myPresentedObject = ObjectPtr(); + } + return aValid; +} + //******************************************************************** bool ModuleBase_WidgetValidated::isValidSelection(const ModuleBase_ViewerPrs& theValue) { + bool aValid = false; + if (getValidState(theValue, aValid)) { + return aValid; + } + + aValid = isValidSelectionCustom(theValue); + if (!aValid) { + storeValidState(theValue, aValid); + return aValid; + } + DataPtr aData = myFeature->data(); AttributePtr anAttribute = myFeature->attribute(attributeID()); @@ -56,15 +143,14 @@ bool ModuleBase_WidgetValidated::isValidSelection(const ModuleBase_ViewerPrs& th Events_Loop* aLoop = Events_Loop::loop(); // blocks the flush signals to avoid the temporary objects visualization in the viewer // they should not be shown in order to do not lose highlight by erasing them - aLoop->activateFlushes(false); + bool isActive = aLoop->activateFlushes(false); aData->blockSendAttributeUpdated(true); bool isAttributeBlocked = anAttribute->blockSetInitialized(true); storeAttributeValue(); // saves the owner value to the widget attribute - bool aValid = setSelectionCustom(theValue); - + aValid = setSelectionCustom(theValue); if (aValid) // checks the attribute validity aValid = isValidAttribute(); @@ -73,7 +159,7 @@ bool ModuleBase_WidgetValidated::isValidSelection(const ModuleBase_ViewerPrs& th restoreAttributeValue(aValid); aData->blockSendAttributeUpdated(false); anAttribute->blockSetInitialized(isAttributeBlocked); - aLoop->activateFlushes(true); + aLoop->activateFlushes(isActive); // In particular case the results are deleted and called as redisplayed inside of this // highlight-selection, to they must be flushed as soon as possible. @@ -85,65 +171,128 @@ bool ModuleBase_WidgetValidated::isValidSelection(const ModuleBase_ViewerPrs& th aLoop->flush(aDeletedEvent); aLoop->flush(aRedispEvent); + storeValidState(theValue, aValid); return aValid; } +//******************************************************************** +bool ModuleBase_WidgetValidated::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +{ + return true; +} + //******************************************************************** bool ModuleBase_WidgetValidated::isValidAttribute() const { SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - std::list aValidators; - std::list > anArguments; - aFactory->validators(myFeature->getKind(), attributeID(), aValidators, anArguments); + AttributePtr anAttribute = myFeature->attribute(attributeID()); + std::string aValidatorID, anError; + return aFactory->validate(anAttribute, aValidatorID, anError); +} - customValidators(aValidators, anArguments); +bool ModuleBase_WidgetValidated::isFilterActivated() const +{ + bool isActivated = false; - DataPtr aData = myFeature->data(); - AttributePtr anAttribute = myFeature->attribute(attributeID()); + Handle(SelectMgr_Filter) aSelFilter = myWorkshop->validatorFilter(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); - std::list::iterator aValidator = aValidators.begin(); - std::list >::iterator aArgs = anArguments.begin(); - bool aValid = true; - for (; aValidator != aValidators.end() && aValid; aValidator++, aArgs++) { - const ModelAPI_AttributeValidator* aAttrValidator = - dynamic_cast(*aValidator); - if (aAttrValidator) { - aValid = aAttrValidator->isValid(anAttribute, *aArgs); - } - } - return aValid; + return aViewer->hasSelectionFilter(aSelFilter); } -void ModuleBase_WidgetValidated::activateFilters(ModuleBase_IWorkshop* theWorkshop, - const bool toActivate) const +void ModuleBase_WidgetValidated::activateFilters(const bool toActivate) { - ModuleBase_IViewer* aViewer = theWorkshop->viewer(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); - Handle(SelectMgr_Filter) aSelFilter = theWorkshop->validatorFilter(); + Handle(SelectMgr_Filter) aSelFilter = myWorkshop->validatorFilter(); if (toActivate) aViewer->addSelectionFilter(aSelFilter); - else + else { aViewer->removeSelectionFilter(aSelFilter); + clearValidState(); + } } -void ModuleBase_WidgetValidated::customValidators(std::list& theValidators, - std::list >& theArguments) const +//******************************************************************** +void ModuleBase_WidgetValidated::storeValidState(const ModuleBase_ViewerPrs& theValue, const bool theValid) { + bool aValidPrs = myInvalidPrs.contains(theValue); + bool anInvalidPrs = myInvalidPrs.contains(theValue); + + if (theValid) { + if (!aValidPrs) + myValidPrs.append(theValue); + // the commented code will be useful when the valid state of the presentation + // will be changable between activate/deactivate. Currently it does not happen. + //if (anInvalidPrs) + // myInvalidPrs.removeOne(theValue); + } + else { // !theValid + if (!anInvalidPrs) + myInvalidPrs.append(theValue); + //if (!aValidPrs) + // myValidPrs.removeOne(theValue); + } +#ifdef DEBUG_VALID_STATE + qDebug(QString("storeValidState: myValidPrs.size() = %1, myInvalidPrs.size() = %2").arg(myValidPrs.count()) + .arg(myInvalidPrs.count()).toStdString().c_str()); +#endif } -QList ModuleBase_WidgetValidated::getSelectedEntitiesOrObjects( - ModuleBase_ISelection* theSelection) const +//******************************************************************** +bool ModuleBase_WidgetValidated::getValidState(const ModuleBase_ViewerPrs& theValue, bool& theValid) { - QList aSelectedPrs; + bool aValidPrs = myValidPrs.contains(theValue); + bool anInvalidPrs = myInvalidPrs.contains(theValue); + + if (aValidPrs) + theValid = true; + else if (anInvalidPrs) + theValid = false; - // find selected presentation either in the viewer or in OB - // the selection in OCC viewer - the selection of a sub-shapes in the viewer - aSelectedPrs = theSelection->getSelected(); - if (aSelectedPrs.empty()) { - // the selection in Object Browser - QObjectPtrList anObjects = theSelection->selectedObjects(); - aSelectedPrs = ModuleBase_ISelection::getViewerPrs(anObjects); + return aValidPrs || anInvalidPrs; +} + +//******************************************************************** +void ModuleBase_WidgetValidated::clearValidState() +{ +#ifdef DEBUG_VALID_STATE + qDebug("clearValidState"); +#endif + myValidPrs.clear(); + myInvalidPrs.clear(); +} + +//******************************************************************** +QList ModuleBase_WidgetValidated::getFilteredSelected() +{ + QList aSelected = myWorkshop->selection()->getSelected( + ModuleBase_ISelection::Viewer); + + QList anOBSelected = myWorkshop->selection()->getSelected( + ModuleBase_ISelection::Browser); + // filter the OB presentations + filterPresentations(anOBSelected); + if (!anOBSelected.isEmpty()) + ModuleBase_ISelection::appendSelected(anOBSelected, aSelected); + + return aSelected; +} + +//******************************************************************** +void ModuleBase_WidgetValidated::filterPresentations(QList& theValues) +{ + QList aValidatedValues; + + QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); + bool isDone = false; + for (; anIt != aLast; anIt++) { + if (isValidInFilters(*anIt)) + aValidatedValues.append(*anIt); + } + if (aValidatedValues.size() != theValues.size()) { + theValues.clear(); + theValues = aValidatedValues; } - return aSelectedPrs; }