X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Operation.cpp;h=853d9fc5fd6503ac65c83b7d8cd0fa8204ad9984;hb=d0add0e964478b0c8f08a577ffe3a8dc0a7fd60d;hp=701b6a0cce5e7eed85be957a3507d9e0c4c9b12d;hpb=8c61cbe058ed744affb3ae76379c8f3ce1d1cdf2;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Operation.cpp b/src/ModuleBase/ModuleBase_Operation.cpp index 701b6a0cc..853d9fc5f 100644 --- a/src/ModuleBase/ModuleBase_Operation.cpp +++ b/src/ModuleBase/ModuleBase_Operation.cpp @@ -39,7 +39,6 @@ ModuleBase_Operation::ModuleBase_Operation(const QString& theId, QObject* theParent) : QObject(theParent), - myIsEditing(false), myIsModified(false), myPropertyPanel(NULL) { @@ -49,122 +48,43 @@ ModuleBase_Operation::ModuleBase_Operation(const QString& theId, QObject* thePar ModuleBase_Operation::~ModuleBase_Operation() { delete myDescription; - clearPreselection(); } -QString ModuleBase_Operation::id() const -{ - return getDescription()->operationId(); -} - -FeaturePtr ModuleBase_Operation::feature() const -{ - return myFeature; -} - -bool ModuleBase_Operation::isValid() const +const QStringList& ModuleBase_Operation::grantedOperationIds() const { - if (!myFeature || !myFeature->data()->isValid()) - return true; // rename operation - if (myFeature->isAction()) - return true; - //Get validators for the Id - SessionPtr aMgr = ModelAPI_Session::get(); - ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - bool aValid = aFactory->validate(myFeature); - - // the feature exec state should be checked in order to do not apply features, which result can not - // be built. E.g. extrusion on sketch, where the "to" is a perpendicular plane to the sketch - bool isDone = ( myFeature->data()->execState() == ModelAPI_StateDone - || myFeature->data()->execState() == ModelAPI_StateMustBeUpdated ); - - return aValid && isDone; + return myGrantedIds; } - -bool ModuleBase_Operation::canBeCommitted() const +void ModuleBase_Operation::setGrantedOperationIds(const QStringList& theList) { - return isValid(); + myGrantedIds = theList; } -FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) +QString ModuleBase_Operation::id() const { - if (myParentFeature.get()) { - myFeature = myParentFeature->addFeature(getDescription()->operationId().toStdString()); - } else { - std::shared_ptr aDoc = ModelAPI_Session::get()->activeDocument(); - myFeature = aDoc->addFeature(getDescription()->operationId().toStdString()); - } - if (myFeature) { // TODO: generate an error if feature was not created - myIsModified = true; - // Model update should call "execute" of a feature. - //myFeature->execute(); - // Init default values - /*QList aWidgets = getDescription()->modelWidgets(); - QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); - for (; anIt != aLast; anIt++) { - (*anIt)->storeValue(aFeature); - }*/ - } - - if (theFlushMessage) - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); - return myFeature; + return getDescription()->operationId(); } -void ModuleBase_Operation::setFeature(FeaturePtr theFeature) +bool ModuleBase_Operation::isValid() const { - myFeature = theFeature; - myIsEditing = true; + return true; } -bool ModuleBase_Operation::hasObject(ObjectPtr theObj) const +bool ModuleBase_Operation::canBeCommitted() const { - FeaturePtr aFeature = feature(); - if (aFeature) { - if (aFeature == theObj) - return true; - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - if (theObj == (*aIt)) - return true; - } - } - return false; + return isValid(); } -void ModuleBase_Operation::start() +bool ModuleBase_Operation::start() { myIsModified = false; - QString anId = getDescription()->operationId(); - if (myIsEditing) { - anId = anId.append(EditSuffix()); - } - ModelAPI_Session::get()->startOperation(anId.toStdString()); - - if (!myIsEditing) { - FeaturePtr aFeature = createFeature(); - // if the feature is not created, there is no sense to start the operation - if (aFeature.get() == NULL) { - // it is necessary to abor the operation in the session and emit the aborted signal - // in order to update commands status in the workshop, to be exact the feature action - // to be unchecked - abort(); - return; - } - } - /// Set current feature and remeber old current feature - if (myIsEditing) { - SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aDoc = aMgr->activeDocument(); - myCurrentFeature = aDoc->currentFeature(true); - aDoc->setCurrentFeature(feature(), false); - } + + ModelAPI_Session::get()->startOperation(id().toStdString()); startOperation(); emit started(); + return true; } void ModuleBase_Operation::postpone() @@ -183,44 +103,18 @@ void ModuleBase_Operation::abort() { // the viewer update should be blocked in order to avoid the features blinking before they are // hidden - std::shared_ptr aMsg = std::shared_ptr( - new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED))); - Events_Loop::loop()->send(aMsg); - - // the widgets of property panel should not process any events come from data mode - // after abort clicked. Some signal such as redisplay/create influence on content - // of the object browser and viewer context. Therefore it influence to the current - // selection and if the active widget listens it, the attribute value is errnoneous - // changed. - if (myPropertyPanel) - myPropertyPanel->cleanContent(); - - SessionPtr aMgr = ModelAPI_Session::get(); - if (myIsEditing) { - DocumentPtr aDoc = aMgr->activeDocument(); - bool aIsOp = aMgr->isOperation(); - if (!aIsOp) - aMgr->startOperation(); - aDoc->setCurrentFeature(myCurrentFeature, true); - if (!aIsOp) - aMgr->finishOperation(); - myCurrentFeature = FeaturePtr(); - } - abortOperation(); + //std::shared_ptr aMsg = std::shared_ptr( + // new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED))); + //Events_Loop::loop()->send(aMsg); - stopOperation(); - // is is necessary to deactivate current widgets before the model operation is aborted - // because abort removes the feature and activated filters should not check it - propertyPanel()->cleanContent(); + ModelAPI_Session::get()->abortOperation(); - aMgr->abortOperation(); emit stopped(); // the viewer update should be unblocked in order to avoid the features blinking before they are // hidden - aMsg = std::shared_ptr( - new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED))); - - Events_Loop::loop()->send(aMsg); + //aMsg = std::shared_ptr( + // new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED))); + //Events_Loop::loop()->send(aMsg); emit aborted(); } @@ -228,26 +122,8 @@ void ModuleBase_Operation::abort() bool ModuleBase_Operation::commit() { if (canBeCommitted()) { - // the widgets of property panel should not process any events come from data mode - // after commit clicked. Some signal such as redisplay/create influence on content - // of the object browser and viewer context. Therefore it influence to the current - // selection and if the active widget listens it, the attribute value is errnoneous - // changed. - if (myPropertyPanel) - myPropertyPanel->cleanContent(); - SessionPtr aMgr = ModelAPI_Session::get(); - /// Set current feature and remeber old current feature - if (myIsEditing) { - DocumentPtr aDoc = aMgr->activeDocument(); - bool aIsOp = aMgr->isOperation(); - if (!aIsOp) - aMgr->startOperation(); - aDoc->setCurrentFeature(myCurrentFeature, true); - if (!aIsOp) - aMgr->finishOperation(); - myCurrentFeature = FeaturePtr(); - } + commitOperation(); aMgr->finishOperation(); @@ -266,143 +142,23 @@ void ModuleBase_Operation::onValuesChanged() myIsModified = true; } -void ModuleBase_Operation::commitOperation() -{ - if(!myPropertyPanel) { - return; - } -} - -void ModuleBase_Operation::activateByPreselection() +void ModuleBase_Operation::onValueStateChanged(int thePreviousState) { - if (myPreSelection.empty()) - return; - - ModuleBase_ModelWidget* aFilledWgt = 0; - if (myPropertyPanel) { - const QList& aWidgets = myPropertyPanel->modelWidgets(); - if (!aWidgets.empty()) { - ModuleBase_ModelWidget* aWgt = 0; - QList::const_iterator aWIt; - bool isSet = false; - // 1. apply the selection to controls - for (aWIt = aWidgets.constBegin(); aWIt != aWidgets.constEnd(); ++aWIt) { - aWgt = (*aWIt); - if (!aWgt->canSetValue()) - continue; - myPropertyPanel->setPreselectionWidget(aWgt); - if (!aWgt->setSelection(myPreSelection, true)) { - isSet = false; - break; - } else { - isSet = true; - aFilledWgt = aWgt; - } - } - myPropertyPanel->setPreselectionWidget(NULL); - // in order to redisplay object in the viewer, the update/redisplay signals should be flushed - // it is better to perform it not in setSelection of each widget, but do it here, - // after the preselection is processed - ModuleBase_ModelWidget::updateObject(myFeature); - - // 3. a signal should be emitted before the next widget activation - // because, the activation of the next widget will give a focus to the widget. As a result - // the value of the widget is initialized. And commit may happens until the value is entered. - if (aFilledWgt) - emit activatedByPreselection(); + if (propertyPanel()) { + ModuleBase_ModelWidget* aWidget = propertyPanel()->activeWidget(); + if (aWidget) { + if (aWidget->getValueState() == ModuleBase_ModelWidget::ModifiedInPP) + myIsModified = true; } - // 4. activate the next obligatory widget - myPropertyPanel->activateNextWidget(aFilledWgt); } - - clearPreselection(); -} - -void ModuleBase_Operation::setParentFeature(CompositeFeaturePtr theParent) -{ - myParentFeature = theParent; -} - -CompositeFeaturePtr ModuleBase_Operation::parentFeature() const -{ - return myParentFeature; } -void ModuleBase_Operation::initSelection(ModuleBase_ISelection* theSelection, - ModuleBase_IViewer* theViewer) +void ModuleBase_Operation::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) { - clearPreselection(); - - QList aPreSelected; - // Check that the selected result are not results of operation feature - FeaturePtr aFeature = feature(); - if (aFeature) { - QList aSelected = theSelection->getSelected(ModuleBase_ISelection::AllControls); - - std::list aResults = aFeature->results(); - QObjectPtrList aResList; - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) - aResList.append(*aIt); - - foreach (ModuleBase_ViewerPrs aPrs, aSelected) { - if ((!aResList.contains(aPrs.object())) && (aPrs.object() != aFeature)) - aPreSelected.append(aPrs); - } - } else - aPreSelected = theSelection->getSelected(ModuleBase_ISelection::AllControls); - - // convert the selection values to the values, which are set to the operation widgets - - //Handle(V3d_View) aView = theViewer->activeView(); - //foreach (ModuleBase_ViewerPrs aPrs, aPreSelected) { - // ModuleBase_WidgetValueFeature* aValue = new ModuleBase_WidgetValueFeature(); - // aValue->setObject(aPrs.object()); - - // double aX, anY; - // if (getViewerPoint(aPrs, theViewer, aX, anY)) - // aValue->setPoint(std::shared_ptr(new GeomAPI_Pnt2d(aX, anY))); - // myPreSelection.append(aValue); - //} - myPreSelection = aPreSelected; -} - - -bool ModuleBase_Operation::getViewerPoint(ModuleBase_ViewerPrs thePrs, - ModuleBase_IViewer* theViewer, - double& theX, double& theY) -{ - return false; -} - -void ModuleBase_Operation::clearPreselection() -{ - myPreSelection.clear(); -} - -void ModuleBase_Operation::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) -{ - myPropertyPanel = theProp; - myPropertyPanel->setEditingMode(isEditOperation()); - - if (myPropertyPanel) { - const QList& aWidgets = myPropertyPanel->modelWidgets(); - QList::const_iterator aWIt; - for (aWIt = aWidgets.constBegin(); aWIt != aWidgets.constEnd(); ++aWIt) { - ModuleBase_ModelWidget* aWgt = (*aWIt); - connect(aWgt, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged())); - } - } - - // Do not activate widgets by default if the current operation is editing operation - // Because we don't know which widget is going to be edited. - if (!isEditOperation()) { - // 4. activate the first obligatory widget - myPropertyPanel->activateNextWidget(NULL); - } + myPropertyPanel = theProp; } bool ModuleBase_Operation::isGranted(QString theId) const { - return myNestedFeatures.contains(theId); + return myGrantedIds.contains(theId); }