X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=c74b323b83b6f038769f71032f5418ff79a0c24e;hb=acaa4d04df93d44ed6c093584aa7de2f7f86b5e3;hp=af08a6533f1042bbe811e5e3c475187167f093fc;hpb=fdf65567341c890ba3d8c18c3d9a8a562e913935;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index af08a6533..c74b323b8 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -121,6 +120,7 @@ void ModuleBase_WidgetMultiSelector::deactivate() //******************************************************************** bool ModuleBase_WidgetMultiSelector::storeValueCustom() const { + // the value is stored on the selection changed signal processing // A rare case when plugin was not loaded. if(!myFeature) return false; @@ -129,20 +129,12 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom() const std::dynamic_pointer_cast(aData->attribute(attributeID())); if (aSelectionListAttr) { - aSelectionListAttr->clear(); // Store shapes type - TopAbs_ShapeEnum aCurrentType = - ModuleBase_WidgetShapeSelector::shapeType(myTypeCombo->currentText()); - aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); - // Store selection in the attribute - foreach (GeomSelection aSelec, mySelection) { - aSelectionListAttr->append(aSelec.first, aSelec.second); - } - //updateSelectionList(aSelectionListAttr); - updateObject(myFeature); - return true; - } - return false; + TopAbs_ShapeEnum aCurrentType = + ModuleBase_WidgetShapeSelector::shapeType(myTypeCombo->currentText()); + aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); + } + return true; } //******************************************************************** @@ -156,15 +148,9 @@ bool ModuleBase_WidgetMultiSelector::restoreValue() std::dynamic_pointer_cast(aData->attribute(attributeID())); if (aSelectionListAttr) { - mySelection.clear(); // Restore shape type setCurrentShapeType( - ModuleBase_WidgetShapeSelector::shapeType(aSelectionListAttr->selectionType().c_str())); - // Restore selection in the list - for (int i = 0; i < aSelectionListAttr->size(); i++) { - AttributeSelectionPtr aSelectAttr = aSelectionListAttr->value(i); - mySelection.append(GeomSelection(aSelectAttr->context(), aSelectAttr->value())); - } + ModuleBase_WidgetShapeSelector::shapeType(aSelectionListAttr->selectionType().c_str())); updateSelectionList(aSelectionListAttr); return true; } @@ -172,15 +158,92 @@ bool ModuleBase_WidgetMultiSelector::restoreValue() } //******************************************************************** -void ModuleBase_WidgetMultiSelector::backupAttributeValue(const bool isBackup) +void ModuleBase_WidgetMultiSelector::storeAttributeValue() { + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + if (aSelectionListAttr.get() == NULL) + return; + mySelectionType = aSelectionListAttr->selectionType(); + mySelection.clear(); + int aSize = aSelectionListAttr->size(); + for (int i = 0; i < aSelectionListAttr->size(); i++) { + AttributeSelectionPtr aSelectAttr = aSelectionListAttr->value(i); + mySelection.append(GeomSelection(aSelectAttr->context(), aSelectAttr->value())); + } } //******************************************************************** -bool ModuleBase_WidgetMultiSelector::setSelection(const Handle_SelectMgr_EntityOwner& theOwner) +void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool/* theValid*/) { - return false; + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + if (aSelectionListAttr.get() == NULL) + return; + aSelectionListAttr->clear(); + + // Store shapes type + aSelectionListAttr->setSelectionType(mySelectionType); + + // Store selection in the attribute + int aSize = mySelection.size(); + foreach (GeomSelection aSelec, mySelection) { + aSelectionListAttr->append(aSelec.first, aSelec.second); + } +} + +//******************************************************************** +bool ModuleBase_WidgetMultiSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +{ + ResultPtr aResult; + if (!thePrs.owner().IsNull()) { + ObjectPtr anObject = myWorkshop->selection()->getSelectableObject(thePrs.owner()); + aResult = std::dynamic_pointer_cast(anObject); + } + else { + aResult = std::dynamic_pointer_cast(thePrs.object()); + } + + + if (myFeature) { + // We can not select a result of our feature + const std::list& aResList = myFeature->results(); + std::list::const_iterator aIt; + bool isSkipSelf = false; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { + if ((*aIt) == aResult) { + isSkipSelf = true; + break; + } + } + if(isSkipSelf) + return false; + } + + // if the result has the similar shap as the parameter shape, just the context is set to the + // selection list attribute. + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + + const TopoDS_Shape& aTDSShape = thePrs.shape(); + // if only result is selected, an empty shape is set to the model + if (aTDSShape.IsNull()) { + aSelectionListAttr->append(aResult, GeomShapePtr()); + } + else { + GeomShapePtr aShape = std::shared_ptr(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aTDSShape)); + // We can not select a result of our feature + if (aShape->isEqual(aResult->shape())) + aSelectionListAttr->append(aResult, GeomShapePtr()); + else + aSelectionListAttr->append(aResult, aShape); + } + return true; } //******************************************************************** @@ -204,51 +267,33 @@ void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() { activateShapeSelection(); QObjectPtrList anEmptyList; + // This method will call Selection changed event which will call onSelectionChanged + // To clear mySelection, myListControl and storeValue() + // So, we don't need to call it myWorkshop->setSelected(anEmptyList); - // Clear mySelection, myListControl and storeValue() - onSelectionChanged(); } //******************************************************************** void ModuleBase_WidgetMultiSelector::onSelectionChanged() { - ModuleBase_ISelection* aSelection = myWorkshop->selection(); - NCollection_List aSelectedShapes; - std::list aOwnersList; - aSelection->selectedShapes(aSelectedShapes, aOwnersList); + QList aSelected = getSelectedEntitiesOrObjects(myWorkshop->selection()); - mySelection.clear(); - std::list::const_iterator aIt; - NCollection_List::Iterator aShpIt(aSelectedShapes); - GeomShapePtr aShape; - for (aIt = aOwnersList.cbegin(); aIt != aOwnersList.cend(); aShpIt.Next(), aIt++) { - ResultPtr aResult = std::dynamic_pointer_cast(*aIt); - if (myFeature) { - // We can not select a result of our feature - const std::list& aResList = myFeature->results(); - std::list::const_iterator aIt; - bool isSkipSelf = false; - for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { - if ((*aIt) == aResult) { - isSkipSelf = true; - break; - } + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + + aSelectionListAttr->clear(); + if (aSelected.size() > 0) { + foreach (ModuleBase_ViewerPrs aPrs, aSelected) { + if (isValidSelection(aPrs)) { + setSelectionCustom(aPrs); } - if(isSkipSelf) - continue; } - aShape = std::shared_ptr(new GeomAPI_Shape()); - aShape->setImpl(new TopoDS_Shape(aShpIt.Value())); - - // if the result has the similar shap as the parameter shape, just the context is set to the - // selection list attribute. - if (aShape->isEqual(aResult->shape())) - mySelection.append(GeomSelection(aResult, NULL)); - else - mySelection.append(GeomSelection(aResult, aShape)); } - //updateSelectionList(); emit valuesChanged(); + // the updateObject method should be called to flush the updated sigal. The workshop listens it, + // calls validators for the feature and, as a result, updates the Apply button state. + updateObject(myFeature); } //******************************************************************** @@ -281,20 +326,8 @@ void ModuleBase_WidgetMultiSelector::activateShapeSelection() QIntList aList; aList.append(ModuleBase_WidgetShapeSelector::shapeType(aNewType)); myWorkshop->activateSubShapesSelection(aList); - - // it is necessary to filter the selected edges to be non-degenerated - // it is not possible to build naming name for such edges - if (aNewType == "Edges") { - myEdgesTypeFilter = new ModuleBase_FilterNoDegeneratedEdge(); - aViewer->addSelectionFilter(myEdgesTypeFilter); - } - else { - aViewer->removeSelectionFilter(myEdgesTypeFilter); - } - } else { myWorkshop->deactivateSubShapesSelection(); - aViewer->removeSelectionFilter(myEdgesTypeFilter); } activateFilters(myWorkshop, myIsActive); @@ -308,6 +341,8 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList(AttributeSelectionListP AttributeSelectionPtr aAttr = theList->value(i); myListControl->addItem(aAttr->namingName().c_str()); } + // We have to call repaint because sometimes the List control is not updated + myListControl->repaint(); } //********************************************************************