-// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
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();
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
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);
}
}
- 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
ModuleBase_WidgetSelector::deactivate();
if (myVisibleObjects.size())
- onShowOnly(false);
+ myShowOnlyBtn->setChecked(false);
myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
clearSelectedHistory();
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;
}
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;
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
}
QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
{
QList<QWidget*> result;
+ if (myTypeCtrl->isVisible())
+ result << myTypeCtrl;
result << myListView->getControl();
return result;
}
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();
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);
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()) {
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);
}
// We have to call repaint because sometimes the List control is not updated
- myListView->getControl()->repaint();
+ myListView->getControl()->update();
}
//********************************************************************
//********************************************************************
void ModuleBase_WidgetMultiSelector::onListSelection()
{
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
- true);
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
+ true);
}
//********************************************************************
if (!anObject.get())
continue;
TopoDS_Shape aShape;
- AttributePtr anAttribute = aRefAttrListAttr->attribute(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<ModuleBase_ViewerPrs>(
new ModuleBase_ViewerPrs(anObject, aGeomShape, NULL)));
}
AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
for (int i = 0; i < aSelectionListAttr->size(); i++) {
AttributeSelectionPtr anAttr = aSelectionListAttr->value(i);
- //aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(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<ModelAPI_Feature>(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)
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,
i--;
}
break;
+ default: // [to avoid compilation warning]
+ break;
}
}
return aList;
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);
+ }
+ }
+ }
}