Salome HOME
WidgetMultiSelector preparation to use ModelAPI_AttributeRefAttrList.
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetMultiSelector.cpp
index ffc380878cb756b4f99caada00d4250fdc254ce8..00b13340261664da441ec695877efc0d5a66cfe2 100755 (executable)
@@ -14,6 +14,7 @@
 #include <ModuleBase_IViewer.h>
 #include <ModuleBase_Tools.h>
 #include <ModuleBase_Definitions.h>
+#include <ModuleBase_IModule.h>
 
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Object.h>
@@ -147,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);
@@ -160,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
 {
@@ -168,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;
 }
 
 //********************************************************************
@@ -182,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;
@@ -197,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();
   }
 }
@@ -213,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
@@ -223,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++)
@@ -235,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();
   }
 }
@@ -248,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);
   }
 }
@@ -292,6 +330,15 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList<ModuleBase_ViewerPrs>& t
   return isDone;
 }
 
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::getHighlighted(QList<ModuleBase_ViewerPrs>& theValues)
+{
+  std::set<int> anAttributeIds;
+  getSelectedAttributeIndices(anAttributeIds);
+  if (!anAttributeIds.empty())
+    convertIndicesToViewerSelection(anAttributeIds, theValues);
+}
+
 //********************************************************************
 bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs)
 {
@@ -319,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
 {
@@ -395,35 +478,7 @@ void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum
 QList<ModuleBase_ViewerPrs> ModuleBase_WidgetMultiSelector::getAttributeSelection() const
 {
   QList<ModuleBase_ViewerPrs> 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<GeomAPI_Shape> aShapePtr = anAttr->value();
-          if (aShapePtr.get()) {
-            aShape = aShapePtr->impl<TopoDS_Shape>();
-          }
-          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<int>(), aSelected);
   return aSelected;
 }
 
@@ -432,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);
@@ -441,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()) {
@@ -453,6 +512,7 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
       }
     }
   }
+
   // We have to call repaint because sometimes the List control is not updated
   myListControl->repaint();
 }
@@ -493,32 +553,7 @@ void ModuleBase_WidgetMultiSelector::onCopyItem()
 //********************************************************************
 void ModuleBase_WidgetMultiSelector::onDeleteItem()
 {
-  // find attribute indices to delete
-  QList<QListWidgetItem*> aItems = myListControl->selectedItems();
-  std::set<int> anAttributeIds;
-  foreach(QListWidgetItem* anItem, aItems) {
-    int anIndex = anItem->data(ATTRIBUTE_SELECTION_INDEX_ROLE).toInt();
-    if (anAttributeIds.find(anIndex) == anAttributeIds.end())
-      anAttributeIds.insert(anIndex);
-  }
-  // 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());
-  }
+  processDelete();
 }
 
 //********************************************************************
@@ -527,9 +562,60 @@ void ModuleBase_WidgetMultiSelector::onListSelection()
   QList<QListWidgetItem*> aItems = myListControl->selectedItems();
   myCopyAction->setEnabled(!aItems.isEmpty());
   myDeleteAction->setEnabled(!aItems.isEmpty());
-
-  //myWorkshop->setSelected(>setSelected(getAttributeSelection());
-  QList<ModuleBase_ViewerPrs> aSelectedItems;
   
-  emit itemsSelected(aSelectedItems);
+  myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
+                                        true);
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::getSelectedAttributeIndices(std::set<int>& theAttributeIds)
+{
+  QList<QListWidgetItem*> 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<int> theAttributeIds,
+                                                      QList<ModuleBase_ViewerPrs>& theValues) const
+{
+  if(myFeature.get() == NULL)
+    return;
+
+  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())
+        continue;
+      AttributeSelectionPtr anAttr = aSelectionListAttr->value(i);
+      ResultPtr anObject = anAttr->context();
+      if (anObject.get()) {
+        TopoDS_Shape aShape;
+        std::shared_ptr<GeomAPI_Shape> aShapePtr = anAttr->value();
+        if (aShapePtr.get()) {
+          aShape = aShapePtr->impl<TopoDS_Shape>();
+        }
+        theValues.append(ModuleBase_ViewerPrs(anObject, aShape, 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));
+      }
+    }
+  }
 }