X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=fae06823576e8d7bac17d965705f6761dfea4a49;hb=bbf6e2c75c79cb80729eb85baecf4d1a17dd7ed8;hp=4e458fa7bd5bf0f0349b893cfd07cef9a7132d83;hpb=d165b06723a6703ac10ca94f5800f8168379a3ad;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index 4e458fa7b..fae068235 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -114,22 +114,28 @@ 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("type_choice"); + std::string aPropertyTypes = theData->getProperty("shape_types"); QString aTypesStr = aPropertyTypes.c_str(); myShapeTypes = aTypesStr.split(' ', QString::SkipEmptyParts); myIsUseChoice = theData->getBooleanAttribute("use_choice", false); - QVBoxLayout* aMainLay = new QVBoxLayout(this); - ModuleBase_Tools::adjustMargins(aMainLay); + QString aAllowedList(theData->getProperty("allow_objects").c_str()); + if (!aAllowedList.isEmpty()) + myAllowedObjects = aAllowedList.split(' ', QString::SkipEmptyParts); + + myMainLayout = new QVBoxLayout(this); + ModuleBase_Tools::adjustMargins(myMainLayout); QStringList aIconsList = getIconsList(myShapeTypes); myTypeCtrl = new ModuleBase_ChoiceCtrl(this, myShapeTypes, aIconsList); myTypeCtrl->setLabel(tr("Type")); - myTypeCtrl->setValue(0); - aMainLay->addWidget(myTypeCtrl); - myDefMode = myShapeTypes.first().toStdString(); + if (!myShapeTypes.empty()) { + myTypeCtrl->setValue(0); + myDefMode = myShapeTypes.first().toStdString(); + } + 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 @@ -142,7 +148,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); @@ -159,39 +165,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 @@ -215,9 +221,26 @@ void ModuleBase_WidgetMultiSelector::activateCustom() { ModuleBase_WidgetSelector::activateCustom(); - myWorkshop->module()->activateCustomPrs(myFeature, + ModuleBase_IModule* aModule = myWorkshop->module(); + aModule->activateCustomPrs(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects, true); clearSelectedHistory(); + if (myAllowedObjects.length() > 0) { + Handle(SelectMgr_Filter) aFilter = aModule->selectionFilter(SF_GlobalFilter); + if (!aFilter.IsNull()) { + Handle(ModuleBase_ShapeDocumentFilter) aDocFilter = + Handle(ModuleBase_ShapeDocumentFilter)::DownCast(aFilter); + if (!aDocFilter.IsNull()) { + QStringList aSelFilters = aDocFilter->nonSelectableTypes(); + foreach(QString aType, aSelFilters) { + if (aSelFilters.contains(aType)) { + aDocFilter->removeNonSelectableType(aType); + myTmpAllowed.append(aType); + } + } + } + } + } } //******************************************************************** @@ -227,10 +250,24 @@ void ModuleBase_WidgetMultiSelector::deactivate() ModuleBase_WidgetSelector::deactivate(); if (myVisibleObjects.size()) - onShowOnly(false); + myShowOnlyBtn->setChecked(false); myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true); clearSelectedHistory(); + if (myTmpAllowed.length() > 0) { + ModuleBase_IModule* aModule = myWorkshop->module(); + Handle(SelectMgr_Filter) aFilter = aModule->selectionFilter(SF_GlobalFilter); + if (!aFilter.IsNull()) { + Handle(ModuleBase_ShapeDocumentFilter) aDocFilter = + Handle(ModuleBase_ShapeDocumentFilter)::DownCast(aFilter); + if (!aDocFilter.IsNull()) { + foreach(QString aType, myTmpAllowed) { + aDocFilter->addNonSelectableType(aType); + } + } + } + myTmpAllowed.clear(); + } } //******************************************************************** @@ -259,12 +296,23 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom() std::string aType = anAttribute->attributeType(); if (aType == ModelAPI_AttributeSelectionList::typeId()) { AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - std::string aMode = myTypeCtrl->textValue().toStdString(); - if (myTypeCtrl->isVisible() && myIsFirst && (!myDefMode.empty())) - aMode = myDefMode; + if (myTypeCtrl->isVisible()) { + std::string aMode = myTypeCtrl->textValue().toStdString(); + if (myIsFirst && (!myDefMode.empty())) + aMode = myDefMode; - aSelectionListAttr->setSelectionType(aMode); - myIsFirst = false; + aSelectionListAttr->setSelectionType(aMode); + myIsFirst = false; + } else { // no type, set the type as a first element of the list shape type when it is appeared + if (aSelectionListAttr->size()) { + AttributeSelectionPtr aSel = aSelectionListAttr->value(0); + GeomShapePtr aFirstVal = aSel->value(); + if (!aFirstVal.get() && aSel->context().get()) + aFirstVal = aSel->context()->shape(); + if (aFirstVal.get() && !aFirstVal->isNull()) + aSelectionListAttr->setSelectionType(aFirstVal->shapeTypeStr()); + } + } } return true; } @@ -282,7 +330,9 @@ bool ModuleBase_WidgetMultiSelector::restoreValueCustom() if (aType == ModelAPI_AttributeSelectionList::typeId()) { // Restore shape type std::string aSelectionType = aSelectionListAttr->selectionType().c_str(); - if (!aSelectionType.empty()) { + if (aSelectionType.empty()) + aSelectionListAttr->setSelectionType(myDefMode); + else { setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionType.c_str())); myDefMode = aSelectionType; myIsFirst = false; @@ -361,7 +411,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; @@ -505,7 +555,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,7 +618,7 @@ 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, + myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments, true); /// hope that something is redisplayed by object updated // clear history should follow after set selected to do not increase history by setSelected clearSelectedHistory(); @@ -805,8 +855,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); } //******************************************************************** @@ -1129,4 +1179,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); + } + } + } }