Salome HOME
WidgetMultiSelector preparation to use ModelAPI_AttributeRefAttrList.
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetMultiSelector.cpp
index 714e4ef7f389c06ed7f6e55306d97cb619d0db98..00b13340261664da441ec695877efc0d5a66cfe2 100755 (executable)
@@ -148,7 +148,6 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
   myListControl->addAction(myCopyAction);
 
   myDeleteAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
-  myDeleteAction->setShortcut(QKeySequence::Delete);
   myDeleteAction->setEnabled(false);
   connect(myDeleteAction, SIGNAL(triggered(bool)), SLOT(onDeleteItem()));
   myListControl->addAction(myDeleteAction);
@@ -161,6 +160,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
 {
@@ -169,11 +185,14 @@ 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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
+    aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
+  }
+  return true;
 }
 
 //********************************************************************
@@ -183,11 +202,13 @@ 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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     // Restore shape type
-    if (!aSelectionListAttr->selectionType().empty())
-      setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionListAttr->selectionType().c_str()));
+    setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionListAttr->selectionType().c_str()));
   }
   updateSelectionList();
   return true;
@@ -198,13 +219,17 @@ void ModuleBase_WidgetMultiSelector::storeAttributeValue()
 {
   ModuleBase_WidgetValidated::storeAttributeValue();
 
-  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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     mySelectionType = aSelectionListAttr->selectionType();
     mySelectionCount = aSelectionListAttr->size();
   }
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+  else if (aType == ModelAPI_AttributeRefList::typeId()) {
+    AttributeRefListPtr aRefListAttr =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
     mySelectionCount = aRefListAttr->size();
   }
 }
@@ -214,9 +239,11 @@ void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool theValid)
 {
   ModuleBase_WidgetValidated::restoreAttributeValue(theValid);
 
-  // Store shape type
-  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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     aSelectionListAttr->setSelectionType(mySelectionType);
 
     // restore selection in the attribute. Indeed there is only one stored object
@@ -224,8 +251,9 @@ 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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
     // restore objects in the attribute. Indeed there is only one stored object
     int aCountAppened = aRefListAttr->size() - mySelectionCount;
     for (int i = 0; i < aCountAppened; i++)
@@ -236,11 +264,16 @@ void ModuleBase_WidgetMultiSelector::restoreAttributeValue(bool theValid)
 //********************************************************************
 void ModuleBase_WidgetMultiSelector::clearAttribute()
 {
-  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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     aSelectionListAttr->clear();
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+  }
+  else if (aType == ModelAPI_AttributeRefList::typeId()) {
+    AttributeRefListPtr aRefListAttr =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
     aRefListAttr->clear();
   }
 }
@@ -249,13 +282,17 @@ void ModuleBase_WidgetMultiSelector::clearAttribute()
 void ModuleBase_WidgetMultiSelector::setObject(ObjectPtr theSelectedObject,
                                                GeomShapePtr theShape)
 {
-  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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
     aRefListAttr->append(theSelectedObject);
   }
 }
@@ -329,6 +366,42 @@ bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_Vie
   return aValid;
 }
 
+//********************************************************************
+bool ModuleBase_WidgetMultiSelector::processDelete()
+{
+  // find attribute indices to delete
+  std::set<int> anAttributeIds;
+  getSelectedAttributeIndices(anAttributeIds);
+
+  // refill attribute by the items which indices are not in the list of ids
+  bool aDone = false;
+  AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+  std::string aType = anAttribute->attributeType();
+  if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+    AttributeSelectionListPtr aSelectionListAttr =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
+    aDone = !anAttributeIds.empty();
+    aSelectionListAttr->remove(anAttributeIds);
+
+  }
+  else if (aType == ModelAPI_AttributeRefList::typeId()) {
+    AttributeRefListPtr aRefListAttr =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
+      aDone = !anAttributeIds.empty();
+      aRefListAttr->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<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
 {
@@ -414,8 +487,11 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
 {
   myListControl->clear();
 
-  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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     for (int i = 0; i < aSelectionListAttr->size(); i++) {
       AttributeSelectionPtr aAttr = aSelectionListAttr->value(i);
       QListWidgetItem* anItem = new QListWidgetItem(aAttr->namingName().c_str(), myListControl);
@@ -423,8 +499,9 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
       myListControl->addItem(anItem);
     }
   }
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+  else if (aType == ModelAPI_AttributeRefList::typeId()) {
+    AttributeRefListPtr aRefListAttr =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
     for (int i = 0; i < aRefListAttr->size(); i++) {
       ObjectPtr anObject = aRefListAttr->object(i);
       if (anObject.get()) {
@@ -435,6 +512,7 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
       }
     }
   }
+
   // We have to call repaint because sometimes the List control is not updated
   myListControl->repaint();
 }
@@ -475,30 +553,7 @@ void ModuleBase_WidgetMultiSelector::onCopyItem()
 //********************************************************************
 void ModuleBase_WidgetMultiSelector::onDeleteItem()
 {
-  // find attribute indices to delete
-  std::set<int> anAttributeIds;
-  getSelectedAttributeIndices(anAttributeIds);
-
-  // 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();
-    aSelectionListAttr->remove(anAttributeIds);
-  }
-  else {
-    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
-    if (aRefListAttr.get()) {
-      aDone = !anAttributeIds.empty();
-      aRefListAttr->remove(anAttributeIds);
-    }
-  }
-  if (aDone) {
-    restoreValue();
-    myWorkshop->setSelected(getAttributeSelection());
-
-    myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeAllObjects, true);
-  }
+  processDelete();
 }
 
 //********************************************************************
@@ -528,8 +583,12 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set<in
 {
   if(myFeature.get() == NULL)
     return;
-  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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
     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())
@@ -546,17 +605,16 @@ 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 =
+                 std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
+    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));
       }
     }
   }