X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=fe5e99ecc75774a09de5d31c28f4b29f7b17edd5;hb=efe17b3c886ebdac71a0090714db258ce15bd45a;hp=40518a2ca9dcfc573c8af708a769180f931f51dd;hpb=25c99292ac7bb39e381dfb486cdaf537ba1820ee;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index 40518a2ca..fe5e99ecc 100755 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -15,12 +15,17 @@ #include #include #include +#include +#include +#include #include #include #include #include #include +#include +#include #include @@ -35,6 +40,7 @@ #include #include #include +#include #include #include @@ -84,10 +90,8 @@ protected: ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, - const Config_WidgetAPI* theData, - const std::string& theParentId) - : ModuleBase_WidgetSelector(theParent, theWorkshop, theData, theParentId), - mySelectionCount(0) + const Config_WidgetAPI* theData) +: ModuleBase_WidgetSelector(theParent, theWorkshop, theData) { QGridLayout* aMainLay = new QGridLayout(this); ModuleBase_Tools::adjustMargins(aMainLay); @@ -102,7 +106,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen QString aTypesStr = aPropertyTypes.c_str(); QStringList aShapeTypes = aTypesStr.split(' ', QString::SkipEmptyParts); - myIsUseChoice = theData->getBooleanAttribute("use_choice", true); + myIsUseChoice = theData->getBooleanAttribute("use_choice", false); if (!aShapeTypes.empty()) myTypeCombo->addItems(aShapeTypes); @@ -113,16 +117,16 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen myTypeCombo->setVisible(false); } - std::string aLabelText = theData->getProperty("label"); - QLabel* aListLabel = new QLabel(!aLabelText.empty() ? aLabelText.c_str() - : tr("Selected objects:"), this); + QString aLabelText = translate(theData->getProperty("label")); + QLabel* aListLabel = new QLabel(aLabelText, this); aMainLay->addWidget(aListLabel, 1, 0); - // if the xml definition contains one type, an information label should be shown near to the latest + // if the xml definition contains one type, an information label + // should be shown near to the latest if (aShapeTypes.size() <= 1) { QString aLabelIcon = QString::fromStdString(theData->widgetIcon()); if (!aLabelIcon.isEmpty()) { QLabel* aSelectedLabel = new QLabel("", this); - aSelectedLabel->setPixmap(QPixmap(aLabelIcon)); + aSelectedLabel->setPixmap(ModuleBase_IconFactory::loadPixmap(aLabelIcon)); aMainLay->addWidget(aSelectedLabel, 1, 1); } aMainLay->setColumnStretch(2, 1); @@ -142,19 +146,21 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen //this->setLayout(aMainLay); connect(myTypeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectionTypeChanged())); - myCopyAction = new QAction(QIcon(":pictures/copy.png"), tr("Copy"), this); + myCopyAction = ModuleBase_Tools::createAction(QIcon(":pictures/copy.png"), tr("Copy"), + myWorkshop->desktop(), this, SLOT(onCopyItem())); myCopyAction->setShortcut(QKeySequence::Copy); myCopyAction->setEnabled(false); - connect(myCopyAction, SIGNAL(triggered(bool)), SLOT(onCopyItem())); myListControl->addAction(myCopyAction); - myDeleteAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); + myDeleteAction = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"), + myWorkshop->desktop(), this, SLOT(onDeleteItem())); myDeleteAction->setEnabled(false); - connect(myDeleteAction, SIGNAL(triggered(bool)), SLOT(onDeleteItem())); myListControl->addAction(myDeleteAction); myListControl->setContextMenuPolicy(Qt::ActionsContextMenu); connect(myListControl, SIGNAL(itemSelectionChanged()), SLOT(onListSelection())); + + myIsNeutralPointClear = theData->getBooleanAttribute("clear_in_neutral_point", true); } ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector() @@ -179,10 +185,10 @@ void ModuleBase_WidgetMultiSelector::deactivate() } //******************************************************************** -bool ModuleBase_WidgetMultiSelector::storeValueCustom() const +bool ModuleBase_WidgetMultiSelector::storeValueCustom() { - // the value is stored on the selection changed signal processing - // A rare case when plugin was not loaded. + // the value is stored on the selection changed signal processing + // A rare case when plugin was not loaded. if (!myFeature) return false; @@ -198,7 +204,7 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom() const //******************************************************************** bool ModuleBase_WidgetMultiSelector::restoreValueCustom() { - // A rare case when plugin was not loaded. + // A rare case when plugin was not loaded. if (!myFeature) return false; @@ -216,114 +222,44 @@ bool ModuleBase_WidgetMultiSelector::restoreValueCustom() } //******************************************************************** -void ModuleBase_WidgetMultiSelector::storeAttributeValue() -{ - ModuleBase_WidgetValidated::storeAttributeValue(); - - DataPtr aData = myFeature->data(); - AttributePtr anAttribute = aData->attribute(attributeID()); - std::string aType = anAttribute->attributeType(); - if (aType == ModelAPI_AttributeSelectionList::typeId()) { - AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); - mySelectionType = aSelectionListAttr->selectionType(); - mySelectionCount = aSelectionListAttr->size(); - } - else if (aType == ModelAPI_AttributeRefList::typeId()) { - AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); - mySelectionCount = aRefListAttr->size(); - } - else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { - AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); - mySelectionCount = aRefAttrListAttr->size(); - } -} - -//******************************************************************** -void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool theValid) -{ - ModuleBase_WidgetValidated::restoreAttributeValue(theValid); - - DataPtr aData = myFeature->data(); - AttributePtr anAttribute = aData->attribute(attributeID()); - std::string aType = anAttribute->attributeType(); - if (aType == ModelAPI_AttributeSelectionList::typeId()) { - AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); - aSelectionListAttr->setSelectionType(mySelectionType); - - // restore selection in the attribute. Indeed there is only one stored object - int aCountAppened = aSelectionListAttr->size() - mySelectionCount; - for (int i = 0; i < aCountAppened; i++) - aSelectionListAttr->removeLast(); - } - else if (aType == ModelAPI_AttributeRefList::typeId()) { - AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); - // restore objects in the attribute. Indeed there is only one stored object - int aCountAppened = aRefListAttr->size() - mySelectionCount; - for (int i = 0; i < aCountAppened; i++) - aRefListAttr->removeLast(); - } - else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { - AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); - // restore objects in the attribute. Indeed there is only one stored object - int aCountAppened = aRefAttrListAttr->size() - mySelectionCount; - for (int i = 0; i < aCountAppened; i++) - aRefAttrListAttr->removeLast(); - } -} - -//******************************************************************** -void ModuleBase_WidgetMultiSelector::setObject(ObjectPtr theSelectedObject, - GeomShapePtr theShape) -{ - DataPtr aData = myFeature->data(); - AttributePtr anAttribute = aData->attribute(attributeID()); - std::string aType = anAttribute->attributeType(); - if (aType == ModelAPI_AttributeSelectionList::typeId()) { - AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); - ResultPtr aResult = std::dynamic_pointer_cast(theSelectedObject); - if (!aSelectionListAttr->isInList(aResult, theShape, myIsInValidate)) - aSelectionListAttr->append(aResult, theShape, myIsInValidate); - } - else if (aType == ModelAPI_AttributeRefList::typeId()) { - AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); - if (!aRefListAttr->isInList(theSelectedObject)) - aRefListAttr->append(theSelectedObject); - } - else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { - AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); - AttributePtr anAttribute = myWorkshop->module()->findAttribute(theSelectedObject, theShape); - - if (anAttribute.get()) { - if (!aRefAttrListAttr->isInList(anAttribute)) - aRefAttrListAttr->append(anAttribute); - } - else { - if (!aRefAttrListAttr->isInList(theSelectedObject)) - aRefAttrListAttr->append(theSelectedObject); - } - } -} - -//******************************************************************** -bool ModuleBase_WidgetMultiSelector::setSelection(QList& theValues, +bool ModuleBase_WidgetMultiSelector::setSelection(QList& theValues, const bool theToValidate) { - QList aSkippedValues; + AttributeSelectionListPtr aSelectionListAttr; + if (attribute()->attributeType() == ModelAPI_AttributeSelectionList::typeId()) + aSelectionListAttr = std::dynamic_pointer_cast(attribute()); + if (aSelectionListAttr.get()) + aSelectionListAttr->cashValues(true); /// remove unused objects from the model attribute. /// It should be performed before new attributes append. - removeUnusedAttributeObjects(theValues); + bool isDone = removeUnusedAttributeObjects(theValues); - QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); - bool isDone = false; + QList anInvalidValues; + QList anAttributeValues; + QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); for (; anIt != aLast; anIt++) { - ModuleBase_ViewerPrs aValue = *anIt; - bool aProcessed = false; - if (!theToValidate || isValidInFilters(aValue)) { - aProcessed = setSelectionCustom(aValue); + ModuleBase_ViewerPrsPtr aValue = *anIt; + // do not validate and append to attribute selection presentation if it exists in the attribute + ObjectPtr anObject; + GeomShapePtr aShape; + getGeomSelection(aValue, anObject, aShape); + if (ModuleBase_Tools::hasObject(attribute(), anObject, aShape, myWorkshop, myIsInValidate)) { + anAttributeValues.append(aValue); + continue; } - else - aSkippedValues.append(aValue); + if (theToValidate && !isValidInFilters(aValue)) + anInvalidValues.append(aValue); + } + bool aHasInvalidValues = anInvalidValues.size() > 0; + + for (anIt = theValues.begin(); anIt != aLast; anIt++) { + ModuleBase_ViewerPrsPtr aValue = *anIt; + bool aProcessed = false; + if ((aHasInvalidValues && anInvalidValues.contains(aValue)) || + anAttributeValues.contains(aValue)) + continue; + aProcessed = setSelectionCustom(aValue); /// it is not optimal as hasObject() is already checked // if there is at least one set, the result is true isDone = isDone || aProcessed; } @@ -335,15 +271,22 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList& t //emit valuesChanged(); //} + if (aSelectionListAttr.get()) + aSelectionListAttr->cashValues(false); + theValues.clear(); - if (!aSkippedValues.empty()) - theValues.append(aSkippedValues); + if (!anInvalidValues.empty()) + theValues.append(anInvalidValues); + + if (isDone) // may be the feature's result is not displayed, but attributes should be + myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments, + true);/// hope that something is redisplayed by object updated return isDone; } //******************************************************************** -void ModuleBase_WidgetMultiSelector::getHighlighted(QList& theValues) +void ModuleBase_WidgetMultiSelector::getHighlighted(QList& theValues) { std::set anAttributeIds; getSelectedAttributeIndices(anAttributeIds); @@ -352,7 +295,7 @@ void ModuleBase_WidgetMultiSelector::getHighlighted(QList& } //******************************************************************** -bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { bool aValid = ModuleBase_WidgetSelector::isValidSelectionCustom(thePrs); if (aValid) { @@ -361,10 +304,11 @@ bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_Vie if (aValid) { if (myFeature) { // We can not select a result of our feature - const std::list& aResList = myFeature->results(); + std::list aResults; + ModelAPI_Tools::allResults(myFeature, aResults); std::list::const_iterator aIt; bool isSkipSelf = false; - for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { if ((*aIt) == aResult) { isSkipSelf = true; break; @@ -385,6 +329,8 @@ bool ModuleBase_WidgetMultiSelector::processDelete() std::set anAttributeIds; getSelectedAttributeIndices(anAttributeIds); + QModelIndexList aIndexes = myListControl->selectionModel()->selectedIndexes(); + // refill attribute by the items which indices are not in the list of ids bool aDone = false; DataPtr aData = myFeature->data(); @@ -413,6 +359,23 @@ bool ModuleBase_WidgetMultiSelector::processDelete() restoreValue(); myWorkshop->setSelected(getAttributeSelection()); + + // may be the feature's result is not displayed, but attributes should be + myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments, + true); /// hope that something is redisplayed by object updated + } + + // Restore selection + int aRows = myListControl->model()->rowCount(); + if (aRows > 0) { + foreach(QModelIndex aIndex, aIndexes) { + if (aIndex.row() < aRows) + myListControl->selectionModel()->select(aIndex, QItemSelectionModel::Select); + else { + QModelIndex aIdx = myListControl->model()->index(aRows - 1, 0); + myListControl->selectionModel()->select(aIdx, QItemSelectionModel::Select); + } + } } return aDone; } @@ -430,16 +393,66 @@ QList ModuleBase_WidgetMultiSelector::getControls() const void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() { activateSelectionAndFilters(true); - QList 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); + + if (!myFeature) + return; + /// store the selected type + AttributePtr anAttribute = myFeature->data()->attribute(attributeID()); + std::string aType = anAttribute->attributeType(); + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); + aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); + } + + // clear attribute values + DataPtr aData = myFeature->data(); + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); + aSelectionListAttr->clear(); + } + else if (aType == ModelAPI_AttributeRefList::typeId()) { + AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); + aRefListAttr->clear(); + } + else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { + AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); + aRefAttrListAttr->clear(); + } + + // update object is necessary to flush update signal. It leads to objects references map update + // and the operation presentation will not contain deleted items visualized as parameters of + // the feature. + updateObject(myFeature); + restoreValue(); + myWorkshop->setSelected(getAttributeSelection()); + // may be the feature's result is not displayed, but attributes should be + myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments, + true); /// hope that something is redisplayed by object updated +} + +//******************************************************************** +void ModuleBase_WidgetMultiSelector::onSelectionChanged() +{ + if (!myIsNeutralPointClear) { + QList aSelected = getFilteredSelected(); + // do not clear selected object + if (aSelected.size() == 0) { + if (!getAttributeSelection().empty()) { + // Restore selection in the viewer by the attribute selection list + // it should be postponed to exit from the selectionChanged processing + static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION); + ModelAPI_EventCreator::get()->sendUpdated(myFeature, anEvent); + Events_Loop::loop()->flush(anEvent); + return; + } + } + } + ModuleBase_WidgetSelector::onSelectionChanged(); } void ModuleBase_WidgetMultiSelector::updateFocus() { - // Set focus to List control in order to make possible + // Set focus to List control in order to make possible // to use Tab key for transfer the focus to next widgets myListControl->setCurrentRow(myListControl->model()->rowCount() - 1); ModuleBase_Tools::setFocus(myListControl, @@ -452,7 +465,7 @@ void ModuleBase_WidgetMultiSelector::updateSelectionName() } //******************************************************************** -QIntList ModuleBase_WidgetMultiSelector::getShapeTypes() const +QIntList ModuleBase_WidgetMultiSelector::shapeTypes() const { QIntList aShapeTypes; @@ -460,24 +473,20 @@ QIntList ModuleBase_WidgetMultiSelector::getShapeTypes() const aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCombo->currentText())); } else { - for (int i = 0, aCount = myTypeCombo->count(); i < aCount; i++) { - TopAbs_ShapeEnum aType = ModuleBase_Tools::shapeType(myTypeCombo->itemText(i)); - aShapeTypes.append(aType); - if (aType == TopAbs_SOLID) - aShapeTypes.append(TopAbs_COMPSOLID); - } + for (int i = 0, aCount = myTypeCombo->count(); i < aCount; i++) + aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCombo->itemText(i))); } return aShapeTypes; } //******************************************************************** -void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum theShapeType) +void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const int theShapeType) { QString aShapeTypeName; - + for (int idx = 0; idx < myTypeCombo->count(); ++idx) { aShapeTypeName = myTypeCombo->itemText(idx); - TopAbs_ShapeEnum aRefType = ModuleBase_Tools::shapeType(aShapeTypeName); + int aRefType = ModuleBase_Tools::shapeType(aShapeTypeName); if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) { bool aWasActivated = activateSelectionAndFilters(false); bool isBlocked = myTypeCombo->blockSignals(true); @@ -490,9 +499,9 @@ void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum } } -QList ModuleBase_WidgetMultiSelector::getAttributeSelection() const +QList ModuleBase_WidgetMultiSelector::getAttributeSelection() const { - QList aSelected; + QList aSelected; convertIndicesToViewerSelection(std::set(), aSelected); return aSelected; } @@ -568,6 +577,21 @@ std::string ModuleBase_WidgetMultiSelector::validatorType(const QString& theType return aType; } +//******************************************************************** +void ModuleBase_WidgetMultiSelector::clearSelection() +{ + bool isClearInNeutralPoint = myIsNeutralPointClear; + myIsNeutralPointClear = true; + + QList 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); + + myIsNeutralPointClear = isClearInNeutralPoint; +} + //******************************************************************** void ModuleBase_WidgetMultiSelector::onCopyItem() { @@ -596,7 +620,7 @@ void ModuleBase_WidgetMultiSelector::onListSelection() QList aItems = myListControl->selectedItems(); myCopyAction->setEnabled(!aItems.isEmpty()); myDeleteAction->setEnabled(!aItems.isEmpty()); - + myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects, true); } @@ -613,7 +637,7 @@ void ModuleBase_WidgetMultiSelector::getSelectedAttributeIndices(std::set& } void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set theAttributeIds, - QList& theValues) const + QList& theValues) const { if(myFeature.get() == NULL) return; @@ -629,14 +653,9 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::setvalue(i); ResultPtr anObject = anAttr->context(); - if (anObject.get()) { - TopoDS_Shape aShape; - std::shared_ptr aShapePtr = anAttr->value(); - if (aShapePtr.get()) { - aShape = aShapePtr->impl(); - } - theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL)); - } + if (anObject.get()) + theValues.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, anAttr->value(), NULL))); } } else if (aType == ModelAPI_AttributeRefList::typeId()) { @@ -647,7 +666,8 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::setobject(i); if (anObject.get()) { - theValues.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); + theValues.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL))); } } } @@ -663,19 +683,19 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::setattribute(i); if (anAttribute.get()) { - GeomShapePtr aGeomShape = myWorkshop->module()->findShape(anAttribute); - if (aGeomShape.get()) { - aShape = aGeomShape->impl(); - } - theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL)); + GeomShapePtr aGeomShape = ModuleBase_Tools::getShape(anAttribute, myWorkshop); + theValues.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, aGeomShape, NULL))); } } } } -void ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects - (QList& theValues) +bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects + (QList& theValues) { + bool isDone = false; + std::map > aGeomSelection = convertSelection(theValues); DataPtr aData = myFeature->data(); AttributePtr anAttribute = aData->attribute(attributeID()); @@ -691,6 +711,7 @@ void ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects if (!aFound) anIndicesToBeRemoved.insert(i); } + isDone = anIndicesToBeRemoved.size() > 0; aSelectionListAttr->remove(anIndicesToBeRemoved); } else if (aType == ModelAPI_AttributeRefList::typeId()) { @@ -703,15 +724,17 @@ void ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects anIndicesToBeRemoved.insert(i); } } + isDone = anIndicesToBeRemoved.size() > 0; aRefListAttr->remove(anIndicesToBeRemoved); } else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { std::set anAttributes; - QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); + QList::const_iterator + anIt = theValues.begin(), aLast = theValues.end(); ObjectPtr anObject; GeomShapePtr aShape; for (; anIt != aLast; anIt++) { - ModuleBase_ViewerPrs aPrs = *anIt; + ModuleBase_ViewerPrsPtr aPrs = *anIt; getGeomSelection(aPrs, anObject, aShape); AttributePtr anAttr = myWorkshop->module()->findAttribute(anObject, aShape); if (anAttr.get() && anAttributes.find(anAttr) == anAttributes.end()) @@ -731,22 +754,25 @@ void ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects if (!aFound) anIndicesToBeRemoved.insert(i); } + isDone = anIndicesToBeRemoved.size() > 0; aRefAttrListAttr->remove(anIndicesToBeRemoved); } + + return isDone; } std::map > ModuleBase_WidgetMultiSelector::convertSelection - (QList& theValues) + (QList& theValues) { // convert prs list to objects map std::map > aGeomSelection; std::set aShapes; - QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); + QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); ObjectPtr anObject; GeomShapePtr aShape; GeomShapePtr anEmptyShape(new GeomAPI_Shape()); for (; anIt != aLast; anIt++) { - ModuleBase_ViewerPrs aPrs = *anIt; + ModuleBase_ViewerPrsPtr aPrs = *anIt; getGeomSelection(aPrs, anObject, aShape); aShapes.clear(); if (aGeomSelection.find(anObject) != aGeomSelection.end()) // found