+AttributePtr PartSet_WidgetSketchCreator::attribute() const
+{
+ AttributePtr anAttribute;
+ if (myIsCustomAttribute)
+ anAttribute = myFeature->attribute(myAttributeListID);
+ else
+ anAttribute = ModuleBase_WidgetSelector::attribute();
+
+ return anAttribute;
+}
+
+//********************************************************************
+void PartSet_WidgetSketchCreator::openExtrusionTransaction()
+{
+ SessionPtr aMgr = ModelAPI_Session::get();
+ bool aIsOp = aMgr->isOperation();
+ if (!aIsOp) {
+ const static std::string aNestedOpID("Parameters modification");
+ aMgr->startOperation(aNestedOpID, true);
+ }
+}
+
+//********************************************************************
+bool PartSet_WidgetSketchCreator::isValidSelection(const ModuleBase_ViewerPrsPtr& theValue)
+{
+ bool aValid = false;
+ if (myIsCustomAttribute) {
+ // check only suiting of the value to custom attribute (myAttributeListID)
+ // do not cash of validation to avoid using states, stored for XML attribute
+ // there is an alternative is to call clearValidatedCash() in setSelection()
+ aValid = isValidSelectionForAttribute(theValue, attribute());
+ }
+ else { /// if the validated attribute is already custom
+ if (getValidState(theValue, aValid)) {
+ return aValid;
+ }
+ aValid = isValidSelectionCustom(theValue);
+ if (!aValid)
+ // check selection to create new sketh (XML current attribute)
+ aValid = isValidSelectionForAttribute(theValue, attribute());
+ if (!aValid) {
+ // check selection to fill list attribute (myAttributeListID)
+ bool isCustomAttribute = myIsCustomAttribute;
+ myIsCustomAttribute = true;
+ aValid = isValidSelectionForAttribute(theValue, attribute());
+ myIsCustomAttribute = isCustomAttribute;
+ }
+ }
+ storeValidState(theValue, aValid);
+ return aValid;
+}
+
+//********************************************************************
+bool PartSet_WidgetSketchCreator::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& theValue)
+{
+ return PartSet_WidgetSketchLabel::canFillSketch(theValue);
+}
+
+void PartSet_WidgetSketchCreator::activateSelectionControl()
+{
+ // reset previously set size of view needed on restart extrusion after Sketch
+ if (myModule->sketchMgr()->previewSketchPlane()->isUseSizeOfView())
+ myModule->sketchMgr()->previewSketchPlane()->setSizeOfView(0, false);
+
+ // we need to call activate here as the widget has no focus accepted controls
+ // if these controls are added here, activate will happens automatically after focusIn()
+ XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
+ XGUI_PropertyPanel* aPanel = aWorkshop->propertyPanel();
+ aPanel->activateWidget(this, false);
+}
+
+void PartSet_WidgetSketchCreator::setVisibleSelectionControl(const bool theSelectionControl)
+{
+ // hide current widget, activate the next widget
+ XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
+ XGUI_PropertyPanel* aPanel = aWorkshop->propertyPanel();
+ const QList<ModuleBase_ModelWidget*>& aWidgets = aPanel->modelWidgets();
+ foreach(ModuleBase_ModelWidget* aWidget, aWidgets) {
+ if (theSelectionControl) { // hide other controls
+ if (aWidget != this)
+ aWidget->setVisible(false);
+ }
+ else { // hide current control
+ if (aWidget == this)
+ aWidget->setVisible(false);
+ else {
+ aWidget->setVisible(true);
+ if (aWidget->attributeID() == myAttributeListID)
+ setEnabledModelWidget(aWidget, !hasSubObjects());
+ }
+ }
+ }
+
+ if (theSelectionControl) {
+ bool aBodyIsVisualized = myPreviewPlanes->hasVisualizedBodies(myWorkshop);
+ bool aSketchIsVisualized = myPreviewPlanes->hasVisualizedSketch(myWorkshop);
+ if (!aBodyIsVisualized && !aSketchIsVisualized) {
+ // We have to select a plane before any operation
+ myPreviewPlanes->showPreviewPlanes(myWorkshop);
+ mySizeOfViewWidget->setVisible(true);
+ }
+ else {
+ mySizeOfViewWidget->setVisible(false);
+ }
+
+ } else {
+ bool aHidePreview = myPreviewPlanes->isPreviewDisplayed();
+ myPreviewPlanes->erasePreviewPlanes(myWorkshop);
+ if (aHidePreview)
+ aWorkshop->viewer()->update();
+ }
+}
+
+QIntList PartSet_WidgetSketchCreator::shapeTypes() const
+{
+ QIntList aShapeTypes;
+ foreach(QString aType, myShapeTypes) {
+ aShapeTypes.append(ModuleBase_Tools::shapeType(aType));
+ }
+ return aShapeTypes;
+}
+
+void PartSet_WidgetSketchCreator::setEditingMode(bool isEditing)
+{
+ ModuleBase_ModelWidget::setEditingMode(isEditing);
+ if (isEditing) {
+ setVisibleSelectionControl(false);
+
+ ModuleBase_ModelWidget* anAttributeListWidget = 0;
+ XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myModule->workshop());
+ XGUI_PropertyPanel* aPanel = aWorkshop->propertyPanel();
+ const QList<ModuleBase_ModelWidget*>& aWidgets = aPanel->modelWidgets();
+ foreach(ModuleBase_ModelWidget* aWidget, aWidgets) {
+ if (aWidget->attributeID() == myAttributeListID) {
+ anAttributeListWidget = aWidget;
+ break;
+ }
+ }
+ if (anAttributeListWidget)
+ setEnabledModelWidget(anAttributeListWidget, !hasSubObjects());
+ }
+}
+
+bool PartSet_WidgetSketchCreator::isSelectionMode() const
+{
+ AttributeSelectionListPtr anAttrList = myFeature->data()->selectionList(myAttributeListID);
+ bool aHasValueInList = anAttrList.get() && anAttrList->size() > 0;
+
+ return !aHasValueInList;
+}
+
+bool PartSet_WidgetSketchCreator::hasSubObjects() const
+{
+ bool aHasSubObjects = false;
+
+ bool aCanSetFocus = true;
+ CompositeFeaturePtr aComposite = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
+ if (aComposite.get())
+ aHasSubObjects = aComposite->numberOfSubs() > 0;
+ return aHasSubObjects;
+}
+
+bool PartSet_WidgetSketchCreator::setSelection(QList<ModuleBase_ViewerPrsPtr>& theValues,
+ const bool theToValidate)
+{
+ bool aDone = false;
+ if (!startSketchOperation(theValues)) {
+ myIsCustomAttribute = true;
+ QList<ModuleBase_ViewerPrsPtr>::const_iterator
+ anIt = theValues.begin(), aLast = theValues.end();
+ bool aProcessed = false;
+ for (; anIt != aLast; anIt++) {
+ ModuleBase_ViewerPrsPtr aValue = *anIt;
+ if (!theToValidate || isValidInFilters(aValue))
+ aProcessed = setSelectionCustom(aValue) || aProcessed;
+ }
+ myIsCustomAttribute = false;
+ aDone = aProcessed;
+ if (aProcessed) {
+ emit valuesChanged();
+ updateObject(myFeature);
+ setVisibleSelectionControl(false);
+ // manually deactivation because the widget was
+ // not activated as has no focus acceptin controls
+ deactivate();
+ emit focusOutWidget(this);
+ }
+ }
+ return aDone;
+}
+
+//********************************************************************
+bool PartSet_WidgetSketchCreator::processSelection()
+{
+ QList<ModuleBase_ViewerPrsPtr> aSelected = getFilteredSelected();
+ bool isDone = setSelection(aSelected, true/*false*/);
+
+ return isDone;
+}
+
+//********************************************************************
+void PartSet_WidgetSketchCreator::updateOnSelectionChanged(const bool theDone)