X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=c74b323b83b6f038769f71032f5418ff79a0c24e;hb=acaa4d04df93d44ed6c093584aa7de2f7f86b5e3;hp=9d74cc2fb48bb08f67d546bcf00611bf0389cf2b;hpb=ce9008bdda3fa14d6fa6c61360541249ccf43ce0;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index 9d74cc2fb..c74b323b8 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -196,20 +196,18 @@ void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool/* theValid*/) } //******************************************************************** -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(); @@ -230,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, GeomShapePtr()); - 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; } @@ -259,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 = @@ -276,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(); } //******************************************************************** @@ -334,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(); } //********************************************************************