X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=40518a2ca9dcfc573c8af708a769180f931f51dd;hb=7d764bc51fb4ba0527f224e6ea6fb4898da82502;hp=d3dffd6a29e8c1cf33db354131fb94546e1985e8;hpb=6e45dba1824687e1b582356e93c96a4ce6a643e9;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index d3dffd6a2..40518a2ca 100755 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -14,11 +14,13 @@ #include #include #include +#include #include #include #include #include +#include #include @@ -37,6 +39,8 @@ #include #include +const int ATTRIBUTE_SELECTION_INDEX_ROLE = Qt::UserRole + 1; + /** * Customization of a List Widget to make it to be placed on full width of container */ @@ -61,7 +65,7 @@ public: /// Redefinition of virtual method virtual QSize minimumSizeHint() const { - int aHeight = 2*QFontMetrics( font() ).height(); + int aHeight = 4/*2*/*QFontMetrics( font() ).height(); QSize aSize = QListWidget::minimumSizeHint(); return QSize( aSize.width(), aHeight ); } @@ -124,7 +128,13 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen aMainLay->setColumnStretch(2, 1); } + QString aToolTip = QString::fromStdString(theData->widgetTooltip()); myListControl = new CustomListWidget(this); + QString anObjName = QString::fromStdString(attributeID()); + myListControl->setObjectName(anObjName); + myListControl->setToolTip(aToolTip); + myListControl->setSelectionMode(QAbstractItemView::ExtendedSelection); + aMainLay->addWidget(myListControl, 2, 0, 1, -1); aMainLay->setRowStretch(2, 1); //aMainLay->addWidget(new QLabel(this)); //FIXME(sbh)??? @@ -137,6 +147,12 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen myCopyAction->setEnabled(false); connect(myCopyAction, SIGNAL(triggered(bool)), SLOT(onCopyItem())); myListControl->addAction(myCopyAction); + + myDeleteAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); + myDeleteAction->setEnabled(false); + connect(myDeleteAction, SIGNAL(triggered(bool)), SLOT(onDeleteItem())); + myListControl->addAction(myDeleteAction); + myListControl->setContextMenuPolicy(Qt::ActionsContextMenu); connect(myListControl, SIGNAL(itemSelectionChanged()), SLOT(onListSelection())); } @@ -145,6 +161,23 @@ ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector() { } +//******************************************************************** +void ModuleBase_WidgetMultiSelector::activateCustom() +{ + ModuleBase_WidgetSelector::activateCustom(); + + myWorkshop->module()->activateCustomPrs(myFeature, + ModuleBase_IModule::CustomizeHighlightedObjects, true); +} + +//******************************************************************** +void ModuleBase_WidgetMultiSelector::deactivate() +{ + ModuleBase_WidgetSelector::deactivate(); + + myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true); +} + //******************************************************************** bool ModuleBase_WidgetMultiSelector::storeValueCustom() const { @@ -153,11 +186,13 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom() const if (!myFeature) return false; - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { - aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); - } - return true; + 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()); + } + return true; } //******************************************************************** @@ -167,11 +202,14 @@ bool ModuleBase_WidgetMultiSelector::restoreValueCustom() if (!myFeature) return false; - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { + AttributePtr anAttribute = myFeature->data()->attribute(attributeID()); + std::string aType = anAttribute->attributeType(); + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); // Restore shape type - if (!aSelectionListAttr->selectionType().empty()) - setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionListAttr->selectionType().c_str())); + std::string aSelectionType = aSelectionListAttr->selectionType().c_str(); + if (!aSelectionType.empty()) + setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionType.c_str())); } updateSelectionList(); return true; @@ -182,15 +220,22 @@ void ModuleBase_WidgetMultiSelector::storeAttributeValue() { ModuleBase_WidgetValidated::storeAttributeValue(); - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { + 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 { - AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID()); + 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(); + } } //******************************************************************** @@ -198,9 +243,11 @@ void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool theValid) { ModuleBase_WidgetValidated::restoreAttributeValue(theValid); - // Store shape type - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { + 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 @@ -208,24 +255,19 @@ void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool theValid) for (int i = 0; i < aCountAppened; i++) aSelectionListAttr->removeLast(); } - else { - AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID()); + 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(); } -} - -//******************************************************************** -void ModuleBase_WidgetMultiSelector::clearAttribute() -{ - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) - aSelectionListAttr->clear(); - else { - AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID()); - aRefListAttr->clear(); + 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(); } } @@ -233,14 +275,32 @@ void ModuleBase_WidgetMultiSelector::clearAttribute() void ModuleBase_WidgetMultiSelector::setObject(ObjectPtr theSelectedObject, GeomShapePtr theShape) { - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { + 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); - aSelectionListAttr->append(aResult, theShape, myIsInValidate); + if (!aSelectionListAttr->isInList(aResult, theShape, myIsInValidate)) + aSelectionListAttr->append(aResult, theShape, myIsInValidate); } - else { - AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID()); - aRefListAttr->append(theSelectedObject); + 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); + } } } @@ -250,6 +310,10 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList& t { QList aSkippedValues; + /// remove unused objects from the model attribute. + /// It should be performed before new attributes append. + removeUnusedAttributeObjects(theValues); + QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); bool isDone = false; for (; anIt != aLast; anIt++) { @@ -270,6 +334,7 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList& t // this emit is necessary to call store/restore method an restore type of selection //emit valuesChanged(); //} + theValues.clear(); if (!aSkippedValues.empty()) theValues.append(aSkippedValues); @@ -277,6 +342,15 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList& t return isDone; } +//******************************************************************** +void ModuleBase_WidgetMultiSelector::getHighlighted(QList& theValues) +{ + std::set anAttributeIds; + getSelectedAttributeIndices(anAttributeIds); + if (!anAttributeIds.empty()) + convertIndicesToViewerSelection(anAttributeIds, theValues); +} + //******************************************************************** bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) { @@ -304,6 +378,45 @@ bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_Vie return aValid; } +//******************************************************************** +bool ModuleBase_WidgetMultiSelector::processDelete() +{ + // find attribute indices to delete + std::set anAttributeIds; + getSelectedAttributeIndices(anAttributeIds); + + // refill attribute by the items which indices are not in the list of ids + bool aDone = false; + DataPtr aData = myFeature->data(); + AttributePtr anAttribute = aData->attribute(attributeID()); + std::string aType = anAttribute->attributeType(); + aDone = !anAttributeIds.empty(); + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); + aSelectionListAttr->remove(anAttributeIds); + + } + else if (aType == ModelAPI_AttributeRefList::typeId()) { + AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); + aRefListAttr->remove(anAttributeIds); + } + else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { + AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); + aRefAttrListAttr->remove(anAttributeIds); + } + + if (aDone) { + // 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()); + } + return aDone; +} + //******************************************************************** QList ModuleBase_WidgetMultiSelector::getControls() const { @@ -329,7 +442,8 @@ void ModuleBase_WidgetMultiSelector::updateFocus() // 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); - myListControl->setFocus(); + ModuleBase_Tools::setFocus(myListControl, + "ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()"); } //******************************************************************** @@ -365,12 +479,12 @@ void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum aShapeTypeName = myTypeCombo->itemText(idx); TopAbs_ShapeEnum aRefType = ModuleBase_Tools::shapeType(aShapeTypeName); if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) { - activateSelectionAndFilters(false); + bool aWasActivated = activateSelectionAndFilters(false); bool isBlocked = myTypeCombo->blockSignals(true); myTypeCombo->setCurrentIndex(idx); myTypeCombo->blockSignals(isBlocked); - - activateSelectionAndFilters(true); + if (aWasActivated) + activateSelectionAndFilters(true); break; } } @@ -379,35 +493,7 @@ void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum QList ModuleBase_WidgetMultiSelector::getAttributeSelection() const { QList aSelected; - // Restore selection in the viewer by the attribute selection list - if(myFeature) { - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { - for (int i = 0; i < aSelectionListAttr->size(); i++) { - AttributeSelectionPtr anAttr = aSelectionListAttr->value(i); - ResultPtr anObject = anAttr->context(); - if (anObject.get()) { - TopoDS_Shape aShape; - std::shared_ptr aShapePtr = anAttr->value(); - if (aShapePtr.get()) { - aShape = aShapePtr->impl(); - } - aSelected.append(ModuleBase_ViewerPrs(anObject, aShape, NULL)); - } - } - } - else { - AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID()); - if (aRefListAttr.get()) { - for (int i = 0; i < aRefListAttr->size(); i++) { - ObjectPtr anObject = aRefListAttr->object(i); - if (anObject.get()) { - aSelected.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); - } - } - } - } - } + convertIndicesToViewerSelection(std::set(), aSelected); return aSelected; } @@ -416,21 +502,51 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList() { myListControl->clear(); - AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - if (aSelectionListAttr.get()) { + DataPtr aData = myFeature->data(); + AttributePtr anAttribute = aData->attribute(attributeID()); + std::string aType = anAttribute->attributeType(); + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); for (int i = 0; i < aSelectionListAttr->size(); i++) { AttributeSelectionPtr aAttr = aSelectionListAttr->value(i); - myListControl->addItem(aAttr->namingName().c_str()); + QListWidgetItem* anItem = new QListWidgetItem(aAttr->namingName().c_str(), myListControl); + anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i); + myListControl->addItem(anItem); } } - else { - AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID()); + else if (aType == ModelAPI_AttributeRefList::typeId()) { + AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); for (int i = 0; i < aRefListAttr->size(); i++) { ObjectPtr anObject = aRefListAttr->object(i); - if (anObject.get()) - myListControl->addItem(anObject->data()->name().c_str()); + if (anObject.get()) { + QListWidgetItem* anItem = new QListWidgetItem(anObject->data()->name().c_str(), + myListControl); + anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i); + myListControl->addItem(anItem); + } } } + else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { + AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); + for (int i = 0; i < aRefAttrListAttr->size(); i++) { + AttributePtr anAttribute = aRefAttrListAttr->attribute(i); + QString aName; + if (anAttribute.get()) { + std::string anAttrName = generateName(anAttribute, myWorkshop); + aName = QString::fromStdString(anAttrName); + } + else { + ObjectPtr anObject = aRefAttrListAttr->object(i); + if (anObject.get()) { + aName = anObject->data()->name().c_str(); + } + } + QListWidgetItem* anItem = new QListWidgetItem(aName, myListControl); + anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i); + myListControl->addItem(anItem); + } + } + // We have to call repaint because sometimes the List control is not updated myListControl->repaint(); } @@ -468,9 +584,198 @@ void ModuleBase_WidgetMultiSelector::onCopyItem() } } +//******************************************************************** +void ModuleBase_WidgetMultiSelector::onDeleteItem() +{ + processDelete(); +} + //******************************************************************** void ModuleBase_WidgetMultiSelector::onListSelection() { QList aItems = myListControl->selectedItems(); myCopyAction->setEnabled(!aItems.isEmpty()); + myDeleteAction->setEnabled(!aItems.isEmpty()); + + myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects, + true); +} + +//******************************************************************** +void ModuleBase_WidgetMultiSelector::getSelectedAttributeIndices(std::set& theAttributeIds) +{ + QList aItems = myListControl->selectedItems(); + foreach(QListWidgetItem* anItem, aItems) { + int anIndex = anItem->data(ATTRIBUTE_SELECTION_INDEX_ROLE).toInt(); + if (theAttributeIds.find(anIndex) == theAttributeIds.end()) + theAttributeIds.insert(anIndex); + } +} + +void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set theAttributeIds, + QList& theValues) const +{ + if(myFeature.get() == NULL) + return; + + DataPtr aData = myFeature->data(); + AttributePtr anAttribute = aData->attribute(attributeID()); + std::string aType = anAttribute->attributeType(); + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); + for (int i = 0; i < aSelectionListAttr->size(); i++) { + // filter by attribute indices only if the container is not empty otherwise return all items + if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end()) + continue; + AttributeSelectionPtr anAttr = aSelectionListAttr->value(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)); + } + } + } + else if (aType == ModelAPI_AttributeRefList::typeId()) { + AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); + for (int i = 0; i < aRefListAttr->size(); i++) { + // filter by attribute indices only if the container is not empty otherwise return all items + if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end()) + continue; + ObjectPtr anObject = aRefListAttr->object(i); + if (anObject.get()) { + theValues.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); + } + } + } + else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { + AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); + for (int i = 0; i < aRefAttrListAttr->size(); i++) { + // filter by attribute indices only if the container is not empty otherwise return all items + if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end()) + continue; + ObjectPtr anObject = aRefAttrListAttr->object(i); + if (!anObject.get()) + continue; + TopoDS_Shape aShape; + AttributePtr anAttribute = aRefAttrListAttr->attribute(i); + if (anAttribute.get()) { + GeomShapePtr aGeomShape = myWorkshop->module()->findShape(anAttribute); + if (aGeomShape.get()) { + aShape = aGeomShape->impl(); + } + theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL)); + } + } + } +} + +void ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects + (QList& theValues) +{ + std::map > aGeomSelection = convertSelection(theValues); + DataPtr aData = myFeature->data(); + AttributePtr anAttribute = aData->attribute(attributeID()); + std::string aType = anAttribute->attributeType(); + std::set aShapes; + std::set anIndicesToBeRemoved; + if (aType == ModelAPI_AttributeSelectionList::typeId()) { + // iteration through data model to find not selected elements to remove them + AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); + for (int i = 0; i < aSelectionListAttr->size(); i++) { + AttributeSelectionPtr anAttr = aSelectionListAttr->value(i); + bool aFound = findInSelection(anAttr->context(), anAttr->value(), aGeomSelection); + if (!aFound) + anIndicesToBeRemoved.insert(i); + } + aSelectionListAttr->remove(anIndicesToBeRemoved); + } + else if (aType == ModelAPI_AttributeRefList::typeId()) { + AttributeRefListPtr aRefListAttr = aData->reflist(attributeID()); + for (int i = 0; i < aRefListAttr->size(); i++) { + ObjectPtr anObject = aRefListAttr->object(i); + if (anObject.get()) { + bool aFound = findInSelection(anObject, GeomShapePtr(), aGeomSelection); + if (!aFound) + anIndicesToBeRemoved.insert(i); + } + } + aRefListAttr->remove(anIndicesToBeRemoved); + } + else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { + std::set anAttributes; + QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); + ObjectPtr anObject; + GeomShapePtr aShape; + for (; anIt != aLast; anIt++) { + ModuleBase_ViewerPrs aPrs = *anIt; + getGeomSelection(aPrs, anObject, aShape); + AttributePtr anAttr = myWorkshop->module()->findAttribute(anObject, aShape); + if (anAttr.get() && anAttributes.find(anAttr) == anAttributes.end()) + anAttributes.insert(anAttr); + } + + AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); + for (int i = 0; i < aRefAttrListAttr->size(); i++) { + bool aFound = false; + if (aRefAttrListAttr->isAttribute(i)) { + AttributePtr anAttribute = aRefAttrListAttr->attribute(i); + aFound = anAttributes.find(anAttribute) != anAttributes.end(); + } + else { + aFound = findInSelection(aRefAttrListAttr->object(i), GeomShapePtr(), aGeomSelection); + } + if (!aFound) + anIndicesToBeRemoved.insert(i); + } + aRefAttrListAttr->remove(anIndicesToBeRemoved); + } +} + +std::map > ModuleBase_WidgetMultiSelector::convertSelection + (QList& theValues) +{ + // convert prs list to objects map + std::map > aGeomSelection; + std::set aShapes; + 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; + getGeomSelection(aPrs, anObject, aShape); + aShapes.clear(); + if (aGeomSelection.find(anObject) != aGeomSelection.end()) // found + aShapes = aGeomSelection[anObject]; + // we need to know if there was an empty shape in selection for the object + if (!aShape.get()) + aShape = anEmptyShape; + if (aShape.get() && aShapes.find(aShape) == aShapes.end()) // not found + aShapes.insert(aShape); + aGeomSelection[anObject] = aShapes; + } + return aGeomSelection; +} + +bool ModuleBase_WidgetMultiSelector::findInSelection(const ObjectPtr& theObject, + const GeomShapePtr& theShape, + const std::map >& theGeomSelection) +{ + bool aFound = false; + GeomShapePtr anEmptyShape(new GeomAPI_Shape()); + GeomShapePtr aShape = theShape.get() ? theShape : anEmptyShape; + if (theGeomSelection.find(theObject) != theGeomSelection.end()) {// found + const std::set& aShapes = theGeomSelection.at(theObject); + std::set::const_iterator anIt = aShapes.begin(), aLast = aShapes.end(); + for (; anIt != aLast && !aFound; anIt++) { + GeomShapePtr aCShape = *anIt; + if (aCShape.get()) + aFound = aCShape->isEqual(aShape); + } + } + return aFound; }