-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-// File: ModuleBase_WidgetShapeSelector.h
+// File: ModuleBase_WidgetShapeSelector.cpp
// Created: 2 June 2014
// Author: Vitaly Smetannikov
#include <ModelAPI_AttributeRefAttr.h>
#include <ModelAPI_Validator.h>
#include <ModelAPI_AttributeValidator.h>
-#include <ModelAPI_ShapeValidator.h>
#include <Config_WidgetAPI.h>
#include <Events_Error.h>
#include <list>
#include <string>
-
ModuleBase_WidgetShapeSelector::ModuleBase_WidgetShapeSelector(QWidget* theParent,
ModuleBase_IWorkshop* theWorkshop,
const Config_WidgetAPI* theData,
const std::string& theParentId)
- : ModuleBase_WidgetValidated(theParent, theData, theParentId),
- myWorkshop(theWorkshop)
+ : ModuleBase_WidgetSelector(theParent, theWorkshop, theData, theParentId)
{
QFormLayout* aLayout = new QFormLayout(this);
ModuleBase_Tools::adjustMargins(aLayout);
//********************************************************************
ModuleBase_WidgetShapeSelector::~ModuleBase_WidgetShapeSelector()
{
- activateSelection(false);
- activateFilters(myWorkshop, false);
}
//********************************************************************
}
//********************************************************************
-bool ModuleBase_WidgetShapeSelector::setObject(ObjectPtr theSelectedObject,
+void ModuleBase_WidgetShapeSelector::setObject(ObjectPtr theSelectedObject,
GeomShapePtr theShape)
{
- bool isChanged = false;
- FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(theSelectedObject);
- if (aSelectedFeature == myFeature) // In order to avoid selection of the same object
- return isChanged;
-
DataPtr aData = myFeature->data();
AttributeReferencePtr aRef = aData->reference(attributeID());
if (aRef) {
ObjectPtr aObject = aRef->value();
if (!(aObject && aObject->isSame(theSelectedObject))) {
aRef->setValue(theSelectedObject);
- isChanged = true;
}
} else {
AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
ObjectPtr aObject = aRefAttr->object();
if (!(aObject && aObject->isSame(theSelectedObject))) {
aRefAttr->setObject(theSelectedObject);
- isChanged = true;
}
} else {
AttributeSelectionPtr aSelectAttr = aData->selection(attributeID());
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theSelectedObject);
if (aSelectAttr.get() != NULL) {
aSelectAttr->setValue(aResult, theShape);
- isChanged = true;
}
}
}
- return isChanged;
}
//********************************************************************
//********************************************************************
void ModuleBase_WidgetShapeSelector::clearAttribute()
{
- DataPtr aData = myFeature->data();
- AttributeSelectionPtr aSelect = aData->selection(attributeID());
- if (aSelect) {
- aSelect->setValue(ResultPtr(), std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape()));
- return;
- }
- AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
- if (aRefAttr) {
- aRefAttr->setObject(ObjectPtr());
- return;
- }
- AttributeReferencePtr aRef = aData->reference(attributeID());
- if (aRef) {
- aRef->setObject(ObjectPtr());
- }
+ // In order to make reselection possible, set empty object and shape should be done
+ setObject(ObjectPtr(), std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape()));
}
//********************************************************************
-bool ModuleBase_WidgetShapeSelector::restoreValue()
+bool ModuleBase_WidgetShapeSelector::restoreValueCustom()
{
bool isBlocked = this->blockSignals(true);
updateSelectionName();
return aControls;
}
-//********************************************************************
-void ModuleBase_WidgetShapeSelector::onSelectionChanged()
+void ModuleBase_WidgetShapeSelector::updateFocus()
{
- // In order to make reselection possible, set empty object and shape should be done
- setObject(ObjectPtr(), std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape()));
-
- bool aHasObject = false;
- QList<ModuleBase_ViewerPrs> aSelectedPrs = getSelectedEntitiesOrObjects(myWorkshop->selection());
- if (!aSelectedPrs.empty()) {
- ModuleBase_ViewerPrs aPrs = aSelectedPrs.first();
- if (!aPrs.isEmpty() && isValidSelection(aPrs)) {
- setSelectionCustom(aPrs);
- aHasObject = true;
- }
- }
- // 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);
- // the widget loses the focus only if the selected object is set
- if (aHasObject)
- emit focusOutWidget(this);
+ emit focusOutWidget(this);
}
//********************************************************************
-bool ModuleBase_WidgetShapeSelector::acceptSubShape(std::shared_ptr<GeomAPI_Shape> theShape) const
+QIntList ModuleBase_WidgetShapeSelector::getShapeTypes() const
{
- TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
- foreach (QString aType, myShapeTypes) {
- if (aShape.ShapeType() == ModuleBase_Tools::shapeType(aType))
- return true;
+ QIntList aShapeTypes;
+ foreach(QString aType, myShapeTypes) {
+ aShapeTypes.append(ModuleBase_Tools::shapeType(aType));
}
- return false;
+ return aShapeTypes;
}
//********************************************************************
{
GeomShapePtr aShape;
DataPtr aData = myFeature->data();
- if (aData.get() == NULL)
+ if (!aData->isValid())
return aShape;
AttributeSelectionPtr aSelect = aData->selection(attributeID());
void ModuleBase_WidgetShapeSelector::updateSelectionName()
{
DataPtr aData = myFeature->data();
- if (aData.get() == NULL)
+ if (!aData->isValid())
return;
bool isNameUpdated = false;
}
}
-
-//********************************************************************
-void ModuleBase_WidgetShapeSelector::activateSelection(bool toActivate)
-{
- updateSelectionName();
-
- if (toActivate) {
- QIntList aList;
- foreach (QString aType, myShapeTypes) {
- aList.append(ModuleBase_Tools::shapeType(aType));
- }
- myWorkshop->activateSubShapesSelection(aList);
- } else {
- myWorkshop->deactivateSubShapesSelection();
- }
-}
-
-//********************************************************************
-void ModuleBase_WidgetShapeSelector::raisePanel() const
-{
- QWidget* aParent = this->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();
- }
-}
-
-//********************************************************************
-void ModuleBase_WidgetShapeSelector::activateCustom()
-{
- connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
- activateSelection(true);
-
- // Restore selection in the viewer by the attribute selection list
- myWorkshop->setSelected(getAttributeSelection());
-
- activateFilters(myWorkshop, true);
-}
-
//********************************************************************
void ModuleBase_WidgetShapeSelector::storeAttributeValue()
{
+ ModuleBase_WidgetValidated::storeAttributeValue();
+
DataPtr aData = myFeature->data();
AttributePtr anAttribute = myFeature->attribute(attributeID());
//********************************************************************
void ModuleBase_WidgetShapeSelector::restoreAttributeValue(bool theValid)
{
+ ModuleBase_WidgetValidated::restoreAttributeValue(theValid);
+
DataPtr aData = myFeature->data();
AttributePtr anAttribute = myFeature->attribute(attributeID());
aRefAttr->setAttr(myRefAttribute);
}
}
-
-//********************************************************************
-bool ModuleBase_WidgetShapeSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs)
-{
- bool isDone = false;
-
- // It should be checked by corresponded validator
- ObjectPtr aObject = thePrs.object();
- ObjectPtr aCurrentObject = GeomValidators_Tools::getObject(myFeature->attribute(attributeID()));
- /*
- if ((!aCurrentObject) && (!aObject))
- return false;*/
-
- // It should be checked by corresponded validator
- // Check that the selected object is result (others can not be accepted)
- ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aObject);
- if (!aRes)
- return false;
- /*if (myFeature) {
- // We can not select a result of our feature
- const std::list<std::shared_ptr<ModelAPI_Result>>& aResList = myFeature->results();
- std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aIt;
- for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) {
- if ((*aIt) == aRes)
- return false;
- }
- }
- */
- // It should be checked by corresponded validator
- /*
- // Check that object belongs to active document or PartSet
- DocumentPtr aDoc = aRes->document();
- SessionPtr aMgr = ModelAPI_Session::get();
- if (!(aDoc == aMgr->activeDocument()) && !(aDoc == aMgr->moduleDocument()))
- return false;*/
-
- // It should be checked by corresponded validator
- // Check that the result has a shape
- GeomShapePtr aShape = ModelAPI_Tools::shape(aRes);
- if (!aShape)
- return false;
-
- // Get sub-shapes from local selection
- if (!thePrs.shape().IsNull()) {
- aShape = std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape());
- aShape->setImpl(new TopoDS_Shape(thePrs.shape()));
- }
- // Check that the selection corresponds to selection type
- if (!acceptSubShape(aShape))
- return false;
-
- setObject(aObject, aShape);
- return true;
-}
-
-//********************************************************************
-void ModuleBase_WidgetShapeSelector::deactivate()
-{
- activateSelection(false);
- activateFilters(myWorkshop, false);
- disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
-}