Salome HOME
Support of wide string
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetSelectionFilter.cpp
index ed75e86716d551f04d883ed381e1e19838e1d559..6e916b7ab2c6e870247999018c26a08739a9e6d7 100644 (file)
@@ -55,8 +55,8 @@
 #include <QCheckBox>
 #include <QDir>
 
-static FeaturePtr SelectorFeature;
-static std::string AttributeId;
+FeaturePtr ModuleBase_WidgetSelectionFilter::SelectorFeature;
+std::string ModuleBase_WidgetSelectionFilter::AttributeId;
 
 
 GeomAPI_Shape::ShapeType selectionType(const QString& theType)
@@ -118,14 +118,16 @@ void ModuleBase_FilterStarter::onFiltersLaunch()
   }
   if (!aSelector)
     return;
-  SelectorFeature = aSelector->feature();
-  AttributeId = aSelector->attributeID();
+  ModuleBase_WidgetSelectionFilter::SelectorFeature = aSelector->feature();
+  ModuleBase_WidgetSelectionFilter::AttributeId = aSelector->attributeID();
 
   // Launch Filters operation
   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
     (myWorkshop->module()->createOperation(myFeatureName));
 
-  AttributeSelectionListPtr aAttrList = SelectorFeature->selectionList(AttributeId);
+  AttributeSelectionListPtr aAttrList =
+    ModuleBase_WidgetSelectionFilter::SelectorFeature->selectionList(
+      ModuleBase_WidgetSelectionFilter::AttributeId);
   FiltersFeaturePtr aFilters = aAttrList->filters();
   if (aFilters.get())
     aFOperation->setFeature(aFilters);
