X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=5c50ce38e318088dcc86d4182a45c35fae5901de;hb=031fb5e7c551e695afa72a9de299f118a40d8d88;hp=ed40ee20434af9d1fb022043a90e13be7f2f84f2;hpb=d8fba833a4a6d6fa8526c008b3d9f9dea0861a88;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index ed40ee204..5c50ce38e 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + /* * ModuleBase_WidgetMultiSelector.cpp * @@ -25,7 +27,7 @@ #include #include -#include +#include #include ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent, @@ -45,8 +47,8 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen myTypeCombo = new QComboBox(myMainWidget); // There is no sence to paramerize list of types while we can not parametrize selection mode QString aTypesStr("Vertices Edges Faces Solids"); - myShapeTypes = aTypesStr.split(' '); - myTypeCombo->addItems(myShapeTypes); + QStringList aShapeTypes = aTypesStr.split(' '); + myTypeCombo->addItems(aShapeTypes); aMainLay->addWidget(myTypeCombo, 0, 1); QLabel* aListLabel = new QLabel(tr("Selected objects:"), myMainWidget); @@ -54,13 +56,15 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen myListControl = new QListWidget(myMainWidget); aMainLay->addWidget(myListControl, 2, 0, 2, -1); - aMainLay->setColumnStretch(1, 1); + aMainLay->setRowStretch(2, 1); + aMainLay->addWidget(new QLabel(myMainWidget)); + aMainLay->setRowMinimumHeight(3, 20); myMainWidget->setLayout(aMainLay); - //TODO: Move into the base class myUseSubShapes = theData->getBooleanAttribute("use_subshapes", false); //TODO_END connect(myTypeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectionTypeChanged())); + activateSelection(true); } @@ -77,10 +81,15 @@ bool ModuleBase_WidgetMultiSelector::storeValue() const return false; DataPtr aData = myFeature->data(); AttributeSelectionListPtr aSelectionListAttr = - boost::dynamic_pointer_cast(aData->attribute(attributeID())); + std::dynamic_pointer_cast(aData->attribute(attributeID())); - if (aSelectionListAttr && (mySelection.size() > 0)) { + if (aSelectionListAttr) { aSelectionListAttr->clear(); + // Store shapes type + TopAbs_ShapeEnum aCurrentType = + ModuleBase_WidgetShapeSelector::shapeType(myTypeCombo->currentText()); + aSelectionListAttr->setSelectionType((int) aCurrentType); + // Store selection in the attribute foreach (GeomSelection aSelec, mySelection) { aSelectionListAttr->append(aSelec.first, aSelec.second); } @@ -98,10 +107,14 @@ bool ModuleBase_WidgetMultiSelector::restoreValue() return false; DataPtr aData = myFeature->data(); AttributeSelectionListPtr aSelectionListAttr = - boost::dynamic_pointer_cast(aData->attribute(attributeID())); + std::dynamic_pointer_cast(aData->attribute(attributeID())); if (aSelectionListAttr) { mySelection.clear(); + // Restore shape type + TopAbs_ShapeEnum aShapeType = (TopAbs_ShapeEnum) aSelectionListAttr->selectionType(); + setCurrentShapeType(aShapeType); + // Restore selection in the list for (int i = 0; i < aSelectionListAttr->size(); i++) { AttributeSelectionPtr aSelectAttr = aSelectionListAttr->value(i); mySelection.append(GeomSelection(aSelectAttr->context(), aSelectAttr->value())); @@ -122,7 +135,7 @@ QWidget* ModuleBase_WidgetMultiSelector::getControl() const QList ModuleBase_WidgetMultiSelector::getControls() const { QList result; - result << myTypeCombo; + //result << myTypeCombo; result << myListControl; return result; } @@ -130,13 +143,35 @@ QList ModuleBase_WidgetMultiSelector::getControls() const //******************************************************************** bool ModuleBase_WidgetMultiSelector::eventFilter(QObject* theObj, QEvent* theEvent) { - if (theObj == myListControl) { - if (theEvent->type() == QEvent::FocusIn) - activateSelection(true); - } + //TODO: Remove maybe? return ModuleBase_ModelWidget::eventFilter(theObj, theEvent); } +//******************************************************************** +void ModuleBase_WidgetMultiSelector::activateSelection(bool toActivate) +{ + myIsActive = toActivate; + if (myIsActive) { + connect(myWorkshop, SIGNAL(selectionChanged()), + this, SLOT(onSelectionChanged()), + Qt::UniqueConnection); + activateShapeSelection(); + } else { + disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); + myWorkshop->deactivateSubShapesSelection(); + } +} + +//******************************************************************** +void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() +{ + activateShapeSelection(); + QObjectPtrList anEmptyList; + myWorkshop->setSelected(anEmptyList); + // Clear mySelection, myListControl and storeValue() + onSelectionChanged(); +} + //******************************************************************** void ModuleBase_WidgetMultiSelector::onSelectionChanged() { @@ -150,41 +185,29 @@ void ModuleBase_WidgetMultiSelector::onSelectionChanged() NCollection_List::Iterator aShpIt(aSelectedShapes); GeomShapePtr aShape; for (aIt = aOwnersList.cbegin(); aIt != aOwnersList.cend(); aShpIt.Next(), aIt++) { - ResultPtr aResult = boost::dynamic_pointer_cast(*aIt); - aShape = boost::shared_ptr(new GeomAPI_Shape()); + ResultPtr aResult = std::dynamic_pointer_cast(*aIt); + if (myFeature) { + // We can not select a result of our feature + const std::list& aResList = myFeature->results(); + std::list::const_iterator aIt; + bool isSkipSelf = false; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { + if ((*aIt) == aResult) { + isSkipSelf = true; + break; + } + } + if(isSkipSelf) + continue; + } + aShape = std::shared_ptr(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(aShpIt.Value())); mySelection.append(GeomSelection(aResult, aShape)); } updateSelectionList(); - storeValue(); emit valuesChanged(); } - -//******************************************************************** -void ModuleBase_WidgetMultiSelector::updateSelectionList() -{ - QString aType; - if (myTypeCombo->currentText().toLower() == "vertices") - aType = "vertex"; - else if (myTypeCombo->currentText().toLower() == "edges") - aType = "edge"; - else if (myTypeCombo->currentText().toLower() == "faces") - aType = "face"; - else if (myTypeCombo->currentText().toLower() == "solids") - aType = "solid"; - - myListControl->clear(); - int i = 1; - foreach (GeomSelection aSel, mySelection) { - QString aName(aSel.first->data()->name().c_str()); - aName += ":" + aType + QString("_%1").arg(i); - myListControl->addItem(aName); - i++; - } -} - - //******************************************************************** void ModuleBase_WidgetMultiSelector::filterShapes(const NCollection_List& theShapesToFilter, NCollection_List& theResult) @@ -203,23 +226,52 @@ void ModuleBase_WidgetMultiSelector::filterShapes(const NCollection_ListdeactivateSubShapesSelection(); + QString aShapeTypeName; + + for (int idx = 0; idx < myTypeCombo->count(); ++idx) { + aShapeTypeName = myTypeCombo->itemText(idx); + TopAbs_ShapeEnum aRefType = ModuleBase_WidgetShapeSelector::shapeType(aShapeTypeName); + if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) { + activateSelection(false); + bool isBlocked = myTypeCombo->blockSignals(true); + myTypeCombo->setCurrentIndex(idx); + myTypeCombo->blockSignals(isBlocked); + activateSelection(true); + break; + } } } -//******************************************************************** -void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() +void ModuleBase_WidgetMultiSelector::activateShapeSelection() { QString aNewType = myTypeCombo->currentText(); QIntList aList; aList.append(ModuleBase_WidgetShapeSelector::shapeType(aNewType)); myWorkshop->activateSubShapesSelection(aList); } + +//******************************************************************** +void ModuleBase_WidgetMultiSelector::updateSelectionList() +{ + QString aType; + if (myTypeCombo->currentText().toLower() == "vertices") + aType = "vertex"; + else if (myTypeCombo->currentText().toLower() == "edges") + aType = "edge"; + else if (myTypeCombo->currentText().toLower() == "faces") + aType = "face"; + else if (myTypeCombo->currentText().toLower() == "solids") + aType = "solid"; + + myListControl->clear(); + int i = 1; + foreach (GeomSelection aSel, mySelection) { + QString aName(aSel.first->data()->name().c_str()); + aName += ":" + aType + QString("_%1").arg(i); + myListControl->addItem(aName); + i++; + } + myListControl->repaint(); +}