Salome HOME
registerNotObligatory is not necessary if this property is set in XML.
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetMultiSelector.cpp
index 03d584fc76dc8018bf3b6750c85ca4ce148bfc17..9acca5255469efb03ff16b333712b22663b630ca 100755 (executable)
@@ -20,6 +20,7 @@
 #include <ModelAPI_Object.h>
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_AttributeRefList.h>
+#include <ModelAPI_AttributeRefAttrList.h>
 
 #include <Config_WidgetAPI.h>
 
@@ -185,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;
 }
 
 //********************************************************************
@@ -199,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;
@@ -214,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();
+  }
 }
 
 //********************************************************************
@@ -230,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
@@ -240,40 +255,67 @@ 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();
   }
+  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::clearAttribute()
 {
-  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->clear();
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+  }
+  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();
+  }
 }
 
 //********************************************************************
 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<ModelAPI_Result>(theSelectedObject);
     aSelectionListAttr->append(aResult, theShape, myIsInValidate);
   }
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+  else if (aType == ModelAPI_AttributeRefList::typeId()) {
+    AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
     aRefListAttr->append(theSelectedObject);
   }
+  else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+    AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+
+    AttributePtr anAttribute = myWorkshop->module()->findAttribute(theSelectedObject, theShape);
+    if (anAttribute.get())
+      aRefAttrListAttr->append(anAttribute);
+    else
+      aRefAttrListAttr->append(theSelectedObject);
+  }
 }
 
 //********************************************************************
@@ -354,18 +396,24 @@ bool ModuleBase_WidgetMultiSelector::processDelete()
 
   // refill attribute by the items which indices are not in the list of ids
   bool aDone = false;
-  AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
-  if (aSelectionListAttr.get()) {
-    aDone = !anAttributeIds.empty();
+  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 {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
-    if (aRefListAttr.get()) {
-      aDone = !anAttributeIds.empty();
-      aRefListAttr->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
@@ -463,8 +511,11 @@ 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);
       QListWidgetItem* anItem = new QListWidgetItem(aAttr->namingName().c_str(), myListControl);
@@ -472,8 +523,8 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
       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()) {
@@ -484,6 +535,27 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
       }
     }
   }
+  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();
 }
@@ -554,8 +626,12 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set<in
 {
   if(myFeature.get() == NULL)
     return;
-  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++) {
       // filter by attribute indices only if the container is not empty otherwise return all items
       if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
@@ -572,17 +648,35 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set<in
       }
     }
   }
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
-    if (aRefListAttr.get()) {
-      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_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<TopoDS_Shape>();
         }
+        theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
       }
     }
   }