X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelectionFilter.cpp;h=6e916b7ab2c6e870247999018c26a08739a9e6d7;hb=f14192492e36f4febc93b2ad7ab7f866cbbdf71b;hp=ed75e86716d551f04d883ed381e1e19838e1d559;hpb=4c8000e288a5980fd34b2276a1aaaf8e52879027;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelectionFilter.cpp b/src/ModuleBase/ModuleBase_WidgetSelectionFilter.cpp index ed75e8671..6e916b7ab 100644 --- a/src/ModuleBase/ModuleBase_WidgetSelectionFilter.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelectionFilter.cpp @@ -55,8 +55,8 @@ #include #include -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 (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(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::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::iterator aIt; + ModelAPI_FiltersFactory* aFactory = ModelAPI_Session::get()->filters(); + std::list aFilters = aFactory->filters((GeomAPI_Shape::ShapeType) mySelectionType); + FiltersFeaturePtr aFiltersFeature = + std::dynamic_pointer_cast(myFeature); + + std::string aText = myFiltersCombo->itemText(theIndex).toStdString(); + + std::list::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(myFeature); aFiltersFeature->addFilter(aFilter); - - myFiltersCombo->setCurrentIndex(0); - myFiltersCombo->removeItem(theIndex); updateObject(myFeature); - if (aItem && (aItem->widgets().size() > 0)) - aItem->widgets().first()->emitFocusInWidget(); + QList 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::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(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(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_WidgetSelectionFilter::itemsList() const +{ + return myFiltersWgt->findChildren(); +} + + bool ModuleBase_WidgetSelectionFilter::restoreValueCustom() { ModelAPI_FiltersFactory* aFactory = ModelAPI_Session::get()->filters(); FiltersFeaturePtr aFiltersFeature = std::dynamic_pointer_cast(myFeature); - std::list aFilters = aFiltersFeature->filters(); - std::list::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 aWidgets; - QList aItems = myFiltersWgt->findChildren(); - foreach(ModuleBase_FilterItem* aItem, aItems) { - QList aSubList = aItem->widgets(); - foreach(ModuleBase_ModelWidget* aWgt, aSubList) { - aWgt->restoreValue(); + QList aItemsList = itemsList(); + std::list aFilters = aFiltersFeature->filters(); + + std::list::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 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 aItemsList = myFiltersWgt->findChildren(); + QList aItemsList = itemsList(); foreach(ModuleBase_FilterItem* aItem, aItemsList) { QList aWidgetsList = aItem->widgets(); foreach(ModuleBase_ModelWidget* aWidget, aWidgetsList) {