Salome HOME
Extension of Parameters interface: to set/get double values of results
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetMultiSelector.cpp
index a651aa185eb0372540bf230277e7dcec2a3bd44f..fe5e99ecc75774a09de5d31c28f4b29f7b17edd5 100755 (executable)
@@ -17,6 +17,7 @@
 #include <ModuleBase_IModule.h>
 #include <ModuleBase_ViewerPrs.h>
 #include <ModuleBase_IconFactory.h>
+#include <ModuleBase_Events.h>
 
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Object.h>
@@ -24,6 +25,7 @@
 #include <ModelAPI_AttributeRefList.h>
 #include <ModelAPI_AttributeRefAttrList.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_Events.h>
 
 #include <Config_WidgetAPI.h>
 
@@ -38,6 +40,7 @@
 #include <QApplication>
 #include <QClipboard>
 #include <QTimer>
+#include <QMainWindow>
 
 #include <memory>
 #include <string>
@@ -114,11 +117,11 @@ 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()) {
@@ -143,15 +146,15 @@ 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);
@@ -184,8 +187,8 @@ void ModuleBase_WidgetMultiSelector::deactivate()
 //********************************************************************
 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;
 
@@ -201,7 +204,7 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom()
 //********************************************************************
 bool ModuleBase_WidgetMultiSelector::restoreValueCustom()
 {
-  // A rare case when plugin was not loaded. 
+  // A rare case when plugin was not loaded.
   if (!myFeature)
     return false;
 
@@ -277,7 +280,7 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList<ModuleBase_ViewerPrsPtr>
 
   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
+                             true);/// hope that something is redisplayed by object updated
 
   return isDone;
 }
@@ -301,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<ResultPtr>& aResList = myFeature->results();
+        std::list<ResultPtr> aResults;
+        ModelAPI_Tools::allResults(myFeature, aResults);
         std::list<ResultPtr>::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;
@@ -358,7 +362,7 @@ bool ModuleBase_WidgetMultiSelector::processDelete()
 
     // 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
+                              true); /// hope that something is redisplayed by object updated
   }
 
   // Restore selection
@@ -389,11 +393,41 @@ QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
 void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()
 {
   activateSelectionAndFilters(true);
-  QList<ModuleBase_ViewerPrsPtr> 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
 }
 
 //********************************************************************
@@ -401,15 +435,24 @@ void ModuleBase_WidgetMultiSelector::onSelectionChanged()
 {
   if (!myIsNeutralPointClear) {
     QList<ModuleBase_ViewerPrsPtr> aSelected = getFilteredSelected();
-    if (aSelected.size() == 0)
-      return;
+    // 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,
@@ -422,7 +465,7 @@ void ModuleBase_WidgetMultiSelector::updateSelectionName()
 }
 
 //********************************************************************
-QIntList ModuleBase_WidgetMultiSelector::getShapeTypes() const
+QIntList ModuleBase_WidgetMultiSelector::shapeTypes() const
 {
   QIntList aShapeTypes;
 
@@ -430,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);
@@ -538,6 +577,21 @@ std::string ModuleBase_WidgetMultiSelector::validatorType(const QString& theType
   return aType;
 }
 
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::clearSelection()
+{
+  bool isClearInNeutralPoint = myIsNeutralPointClear;
+  myIsNeutralPointClear = true;
+
+  QList<ModuleBase_ViewerPrsPtr> 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()
 {
@@ -566,7 +620,7 @@ void ModuleBase_WidgetMultiSelector::onListSelection()
   QList<QListWidgetItem*> aItems = myListControl->selectedItems();
   myCopyAction->setEnabled(!aItems.isEmpty());
   myDeleteAction->setEnabled(!aItems.isEmpty());
-  
+
   myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
                                         true);
 }
@@ -583,7 +637,7 @@ void ModuleBase_WidgetMultiSelector::getSelectedAttributeIndices(std::set<int>&
 }
 
 void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set<int> theAttributeIds,
-                                                      QList<ModuleBase_ViewerPrsPtr>& theValues) const
+                                                   QList<ModuleBase_ViewerPrsPtr>& theValues) const
 {
   if(myFeature.get() == NULL)
     return;
@@ -675,7 +729,8 @@ bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects
   }
   else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
     std::set<AttributePtr> anAttributes;
-    QList<ModuleBase_ViewerPrsPtr>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
+    QList<ModuleBase_ViewerPrsPtr>::const_iterator
+      anIt = theValues.begin(), aLast = theValues.end();
     ObjectPtr anObject;
     GeomShapePtr aShape;
     for (; anIt != aLast; anIt++) {