X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=f071f3d98e7322b3a125a24bbfbaae7e2af53dae;hb=90a04fa2943fd985a9dbabc839313a8744d898fc;hp=1740c62ffd732e623fd73c1bc67091195791889b;hpb=749e980caeebfe4d16441703b7028dbbb1f1d91a;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index 1740c62ff..f071f3d98 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -114,7 +114,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen const Config_WidgetAPI* theData) : ModuleBase_WidgetSelector(theParent, theWorkshop, theData), myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1), - myIsFirst(true), myFiltersWgt(0) + myIsFirst(true), myFiltersWgt(0), myShowOnlyBtn(0) { std::string aPropertyTypes = theData->getProperty("shape_types"); QString aTypesStr = aPropertyTypes.c_str(); @@ -125,17 +125,36 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen if (!aAllowedList.isEmpty()) myAllowedObjects = aAllowedList.split(' ', QString::SkipEmptyParts); - QVBoxLayout* aMainLay = new QVBoxLayout(this); - ModuleBase_Tools::adjustMargins(aMainLay); + myMainLayout = new QVBoxLayout(this); + ModuleBase_Tools::adjustMargins(myMainLayout); + + + QStringList aIconsList; + std::string aIcons = theData->getProperty("type_icons"); + if (aIcons.size() > 0) + aIconsList = QString(aIcons.c_str()).split(' ', QString::SkipEmptyParts); + + if (aIconsList.size() != myShapeTypes.size()) + aIconsList = getIconsList(myShapeTypes); - QStringList aIconsList = getIconsList(myShapeTypes); myTypeCtrl = new ModuleBase_ChoiceCtrl(this, myShapeTypes, aIconsList); myTypeCtrl->setLabel(tr("Type")); if (!myShapeTypes.empty()) { - myTypeCtrl->setValue(0); - myDefMode = myShapeTypes.first().toStdString(); + std::string aDefType = theData->getProperty("default_type"); + if (aDefType.size() > 0) { + bool aOk = false; + int aId = QString(aDefType.c_str()).toInt(&aOk); + if (aOk) { + myTypeCtrl->setValue(aId); + myDefMode = myShapeTypes.at(aId).toStdString(); + } + } + if (myDefMode.size() == 0) { + myTypeCtrl->setValue(0); + myDefMode = myShapeTypes.first().toStdString(); + } } - aMainLay->addWidget(myTypeCtrl); + myMainLayout->addWidget(myTypeCtrl); // There is no sense to parameterize list of types while we can not parameterize selection mode // if the xml definition contains one type, the controls to select a type should not be shown @@ -148,7 +167,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen QWidget* aLabelWgt = new QWidget(this); QHBoxLayout* aLabelLayout = new QHBoxLayout(aLabelWgt); aLabelLayout->setContentsMargins(0, 0, 0, 0); - aMainLay->addWidget(aLabelWgt); + myMainLayout->addWidget(aLabelWgt); QLabel* aListLabel = new QLabel(aLabelText, this); aLabelLayout->addWidget(aListLabel); @@ -165,39 +184,39 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen } } - QString aToolTip = QString::fromStdString(theData->widgetTooltip()); + QString aToolTip = translate(theData->widgetTooltip()); QString anObjName = QString::fromStdString(attributeID()); myListView = new ModuleBase_ListView(this, anObjName, aToolTip); connect(myListView->getControl(), SIGNAL(itemSelectionChanged()), SLOT(onListSelection())); connect(myListView, SIGNAL(deleteActionClicked()), SLOT(onDeleteItem())); connect(myListView, SIGNAL(listActivated()), SLOT(onListActivated())); - aMainLay->addWidget(myListView->getControl()); + myMainLayout->addWidget(myListView->getControl()); connect(myTypeCtrl, SIGNAL(valueChanged(int)), this, SLOT(onSelectionTypeChanged())); - std::string aUseFilters = theData->getProperty("use_filters"); - if (aUseFilters.length() > 0) { + myUseFilters = theData->getProperty("use_filters"); + if (myUseFilters.length() > 0) { QWidget* aFltrWgt = new QWidget(this); QHBoxLayout* aFltrLayout = new QHBoxLayout(aFltrWgt); - myFiltersWgt = new ModuleBase_FilterStarter(aUseFilters.c_str(), aFltrWgt, theWorkshop); + myFiltersWgt = new ModuleBase_FilterStarter(myUseFilters, aFltrWgt, theWorkshop); aFltrLayout->addWidget(myFiltersWgt); aFltrLayout->addStretch(); - QPushButton* aShowBtn = new QPushButton(tr("Show only"), aFltrWgt); - aShowBtn->setCheckable(true); - aShowBtn->setChecked(false); - connect(aShowBtn, SIGNAL(toggled(bool)), SLOT(onShowOnly(bool))); - aFltrLayout->addWidget(aShowBtn); + myShowOnlyBtn = new QPushButton(tr("Show only"), aFltrWgt); + myShowOnlyBtn->setCheckable(true); + myShowOnlyBtn->setChecked(false); + connect(myShowOnlyBtn, SIGNAL(toggled(bool)), SLOT(onShowOnly(bool))); + aFltrLayout->addWidget(myShowOnlyBtn); - aMainLay->addWidget(aFltrWgt); + myMainLayout->addWidget(aFltrWgt); } bool aSameTop = theData->getBooleanAttribute("same_topology", false); if (aSameTop) { myGeomCheck = new QCheckBox(tr("Add elements that share the same topology"), this); - aMainLay->addWidget(myGeomCheck); + myMainLayout->addWidget(myGeomCheck); connect(myGeomCheck, SIGNAL(toggled(bool)), SLOT(onSameTopology(bool))); } else @@ -250,7 +269,7 @@ void ModuleBase_WidgetMultiSelector::deactivate() ModuleBase_WidgetSelector::deactivate(); if (myVisibleObjects.size()) - onShowOnly(false); + myShowOnlyBtn->setChecked(false); myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true); clearSelectedHistory(); @@ -330,8 +349,10 @@ bool ModuleBase_WidgetMultiSelector::restoreValueCustom() if (aType == ModelAPI_AttributeSelectionList::typeId()) { // Restore shape type std::string aSelectionType = aSelectionListAttr->selectionType().c_str(); - if (!aSelectionType.empty()) { - setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionType.c_str())); + if (aSelectionType.empty()) + aSelectionListAttr->setSelectionType(myDefMode); + else { + setCurrentShapeType(aSelectionType.c_str()); myDefMode = aSelectionType; myIsFirst = false; } @@ -409,7 +430,7 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList theValues.append(anInvalidValues); if (isDone) // may be the feature's result is not displayed, but attributes should be - myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments, + myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments, true);/// hope that something is redisplayed by object updated return isDone; @@ -553,7 +574,7 @@ bool ModuleBase_WidgetMultiSelector::processDelete() myWorkshop->setSelected(getAttributeSelection()); // may be the feature's result is not displayed, but attributes should be - myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments, + myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments, true); /// hope that something is redisplayed by object updated } @@ -568,6 +589,8 @@ bool ModuleBase_WidgetMultiSelector::processDelete() QList ModuleBase_WidgetMultiSelector::getControls() const { QList result; + if (myTypeCtrl->isVisible()) + result << myTypeCtrl; result << myListView->getControl(); return result; } @@ -616,8 +639,9 @@ void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() 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 + // hope that something is redisplayed by object updated + myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments, false); + myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeResults, true); // clear history should follow after set selected to do not increase history by setSelected clearSelectedHistory(); @@ -728,25 +752,30 @@ QIntList ModuleBase_WidgetMultiSelector::shapeTypes() const QIntList aShapeTypes; if (myShapeTypes.length() > 1 && myIsUseChoice) { - aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCtrl->textValue())); + QStringList aTypes = myTypeCtrl->textValue().split("|", QString::SkipEmptyParts); + for(QString aType: aTypes) { + aShapeTypes.append(ModuleBase_Tools::shapeType(aType)); + } } else { foreach (QString aType, myShapeTypes) { - aShapeTypes.append(ModuleBase_Tools::shapeType(aType)); + QStringList aSubTypes = aType.split("|", QString::SkipEmptyParts); + for(QString aSubType: aSubTypes) { + aShapeTypes.append(ModuleBase_Tools::shapeType(aSubType)); + } } } return aShapeTypes; } //******************************************************************** -void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const int theShapeType) +void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const QString& theShapeType) { - QString aShapeTypeName; - int idx = 0; + GeomAPI_Shape::ShapeType aShapeType = GeomAPI_Shape::shapeTypeByStr(theShapeType.toStdString()); foreach (QString aShapeTypeName, myShapeTypes) { - int aRefType = ModuleBase_Tools::shapeType(aShapeTypeName); - if(aRefType == theShapeType && idx != myTypeCtrl->value()) { + if(GeomAPI_Shape::shapeTypeByStr(aShapeTypeName.toStdString()) == aShapeType && + idx != myTypeCtrl->value()) { updateSelectionModesAndFilters(false); bool isBlocked = myTypeCtrl->blockSignals(true); myTypeCtrl->setValue(idx); @@ -777,7 +806,7 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList() AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); for (int i = 0; i < aSelectionListAttr->size(); i++) { AttributeSelectionPtr aAttr = aSelectionListAttr->value(i); - myListView->addItem(aAttr->namingName().c_str(), i); + myListView->addItem(QString::fromStdWString(aAttr->namingName()), i); } } else if (aType == ModelAPI_AttributeRefList::typeId()) { @@ -785,23 +814,23 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList() for (int i = 0; i < aRefListAttr->size(); i++) { ObjectPtr anObject = aRefListAttr->object(i); if (anObject.get()) { - myListView->addItem(anObject->data()->name().c_str(), i); + myListView->addItem(QString::fromStdWString(anObject->data()->name()), i); } } } else if (aType == ModelAPI_AttributeRefAttrList::typeId()) { AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID()); for (int i = 0; i < aRefAttrListAttr->size(); i++) { - AttributePtr anAttribute = aRefAttrListAttr->attribute(i); + AttributePtr anAttr = aRefAttrListAttr->attribute(i); QString aName; - if (anAttribute.get()) { - std::string anAttrName = ModuleBase_Tools::generateName(anAttribute, myWorkshop); - aName = QString::fromStdString(anAttrName); + if (anAttr.get()) { + std::wstring anAttrName = ModuleBase_Tools::generateName(anAttr, myWorkshop); + aName = QString::fromStdWString(anAttrName); } else { ObjectPtr anObject = aRefAttrListAttr->object(i); if (anObject.get()) { - aName = anObject->data()->name().c_str(); + aName = QString::fromStdWString(anObject->data()->name()); } } myListView->addItem(aName, i); @@ -809,7 +838,7 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList() } // We have to call repaint because sometimes the List control is not updated - myListView->getControl()->repaint(); + myListView->getControl()->update(); } //******************************************************************** @@ -853,8 +882,8 @@ void ModuleBase_WidgetMultiSelector::onDeleteItem() //******************************************************************** void ModuleBase_WidgetMultiSelector::onListSelection() { - myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects, - true); + myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects, + true); } //******************************************************************** @@ -908,9 +937,9 @@ void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::setattribute(i); - if (anAttribute.get()) { - GeomShapePtr aGeomShape = ModuleBase_Tools::getShape(anAttribute, myWorkshop); + AttributePtr anAttr = aRefAttrListAttr->attribute(i); + if (anAttr.get()) { + GeomShapePtr aGeomShape = ModuleBase_Tools::getShape(anAttr, myWorkshop); theValues.append(std::shared_ptr( new ModuleBase_ViewerPrs(anObject, aGeomShape, NULL))); } @@ -935,13 +964,15 @@ bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); for (int i = 0; i < aSelectionListAttr->size(); i++) { AttributeSelectionPtr anAttr = aSelectionListAttr->value(i); - //aFeature = std::dynamic_pointer_cast(anAttr->contextObject()); - //if (!aFeature.get()) { // Feature can not be found as geometry selection - bool aFound = findInSelection( - anAttr->contextObject(), anAttr->value(), aGeomSelection, myWorkshop); - if (!aFound) - anIndicesToBeRemoved.insert(i); -// } + ObjectPtr aContextObject = anAttr->contextObject(); + GeomShapePtr aShape; + aFeature = std::dynamic_pointer_cast(aContextObject); + if (!aFeature.get()) + aShape = anAttr->value(); + + bool aFound = findInSelection(aContextObject, aShape, aGeomSelection, myWorkshop); + if (!aFound) + anIndicesToBeRemoved.insert(i); } isDone = anIndicesToBeRemoved.size() > 0; if (isDone) @@ -979,8 +1010,8 @@ bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects for (int i = 0; i < aRefAttrListAttr->size(); i++) { bool aFound = false; if (aRefAttrListAttr->isAttribute(i)) { - AttributePtr anAttribute = aRefAttrListAttr->attribute(i); - aFound = anAttributes.find(anAttribute) != anAttributes.end(); + AttributePtr anAttr = aRefAttrListAttr->attribute(i); + aFound = anAttributes.find(anAttr) != anAttributes.end(); } else { aFound = findInSelection(aRefAttrListAttr->object(i), GeomShapePtr(), aGeomSelection, @@ -1115,6 +1146,8 @@ QList i--; } break; + default: // [to avoid compilation warning] + break; } } return aList; @@ -1177,4 +1210,40 @@ void ModuleBase_WidgetMultiSelector::onShowOnly(bool theChecked) myVisibleObjects.clear(); } else Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + myWorkshop->viewer()->update(); +} + +bool ModuleBase_WidgetMultiSelector::isModified() const +{ + return myListView->getControl()->count() > 0; +} + + +void ModuleBase_WidgetMultiSelector::setReadOnly(bool isReadOnly) +{ + ModuleBase_WidgetSelector::setReadOnly(isReadOnly); + if (myShowOnlyBtn) + myShowOnlyBtn->hide(); + if (myFiltersWgt) { + myFiltersWgt->hide(); + + AttributeSelectionListPtr aAttrList = feature()->selectionList(attributeID()); + if (aAttrList.get()) { + FiltersFeaturePtr aFilters = aAttrList->filters(); + if (aFilters.get()) { + ModuleBase_WidgetSelectionFilter::SelectorFeature = feature(); + ModuleBase_WidgetSelectionFilter::AttributeId = attributeID(); + + std::string aXmlCfg, aDescription; + myWorkshop->module()->getXMLRepresentation(myUseFilters, aXmlCfg, aDescription); + + ModuleBase_WidgetSelectionFilter* aWgt = + new ModuleBase_WidgetSelectionFilter(this, myWorkshop, + new Config_WidgetAPI(aDescription), true); + aWgt->setFeature(aFilters); + aWgt->restoreValue(); + myMainLayout->addWidget(aWgt); + } + } + } }