@@ -141,12 +143,17 @@ ModuleBase_FilterItem::ModuleBase_FilterItem(
   : QWidget(theParent->filtersWidget()), myFilterID(theFilter),
     mySelection(std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(theParent->feature()))
 {
-  std::string aXmlString =
-      ModelAPI_Session::get()->filters()->filter(theFilter)->xmlRepresentation();
+  FilterPtr aFilter = ModelAPI_Session::get()->filters()->filter(theFilter);
+  std::string aXmlString = aFilter->xmlRepresentation();
   if (aXmlString.length() == 0)
     addItemRow(this);
   else {
-    ModuleBase_WidgetFactory aFactory(aXmlString, theParent->workshop());
+    std::string anAttrPrefix; // this must be added to the attributes names for multiple filters
+    std::string aFilterKind = ModelAPI_Session::get()->filters()->id(aFilter);
+    if (theFilter != aFilterKind) {
+      anAttrPrefix = theFilter.substr(0, theFilter.size() - aFilterKind.size());
+    }
+    ModuleBase_WidgetFactory aFactory(aXmlString, theParent->workshop(), anAttrPrefix);
     Config_ValidatorReader aValidatorReader(aXmlString, true);
     aValidatorReader.setFeatureId(mySelection->getKind());
     aValidatorReader.readAll();
@@ -225,16 +232,18 @@ void ModuleBase_FilterItem::onDelete()
 //*****************************************************************************
 //*****************************************************************************
 ModuleBase_WidgetSelectionFilter::ModuleBase_WidgetSelectionFilter(QWidget* theParent,
-  ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData)
+  ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, bool theReadOnly)
   : ModuleBase_ModelWidget(theParent, theData),
   myWorkshop(theWorkshop),
-  mySelectorFeature(SelectorFeature),
-  mySelectorAttribute(AttributeId)
+  mySelectorFeature(ModuleBase_WidgetSelectionFilter::SelectorFeature),
+  mySelectorAttribute(ModuleBase_WidgetSelectionFilter::AttributeId)
 {
   // Clear Old selection
-  AttributeSelectionListPtr aAttrList = mySelectorFeature->selectionList(mySelectorAttribute);
-  mySelectionType = selectionType(aAttrList->selectionType().c_str());
-  aAttrList->clear();
+    AttributeSelectionListPtr aAttrList = mySelectorFeature->selectionList(mySelectorAttribute);
+    mySelectionType = selectionType(aAttrList->selectionType().c_str());
+  if (!theReadOnly) {
+    aAttrList->clear();
+  }
 
   // Define widgets
   QVBoxLayout* aMainLayout = new QVBoxLayout(this);
@@ -259,7 +268,6 @@ ModuleBase_WidgetSelectionFilter::ModuleBase_WidgetSelectionFilter(QWidget* theP
   std::list<FilterPtr>::const_iterator aIt;
   for (aIt = allFilters.cbegin(); aIt != allFilters.cend(); aIt++) {
     aItems.push_back((*aIt)->name().c_str());
-    myFilters.push_back(aSession->filters()->id(*aIt));
   }
   myFiltersCombo->addItems(aItems);
   connect(myFiltersCombo, SIGNAL(currentIndexChanged(int)), SLOT(onAddFilter(int)));
@@ -300,6 +308,12 @@ ModuleBase_WidgetSelectionFilter::ModuleBase_WidgetSelectionFilter(QWidget* theP
   aMainLayout->addStretch(1);
 
   updateSelectBtn();
+  if (theReadOnly) {
+    myFiltersCombo->hide();
+    mySelectBtn->hide();
+    aLblWgt->hide();
+    myShowBtn->hide();
+  }
 }
 
 ModuleBase_WidgetSelectionFilter::~ModuleBase_WidgetSelectionFilter()
@@ -325,7 +339,7 @@ ModuleBase_WidgetSelectionFilter::~ModuleBase_WidgetSelectionFilter()
       myListIO.Clear();
       myShowBtn->setChecked(false);
     }
-    aCtx->UpdateCurrentViewer();
+    myWorkshop->viewer()->update();
   }
   SelectorFeature = FeaturePtr();
   AttributeId = "";
@@ -336,26 +350,28 @@ void ModuleBase_WidgetSelectionFilter::onAddFilter(int theIndex)
   if (theIndex == 0)
     return;
 
-  std::list<std::string>::iterator aIt;
+  ModelAPI_FiltersFactory* aFactory = ModelAPI_Session::get()->filters();
+  std::list<FilterPtr> aFilters = aFactory->filters((GeomAPI_Shape::ShapeType) mySelectionType);
+  FiltersFeaturePtr aFiltersFeature =
+    std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(myFeature);
+
+  std::string aText = myFiltersCombo->itemText(theIndex).toStdString();
+
+  std::list<FilterPtr>::iterator aIt;
   int i;
   std::string aFilter;
-  for (aIt = myFilters.begin(), i = 0; aIt != myFilters.cend(); i++, aIt++) {
-    if (i == (theIndex - 1)) {
-      aFilter = (*aIt);
+  for (aIt = aFilters.begin(), i = 0; aIt != aFilters.cend(); i++, aIt++) {
+    if (aText == (*aIt)->name()) {
+      aFilter = aFactory->id(*aIt);
       break;
     }
   }
-  ModuleBase_FilterItem* aItem = onAddFilter(aFilter);
-  FiltersFeaturePtr aFiltersFeature =
-    std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(myFeature);
   aFiltersFeature->addFilter(aFilter);
-
-  myFiltersCombo->setCurrentIndex(0);
-  myFiltersCombo->removeItem(theIndex);
   updateObject(myFeature);
 
-  if (aItem && (aItem->widgets().size() > 0))
-    aItem->widgets().first()->emitFocusInWidget();
+  QList<ModuleBase_FilterItem*> aList = itemsList();
+  if (!aList.isEmpty() && (aList.last()->widgets().size() > 0))
+    aList.last()->widgets().first()->emitFocusInWidget();
   else
     emitFocusInWidget();
 }
@@ -364,13 +380,6 @@ ModuleBase_FilterItem* ModuleBase_WidgetSelectionFilter::onAddFilter(const std::
 {
   if (theFilter.length() == 0)
     return 0;
-  std::list<std::string>::const_iterator aIt;
-  for (aIt = myUseFilters.cbegin(); aIt != myUseFilters.cend(); aIt++) {
-    if (theFilter == (*aIt))
-      return 0;
-  }
-  myFilters.remove(theFilter);
-  myUseFilters.push_back(theFilter);
   ModuleBase_FilterItem* aItem = new ModuleBase_FilterItem(theFilter, this);
   connect(aItem, SIGNAL(deleteItem(ModuleBase_FilterItem*)),
     SLOT(onDeleteItem(ModuleBase_FilterItem*)));
@@ -394,10 +403,11 @@ void ModuleBase_WidgetSelectionFilter::onDeleteItem(ModuleBase_FilterItem* theIt
   myFiltersLayout->removeWidget(theItem);
   theItem->deleteLater();
 
-  myUseFilters.remove(aFilter);
-  myFilters.push_back(aFilter);
-  myFiltersCombo->addItem(ModelAPI_Session::get()->filters()->filter(aFilter)->name().c_str());
-
+  ModelAPI_FiltersFactory* aFactory = ModelAPI_Session::get()->filters();
+  if (!aFactory->filter(aFilter)->isMultiple()) {
+    //myFilters.push_back(aFilter);
+    myFiltersCombo->addItem(ModelAPI_Session::get()->filters()->filter(aFilter)->name().c_str());
+  }
   FiltersFeaturePtr aFiltersFeature =
     std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(myFeature);
   aFiltersFeature->removeFilter(aFilter);
@@ -431,8 +441,6 @@ void ModuleBase_WidgetSelectionFilter::onReverseItem(ModuleBase_FilterItem* theI
 
 void ModuleBase_WidgetSelectionFilter::onSelect()
 {
-  if (myUseFilters.size() == 0)
-    return;
   Handle(AIS_InteractiveContext) aCtx = myWorkshop->viewer()->AISContext();
   if (aCtx.IsNull())
     return;
@@ -535,12 +543,13 @@ void ModuleBase_WidgetSelectionFilter::onShowOnly(bool theShow)
       }
     }
   }
-  aCtx->UpdateCurrentViewer();
+  myWorkshop->viewer()->update();
 }
 
 void ModuleBase_WidgetSelectionFilter::updateSelectBtn()
 {
-  mySelectBtn->setEnabled(myUseFilters.size() > 0);
+  FiltersFeaturePtr aFiltersFeature = std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(myFeature);
+  mySelectBtn->setEnabled(aFiltersFeature.get() && (aFiltersFeature->filters().size() > 0));
 }
 
 void ModuleBase_WidgetSelectionFilter::updateNumberSelected()
@@ -641,34 +650,50 @@ bool ModuleBase_WidgetSelectionFilter::storeValueCustom()
   return true;
 }
 
+QList<ModuleBase_FilterItem*> ModuleBase_WidgetSelectionFilter::itemsList() const
+{
+  return  myFiltersWgt->findChildren<ModuleBase_FilterItem*>();
+}
+
+
 bool ModuleBase_WidgetSelectionFilter::restoreValueCustom()
 {
   ModelAPI_FiltersFactory* aFactory = ModelAPI_Session::get()->filters();
   FiltersFeaturePtr aFiltersFeature = std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(myFeature);
-  std::list<std::string> aFilters = aFiltersFeature->filters();
-  std::list<std::string>::const_iterator aIt;
-  for (aIt = aFilters.cbegin(); aIt != aFilters.cend(); aIt++) {
-    std::string aStr = (*aIt);
-    onAddFilter(aStr);
-    FilterPtr aFilterObj = aFactory->filter(aStr);
-    int aId = myFiltersCombo->findText(aFilterObj->name().c_str());
-    if (aId != -1)
-      myFiltersCombo->removeItem(aId);
-  }
+
   // Init filters member of the parent attribute
   AttributeSelectionListPtr aAttrList = mySelectorFeature->selectionList(mySelectorAttribute);
   if (aAttrList->filters() != aFiltersFeature) {
     aAttrList->setFilters(aFiltersFeature);
   }
 
-  QList<QWidget*> aWidgets;
-  QList<ModuleBase_FilterItem*> aItems = myFiltersWgt->findChildren<ModuleBase_FilterItem*>();
-  foreach(ModuleBase_FilterItem* aItem, aItems) {
-    QList<ModuleBase_ModelWidget*> aSubList = aItem->widgets();
-    foreach(ModuleBase_ModelWidget* aWgt, aSubList) {
-      aWgt->restoreValue();
+  QList<ModuleBase_FilterItem*> aItemsList = itemsList();
+  std::list<std::string> aFilters = aFiltersFeature->filters();
+
+  std::list<std::string>::const_iterator aIt;
+  int i = 0;
+  int aNbItems = aItemsList.size();
+  ModuleBase_FilterItem* aItem = 0;
+  bool isBlocked = myFiltersCombo->blockSignals(true);
+  for (aIt = aFilters.cbegin(); aIt != aFilters.cend(); aIt++, i++) {
+    std::string aStr = (*aIt);
+    aItem = 0;
+    if (i >= aNbItems) {
+      aItem = onAddFilter(aStr);
+      FilterPtr aFilterObj = aFactory->filter(aStr);
+      int aId = myFiltersCombo->findText(aFilterObj->name().c_str());
+      if ((aId != -1) && !aFilterObj->isMultiple())
+        myFiltersCombo->removeItem(aId);
+      if (aItem) {
+        QList<ModuleBase_ModelWidget*> aSubList = aItem->widgets();
+        foreach(ModuleBase_ModelWidget* aWgt, aSubList) {
+          aWgt->restoreValue();
+        }
+      }
     }
   }
+  myFiltersCombo->setCurrentIndex(0);
+  myFiltersCombo->blockSignals(isBlocked);
   return true;
 }
 
@@ -688,7 +713,7 @@ void ModuleBase_WidgetSelectionFilter::onObjectUpdated()
   clearCurrentSelection(true);
   updateNumberSelected();
 
-  QList<ModuleBase_FilterItem*> aItemsList = myFiltersWgt->findChildren<ModuleBase_FilterItem*>();
+  QList<ModuleBase_FilterItem*> aItemsList = itemsList();
   foreach(ModuleBase_FilterItem* aItem, aItemsList) {
     QList<ModuleBase_ModelWidget*> aWidgetsList = aItem->widgets();
     foreach(ModuleBase_ModelWidget* aWidget, aWidgetsList) {