X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelector.cpp;h=6f4a021d8686d1a24a442dd9bbf1aee29ce051c2;hb=a50d298cf3f55609f4a143a243a66ba140f89683;hp=e07b726b22d17ab17f93955932b6445288e736f8;hpb=dca6d3d5d73977a21e55b3605a782e56a2641edb;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelector.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp index e07b726b2..6f4a021d8 100755 --- a/src/ModuleBase/ModuleBase_WidgetSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelector.cpp @@ -1,20 +1,40 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: ModuleBase_WidgetSelector.cpp -// Created: 19 June 2015 -// Author: Natalia ERMOLAEVA +// Copyright (C) 2014-2017 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// #include +#include +#include #include +#include #include -#include #include #include -#include -#include #include +#include +#include +#include +#include +#include +#include #include #include @@ -32,7 +52,7 @@ ModuleBase_WidgetSelector::~ModuleBase_WidgetSelector() } //******************************************************************** -void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& thePrs, +void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& thePrs, ObjectPtr& theObject, GeomShapePtr& theShape) { @@ -42,12 +62,22 @@ void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& the } //******************************************************************** -void ModuleBase_WidgetSelector::onSelectionChanged() +bool ModuleBase_WidgetSelector::processSelection() { - QList aSelected = getFilteredSelected(); + QList aSelected = getFilteredSelected(); + // equal vertices should not be used here + ModuleBase_ISelection::filterSelectionOnEqualPoints(aSelected); bool isDone = setSelection(aSelected, true/*false*/); - // "false" flag should be used here, it connects to the #26658 OCC bug, when the user click in + updateOnSelectionChanged(isDone); + + return isDone; +} + +//******************************************************************** +void ModuleBase_WidgetSelector::updateOnSelectionChanged(const bool theDone) +{ + // "false" flag should be used here, it connects to the #26658 OCC bug, when the user click in // the same place repeatedly without mouse moved. In the case validation by filters is not // perfromed, so an invalid object is selected. E.g. distance constraint, selection of a point. // the 3rd click in the same point allow using this point. @@ -59,14 +89,27 @@ void ModuleBase_WidgetSelector::onSelectionChanged() // we need to forget about previous validation result as the current selection can influence on it clearValidatedCash(); - if (isDone) + if (theDone) updateFocus(); } //******************************************************************** -QList ModuleBase_WidgetSelector::getAttributeSelection() const +QIntList ModuleBase_WidgetSelector::getShapeTypes() const +{ + QIntList aShapeTypes = shapeTypes(); + // this type should be mentioned in XML, poor selection otherwise + if (/*aShapeTypes.contains(TopAbs_SOLID) ||*/ + aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result/*TopAbs_SHAPE*/)) { + // it should be selectable for both, "solids" and "objects" types + aShapeTypes.append(TopAbs_COMPSOLID); + } + return aShapeTypes; +} + +//******************************************************************** +QList ModuleBase_WidgetSelector::getAttributeSelection() const { - return QList(); + return QList(); } //******************************************************************** @@ -82,8 +125,8 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, aValid = true; return aValid; } - // when the SHAPE type is provided by XML, the hole result shape can be selected. - if (!aShape.get() && aShapeTypes.contains(TopAbs_SHAPE)) { + // when the SHAPE type is provided by XML as Object, the whole result shape should be selected. + if (!aShape.get() && aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result)) { aValid = true; return aValid; } @@ -105,7 +148,7 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, } QIntList::const_iterator anIt = aShapeTypes.begin(), aLast = aShapeTypes.end(); - for (; anIt != aLast; anIt++) { + for (; anIt != aLast && !aValid; anIt++) { TopAbs_ShapeEnum aCurrentShapeType = (TopAbs_ShapeEnum)*anIt; if (aShapeType == aCurrentShapeType) aValid = true; @@ -116,39 +159,41 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, std::dynamic_pointer_cast(theResult); aValid = aCResult.get() && aCResult->facesNum() > 0; } - aValid = ModuleBase_ResultPrs::isValidShapeType(aCurrentShapeType, aShapeType); } } return aValid; } //******************************************************************** -bool ModuleBase_WidgetSelector::activateSelectionAndFilters(bool toActivate) +void ModuleBase_WidgetSelector::selectionModes(QIntList& theModes, bool& isAdditional) +{ + theModes.append(getShapeTypes()); + isAdditional = true; +} + +//******************************************************************** +void ModuleBase_WidgetSelector::activateSelectionAndFilters(bool toActivate) { updateSelectionName(); - if (toActivate) { - myWorkshop->activateSubShapesSelection(getShapeTypes()); - } else { - myWorkshop->deactivateSubShapesSelection(); - } - return activateFilters(toActivate); + myWorkshop->selectionActivate()->updateSelectionFilters(); + myWorkshop->selectionActivate()->updateSelectionModes(); + + if (!toActivate) + clearValidatedCash(); } //******************************************************************** void ModuleBase_WidgetSelector::activateCustom() { - connect(myWorkshop, SIGNAL(selectionChanged()), this, - SLOT(onSelectionChanged()), Qt::UniqueConnection); - - activateSelectionAndFilters(true); - // Restore selection in the viewer by the attribute selection list - myWorkshop->setSelected(getAttributeSelection()); + // it should be postponed to have current widget as active to validate restored selection + static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION); + ModelAPI_EventCreator::get()->sendUpdated(myFeature, anEvent); } //******************************************************************** -bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { GeomShapePtr aShape = myWorkshop->selection()->getShape(thePrs); ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); @@ -164,23 +209,36 @@ bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPr } //******************************************************************** -bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { ObjectPtr anObject; GeomShapePtr aShape; getGeomSelection(thePrs, anObject, aShape); - setObject(anObject, aShape); - return true; + // the last flag is to be depending on hasObject is called before. To be corrected later + return ModuleBase_Tools::setObject(attribute(), anObject, aShape, + myWorkshop, myIsInValidate, true); } //******************************************************************** void ModuleBase_WidgetSelector::deactivate() { - ModuleBase_ModelWidget::deactivate(); - disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); - activateSelectionAndFilters(false); - ModuleBase_ModelWidget::deactivate(); + ModuleBase_WidgetValidated::deactivate(); + /// clear temporary cash + AttributePtr anAttribute = attribute(); + if (!anAttribute.get()) + return; + std::string aType = anAttribute->attributeType(); + if (anAttribute->attributeType() == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr aSelectAttr = + std::dynamic_pointer_cast(anAttribute); + aSelectAttr->removeTemporaryValues(); + } + else if (anAttribute->attributeType() == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectAttr = + std::dynamic_pointer_cast(anAttribute); + aSelectAttr->removeTemporaryValues(); + } } //********************************************************************