X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelector.cpp;h=e2233ab7c96229ed3866d3d88f9117bd93a94184;hb=1a0d48211014d96db9125fe973eacbae895c4490;hp=ff187372cba1b6fe19dc775ae560d1380d20e665;hpb=cd9217d7e87997ec8bc150a6d8c389e742ca0f84;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelector.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp old mode 100644 new mode 100755 index ff187372c..e2233ab7c --- a/src/ModuleBase/ModuleBase_WidgetSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelector.cpp @@ -1,96 +1,24 @@ -// File: ModuleBase_WidgetSelector.h -// Created: 2 June 2014 -// Author: Vitaly Smetannikov +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -#include "ModuleBase_WidgetSelector.h" -#include "ModuleBase_IWorkshop.h" +// File: ModuleBase_WidgetSelector.cpp +// Created: 19 June 2015 +// Author: Natalia ERMOLAEVA -#include -#include -#include +#include -#include -#include -#include -#include -#include +#include +#include -#include +#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -typedef QMap ShapeTypes; -static ShapeTypes MyShapeTypes; - -TopAbs_ShapeEnum ModuleBase_WidgetSelector::shapeType(const QString& theType) -{ - if (MyShapeTypes.count() == 0) { - MyShapeTypes["face"] = TopAbs_FACE; - MyShapeTypes["vertex"] = TopAbs_VERTEX; - MyShapeTypes["wire"] = TopAbs_WIRE; - MyShapeTypes["edge"] = TopAbs_EDGE; - MyShapeTypes["shell"] = TopAbs_SHELL; - MyShapeTypes["solid"] = TopAbs_SOLID; - } - if (MyShapeTypes.contains(theType)) - return MyShapeTypes[theType]; - throw std::invalid_argument("Shape type defined in XML is not implemented!"); -} +#include ModuleBase_WidgetSelector::ModuleBase_WidgetSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, const std::string& theParentId) - : ModuleBase_ModelWidget(theParent, theData, theParentId), - myWorkshop(theWorkshop), - myActivateOnStart(false) + : ModuleBase_WidgetValidated(theParent, theWorkshop, theData, theParentId) { - myContainer = new QWidget(theParent); - QHBoxLayout* aLayout = new QHBoxLayout(myContainer); - - aLayout->setContentsMargins(0, 0, 0, 0); - QString aLabelText = QString::fromStdString(theData->widgetLabel()); - QString aLabelIcon = QString::fromStdString(theData->widgetIcon()); - myLabel = new QLabel(aLabelText, myContainer); - myLabel->setPixmap(QPixmap(aLabelIcon)); - - aLayout->addWidget(myLabel); - - QString aToolTip = QString::fromStdString(theData->widgetTooltip()); - myTextLine = new QLineEdit(myContainer); - myTextLine->setReadOnly(true); - myTextLine->setToolTip(aToolTip); - myTextLine->installEventFilter(this); - - aLayout->addWidget(myTextLine); - - myActivateBtn = new QToolButton(myContainer); - myActivateBtn->setIcon(QIcon(":icons/hand_point.png")); - myActivateBtn->setCheckable(true); - myActivateBtn->setToolTip(tr("Activate/Deactivate selection")); - connect(myActivateBtn, SIGNAL(toggled(bool)), this, SLOT(activateSelection(bool))); - - aLayout->addWidget(myActivateBtn); - - QString aActivateTxt = QString::fromStdString(theData->getProperty("activate")); - if (!aActivateTxt.isNull()) { - myActivateOnStart = (aActivateTxt == "true"); - } - - std::string aTypes = theData->getProperty("shape_types"); - myShapeTypes = QString(aTypes.c_str()).split(','); } //******************************************************************** @@ -98,168 +26,151 @@ ModuleBase_WidgetSelector::~ModuleBase_WidgetSelector() { } -//******************************************************************** -bool ModuleBase_WidgetSelector::storeValue() const +//TODO: nds stabilization hotfix +void ModuleBase_WidgetSelector::disconnectSignals() { - FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(mySelectedObject); - if (aSelectedFeature == myFeature) // In order to avoid selection of the same object - return false; - - DataPtr aData = myFeature->data(); - boost::shared_ptr aRef = boost::dynamic_pointer_cast< - ModelAPI_AttributeReference>(aData->attribute(attributeID())); - - ObjectPtr aObject = aRef->value(); - if (!(aObject && aObject->isSame(mySelectedObject))) { - aRef->setValue(mySelectedObject); - updateObject(myFeature); - } - return true; + disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); } //******************************************************************** -bool ModuleBase_WidgetSelector::restoreValue() +void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& thePrs, + ObjectPtr& theObject, + GeomShapePtr& theShape) { - DataPtr aData = myFeature->data(); - boost::shared_ptr aRef = aData->reference(attributeID()); - - bool isBlocked = this->blockSignals(true); - mySelectedObject = aRef->value(); - updateSelectionName(); - - this->blockSignals(isBlocked); - return true; + ModuleBase_ISelection* aSelection = myWorkshop->selection(); + theObject = aSelection->getResult(thePrs); + theShape = aSelection->getShape(thePrs); } //******************************************************************** -QList ModuleBase_WidgetSelector::getControls() const +void ModuleBase_WidgetSelector::onSelectionChanged() { - QList aControls; - aControls.append(myLabel); - aControls.append(myTextLine); - aControls.append(myActivateBtn); - return aControls; + clearAttribute(); + + QList aSelected = getFilteredSelected(); + + bool isDone = setSelection(aSelected, false); + emit valuesChanged(); + // the updateObject method should be called to flush the updated sigal. The workshop listens it, + // calls validators for the feature and, as a result, updates the Apply button state. + updateObject(myFeature); + + if (isDone) + updateFocus(); } //******************************************************************** -void ModuleBase_WidgetSelector::onSelectionChanged() +bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, + const ResultPtr& theResult) const { - QList aObjects = myWorkshop->selectedObjects(); - if (aObjects.size() > 0) { - ObjectPtr aObject = aObjects.first(); - if ((!mySelectedObject) && (!aObject)) - return; - if (mySelectedObject && aObject && mySelectedObject->isSame(aObject)) - return; + bool aValid = false; + GeomShapePtr aShape = theShape; + if (!aShape.get() && theResult.get()) { + if (theResult.get()) + aShape = theResult->shape(); + } + TopAbs_ShapeEnum aShapeType = TopAbs_SHAPE; + if (aShape.get()) { // Check that the selection corresponds to selection type - if (!isAccepted(aObject)) - return; + TopoDS_Shape aTopoShape = aShape->impl(); + aShapeType = aTopoShape.ShapeType(); + // for compounds check sub-shapes: it may be compound of needed type: + // Booleans may produce compounds of Solids + if (aShapeType == TopAbs_COMPOUND) { + for(TopoDS_Iterator aSubs(aTopoShape); aSubs.More(); aSubs.Next()) { + if (!aSubs.Value().IsNull()) { + TopAbs_ShapeEnum aSubType = aSubs.Value().ShapeType(); + if (aSubType == TopAbs_COMPOUND) { // compound of compound(s) + aShapeType = TopAbs_COMPOUND; + break; + } + if (aShapeType == TopAbs_COMPOUND) { + aShapeType = aSubType; + } else if (aShapeType != aSubType) { // compound of shapes of different types + aShapeType = TopAbs_COMPOUND; + break; + } + } + } + } + } - mySelectedObject = aObject; - if (mySelectedObject) { - updateSelectionName(); - myActivateBtn->setChecked(false); - raisePanel(); - } else { - myTextLine->setText(""); + QIntList aShapeTypes = getShapeTypes(); + QIntList::const_iterator anIt = aShapeTypes.begin(), aLast = aShapeTypes.end(); + for (; anIt != aLast; anIt++) { + if (aShapeType == *anIt) + aValid = true; + else if (*anIt == TopAbs_FACE) { + // try to process the construction shape only if there is no a selected shape in the viewer + if (!theShape.get() && theResult.get()) { + ResultConstructionPtr aCResult = + std::dynamic_pointer_cast(theResult); + aValid = aCResult.get() && aCResult->facesNum() > 0; + } } - emit valuesChanged(); } + return aValid; } //******************************************************************** -bool ModuleBase_WidgetSelector::isAccepted(const ObjectPtr theResult) const +void ModuleBase_WidgetSelector::activateSelection(bool toActivate) { - ResultPtr aResult = boost::dynamic_pointer_cast(theResult); - boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - if (!aShapePtr) - return false; - TopoDS_Shape aShape = aShapePtr->impl(); - if (aShape.IsNull()) - return false; + updateSelectionName(); - TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); - if (aShapeType == TopAbs_COMPOUND) { - foreach (QString aType, myShapeTypes) - { - TopExp_Explorer aEx(aShape, shapeType(aType)); - if (aEx.More()) - return true; - } + if (toActivate) { + myWorkshop->activateSubShapesSelection(getShapeTypes()); } else { - foreach (QString aType, myShapeTypes) - { - if (shapeType(aType) == aShapeType) - return true; - } + myWorkshop->deactivateSubShapesSelection(); } - return false; } //******************************************************************** -void ModuleBase_WidgetSelector::updateSelectionName() +void ModuleBase_WidgetSelector::activateCustom() { - if (mySelectedObject) { - std::string aName = mySelectedObject->data()->name(); + connect(myWorkshop, SIGNAL(selectionChanged()), this, + SLOT(onSelectionChanged()), Qt::UniqueConnection); + + activateSelection(true); - myTextLine->setText(QString::fromStdString(aName)); - } else - myTextLine->setText(""); -} + // Restore selection in the viewer by the attribute selection list + myWorkshop->setSelected(getAttributeSelection()); -//******************************************************************** -bool ModuleBase_WidgetSelector::eventFilter(QObject* theObj, QEvent* theEvent) -{ - if (theObj == myTextLine) { - if (theEvent->type() == QEvent::Polish) { - myActivateBtn->setChecked(myActivateOnStart); - onSelectionChanged(); - } - } - return ModuleBase_ModelWidget::eventFilter(theObj, theEvent); + activateFilters(true); } //******************************************************************** -void ModuleBase_WidgetSelector::enableOthersControls(bool toEnable) const +bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) { - QWidget* aParent = myContainer->parentWidget(); - QList aChldList = aParent->findChildren(); - foreach(QWidget* aWgt, aChldList) - { - if ((aWgt != myLabel) && (aWgt != myActivateBtn) && (aWgt != myTextLine) - && (aWgt != myContainer)) - aWgt->setEnabled(toEnable); + GeomShapePtr aShape = myWorkshop->selection()->getShape(thePrs); + ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); + bool aValid = acceptSubShape(aShape, aResult); + + if (aValid) { + // In order to avoid selection of the same object + ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aResult); + aValid = aSelectedFeature != myFeature; } + return aValid; } //******************************************************************** -void ModuleBase_WidgetSelector::activateSelection(bool toActivate) +bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) { - enableOthersControls(!toActivate); - myTextLine->setEnabled(toActivate); - - if (toActivate) - connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); - else - disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); + ObjectPtr anObject; + GeomShapePtr aShape; + getGeomSelection(thePrs, anObject, aShape); - myActivateBtn->setDown(toActivate); + setObject(anObject, aShape); + return true; } //******************************************************************** -void ModuleBase_WidgetSelector::raisePanel() const +void ModuleBase_WidgetSelector::deactivate() { - QWidget* aParent = myContainer->parentWidget(); - QWidget* aLastPanel = 0; - while (!aParent->inherits("QDockWidget")) { - aLastPanel = aParent; - aParent = aParent->parentWidget(); - if (!aParent) - return; - } - if (aParent->inherits("QDockWidget")) { - QDockWidget* aTabWgt = (QDockWidget*) aParent; - aTabWgt->raise(); - } + disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); + activateSelection(false); + activateFilters(false); } +