X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=c74b323b83b6f038769f71032f5418ff79a0c24e;hb=acaa4d04df93d44ed6c093584aa7de2f7f86b5e3;hp=ff8bafdea6a8746a9ca85a9063af9e2cc62cbe73;hpb=f3f60a3cb69f2534a5837cd249782395e5edb183;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index ff8bafdea..c74b323b8 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -159,7 +158,7 @@ bool ModuleBase_WidgetMultiSelector::restoreValue() } //******************************************************************** -void ModuleBase_WidgetMultiSelector::backupAttributeValue(const bool isBackup) +void ModuleBase_WidgetMultiSelector::storeAttributeValue() { DataPtr aData = myFeature->data(); AttributeSelectionListPtr aSelectionListAttr = @@ -167,41 +166,48 @@ void ModuleBase_WidgetMultiSelector::backupAttributeValue(const bool isBackup) if (aSelectionListAttr.get() == NULL) return; - if (isBackup) { - mySelectionType = aSelectionListAttr->selectionType(); - mySelection.clear(); - for (int i = 0; i < aSelectionListAttr->size(); i++) { - AttributeSelectionPtr aSelectAttr = aSelectionListAttr->value(i); - mySelection.append(GeomSelection(aSelectAttr->context(), aSelectAttr->value())); - } + 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())); } - else { - aSelectionListAttr->clear(); - // Store shapes type - aSelectionListAttr->setSelectionType(mySelectionType); +} - // Store selection in the attribute - foreach (GeomSelection aSelec, mySelection) { - aSelectionListAttr->append(aSelec.first, aSelec.second); - } +//******************************************************************** +void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool/* theValid*/) +{ + 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::setSelection(const Handle_SelectMgr_EntityOwner& theOwner) +bool ModuleBase_WidgetMultiSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) { - ModuleBase_ViewerPrs aPrs; - ModuleBase_ISelection* aSelection = myWorkshop->selection(); - aSelection->fillPresentation(aPrs, theOwner); + 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()); + } - const TopoDS_Shape& aTDSShape = aPrs.shape(); - if (aTDSShape.IsNull()) - return false; - GeomShapePtr aShape = std::shared_ptr(new GeomAPI_Shape()); - aShape->setImpl(new TopoDS_Shape(aTDSShape)); - ObjectPtr anObject = aSelection->getSelectableObject(theOwner); - ResultPtr aResult = std::dynamic_pointer_cast(anObject); if (myFeature) { // We can not select a result of our feature const std::list& aResList = myFeature->results(); @@ -222,11 +228,21 @@ bool ModuleBase_WidgetMultiSelector::setSelection(const Handle_SelectMgr_EntityO DataPtr aData = myFeature->data(); AttributeSelectionListPtr aSelectionListAttr = std::dynamic_pointer_cast(aData->attribute(attributeID())); - if (aShape->isEqual(aResult->shape())) - aSelectionListAttr->append(aResult, NULL); - else - aSelectionListAttr->append(aResult, aShape); + 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; } @@ -251,15 +267,16 @@ 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() { - QList aSelected = myWorkshop->selection()->getSelected(); + QList aSelected = getSelectedEntitiesOrObjects(myWorkshop->selection()); DataPtr aData = myFeature->data(); AttributeSelectionListPtr aSelectionListAttr = @@ -268,17 +285,15 @@ void ModuleBase_WidgetMultiSelector::onSelectionChanged() aSelectionListAttr->clear(); if (aSelected.size() > 0) { foreach (ModuleBase_ViewerPrs aPrs, aSelected) { - Handle(SelectMgr_EntityOwner) anOwner = aPrs.owner(); - if (isValid(anOwner)) { - setSelection(anOwner); + if (isValidSelection(aPrs)) { + setSelectionCustom(aPrs); } } } + 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); - - emit valuesChanged(); } //******************************************************************** @@ -311,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); @@ -338,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(); } //********************************************************************