X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetShapeSelector.cpp;h=ec7defe2285bb1eff1724dc7da1695db04907e54;hb=8d1e5f9c51d0acd4b39ef3ad24b1daae43756e16;hp=3d376aacea74c20b135de20aae5fbdfdc5943044;hpb=a4702753c7da76a6434c9458f11ffce426be6e75;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetShapeSelector.cpp b/src/ModuleBase/ModuleBase_WidgetShapeSelector.cpp index 3d376aace..ec7defe22 100644 --- a/src/ModuleBase/ModuleBase_WidgetShapeSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetShapeSelector.cpp @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include @@ -127,39 +127,45 @@ ModuleBase_WidgetShapeSelector::~ModuleBase_WidgetShapeSelector() //******************************************************************** bool ModuleBase_WidgetShapeSelector::storeValueCustom() const { - FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(mySelectedObject); + // the value is stored on the selection changed signal processing + return true; +} + +//******************************************************************** +bool ModuleBase_WidgetShapeSelector::storeAttributeValues(ObjectPtr theSelectedObject, + GeomShapePtr theShape) const +{ + bool isChanged = false; + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(theSelectedObject); if (aSelectedFeature == myFeature) // In order to avoid selection of the same object - return false; + return isChanged; DataPtr aData = myFeature->data(); AttributeReferencePtr aRef = aData->reference(attributeID()); if (aRef) { ObjectPtr aObject = aRef->value(); - if (!(aObject && aObject->isSame(mySelectedObject))) { - aRef->setValue(mySelectedObject); - updateObject(myFeature); - return true; + if (!(aObject && aObject->isSame(theSelectedObject))) { + aRef->setValue(theSelectedObject); + isChanged = true; } } else { AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID()); if (aRefAttr) { ObjectPtr aObject = aRefAttr->object(); - if (!(aObject && aObject->isSame(mySelectedObject))) { - aRefAttr->setObject(mySelectedObject); - updateObject(myFeature); - return true; + if (!(aObject && aObject->isSame(theSelectedObject))) { + aRefAttr->setObject(theSelectedObject); + isChanged = true; } } else { AttributeSelectionPtr aSelectAttr = aData->selection(attributeID()); - ResultPtr aBody = std::dynamic_pointer_cast(mySelectedObject); - if (aSelectAttr && aBody && (myShape.get() != NULL)) { - aSelectAttr->setValue(aBody, myShape); - updateObject(myFeature); - return true; + ResultPtr aBody = std::dynamic_pointer_cast(theSelectedObject); + if (aSelectAttr && aBody && (theShape.get() != NULL)) { + aSelectAttr->setValue(aBody, theShape); + isChanged = true; } } } - return false; + return isChanged; } //******************************************************************** @@ -185,27 +191,10 @@ void ModuleBase_WidgetShapeSelector::clearAttribute() //******************************************************************** bool ModuleBase_WidgetShapeSelector::restoreValue() { - DataPtr aData = myFeature->data(); bool isBlocked = this->blockSignals(true); - - AttributeSelectionPtr aSelect = aData->selection(attributeID()); - if (aSelect) { - mySelectedObject = aSelect->context(); - myShape = aSelect->value(); - } else { - AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID()); - if (aRefAttr) { - mySelectedObject = aRefAttr->object(); - } else { - AttributeReferencePtr aRef = aData->reference(attributeID()); - if (aRef) { - mySelectedObject = aRef->value(); - } - } - } updateSelectionName(); - this->blockSignals(isBlocked); + return true; } @@ -235,7 +224,8 @@ void ModuleBase_WidgetShapeSelector::onSelectionChanged() bool ModuleBase_WidgetShapeSelector::setSelection(ModuleBase_ViewerPrs theValue) { ObjectPtr aObject = theValue.object(); - if ((!mySelectedObject) && (!aObject)) + ObjectPtr aCurrentObject = getObject(myFeature->attribute(attributeID())); + if ((!aCurrentObject) && (!aObject)) return false; // Check that the selected object is result (others can not be accepted) @@ -297,9 +287,10 @@ bool ModuleBase_WidgetShapeSelector::setSelection(ModuleBase_ViewerPrs theValue) //******************************************************************** void ModuleBase_WidgetShapeSelector::setObject(ObjectPtr theObj, std::shared_ptr theShape) { - mySelectedObject = theObj; - myShape = theShape; - if (mySelectedObject) { + if (storeAttributeValues(theObj, theShape)) + updateObject(myFeature); + + if (theObj) { raisePanel(); } updateSelectionName(); @@ -347,21 +338,61 @@ bool ModuleBase_WidgetShapeSelector::acceptSubShape(std::shared_ptrattributeType(); + if (anAttrType == ModelAPI_AttributeRefAttr::type()) { + AttributeRefAttrPtr anAttr = std::dynamic_pointer_cast(theAttribute); + if (anAttr != NULL && anAttr->isObject()) + anObject = anAttr->object(); + } + if (anAttrType == ModelAPI_AttributeSelection::type()) { + AttributeSelectionPtr anAttr = std::dynamic_pointer_cast(theAttribute); + if (anAttr != NULL && anAttr->isInitialized()) + anObject = anAttr->context(); + } + if (anAttrType == ModelAPI_AttributeReference::type()) { + AttributeReferencePtr anAttr = std::dynamic_pointer_cast(theAttribute); + if (anAttr.get() != NULL && anAttr->isInitialized()) + anObject = anAttr->value(); + } + return anObject; +} + + +//******************************************************************** +GeomShapePtr ModuleBase_WidgetShapeSelector::getShape() const +{ + GeomShapePtr aShape; + DataPtr aData = myFeature->data(); + if (aData.get() == NULL) + return aShape; + + AttributeSelectionPtr aSelect = aData->selection(attributeID()); + if (aSelect) + aShape = aSelect->value(); + + return aShape; +} + //******************************************************************** void ModuleBase_WidgetShapeSelector::updateSelectionName() { DataPtr aData = myFeature->data(); + if (aData.get() == NULL) + return; + bool isNameUpdated = false; - if (aData.get() != NULL) { - AttributeSelectionPtr aSelect = aData->selection(attributeID()); - if (aSelect) { - myTextLine->setText(QString::fromStdString(aSelect->namingName())); - isNameUpdated = true; - } + AttributeSelectionPtr aSelect = aData->selection(attributeID()); + if (aSelect) { + myTextLine->setText(QString::fromStdString(aSelect->namingName())); + isNameUpdated = true; } if (!isNameUpdated) { - if (mySelectedObject) { - std::string aName = mySelectedObject->data()->name(); + ObjectPtr anObject = getObject(myFeature->attribute(attributeID())); + if (anObject.get() != NULL) { + std::string aName = anObject->data()->name(); myTextLine->setText(QString::fromStdString(aName)); } else { if (myIsActive) { @@ -417,6 +448,41 @@ void ModuleBase_WidgetShapeSelector::activateCustom() activateSelection(true); } +//******************************************************************** +void ModuleBase_WidgetShapeSelector::backupAttributeValue(const bool isBackup) +{ + DataPtr aData = myFeature->data(); + AttributePtr anAttribute = myFeature->attribute(attributeID()); + + if (isBackup) { + myObject = getObject(anAttribute); + myShape = getShape(); + myRefAttribute = NULL; + myIsObject = false; + AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID()); + if (aRefAttr) { + myIsObject = aRefAttr->isObject(); + myRefAttribute = aRefAttr->attr(); + } + } + else { + storeAttributeValues(myObject, myShape); + AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID()); + if (aRefAttr) { + if (myIsObject) + aRefAttr->setObject(myObject); + else + aRefAttr->setAttr(myRefAttribute); + } + } +} + +//******************************************************************** +void ModuleBase_WidgetShapeSelector::setSelection(const Handle_SelectMgr_EntityOwner& theOwner) +{ + +} + //******************************************************************** void ModuleBase_WidgetShapeSelector::deactivate() { @@ -437,28 +503,30 @@ bool ModuleBase_WidgetShapeSelector::isValid(ObjectPtr theObj, std::shared_ptr > anArguments; aFactory->validators(parentID(), attributeID(), aValidators, anArguments); - // Check the acceptability of the object as attribute + DataPtr aData = myFeature->data(); + AttributePtr anAttribute = myFeature->attribute(attributeID()); + + // 1. make a backup of the previous attribute values + backupAttributeValue(true); + // 2. store the current values, disable the model's update + aData->blockSendAttributeUpdated(true); + + // 3. check the acceptability of the current values std::list::iterator aValidator = aValidators.begin(); std::list >::iterator aArgs = anArguments.begin(); - for (; aValidator != aValidators.end(); aValidator++, aArgs++) { - const ModelAPI_RefAttrValidator* aAttrValidator = - dynamic_cast(*aValidator); + bool aValid = true; + for (; aValidator != aValidators.end() && aValid; aValidator++, aArgs++) { + const ModelAPI_AttributeValidator* aAttrValidator = + dynamic_cast(*aValidator); if (aAttrValidator) { - if (!aAttrValidator->isValid(myFeature, *aArgs, theObj)) { - return false; - } - } - else { - const ModelAPI_ShapeValidator* aShapeValidator = - dynamic_cast(*aValidator); - if (aShapeValidator) { - DataPtr aData = myFeature->data(); - AttributeSelectionPtr aSelectAttr = aData->selection(attributeID()); - if (!aShapeValidator->isValid(myFeature, *aArgs, theObj, aSelectAttr, theShape)) { - return false; - } - } + aValid = aAttrValidator->isValid(anAttribute, *aArgs); } } - return true; + + // 4. if the values are not valid, restore the previous values to the attribute + backupAttributeValue(false); + + // 5. enable the model's update + aData->blockSendAttributeUpdated(false); + return aValid; }