X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Operation.cpp;h=459af0553e89d741c535125a0c1013a4a416b1aa;hb=053bed33433b464fc9dc4f876310cb7b344b3031;hp=896da097e6160d7f73ed867ea9b9c3a5dc48869d;hpb=758a57d77b6fa3a0485fa3378a1280c7e87a74aa;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Operation.cpp b/src/ModuleBase/ModuleBase_Operation.cpp index 896da097e..459af0553 100644 --- a/src/ModuleBase/ModuleBase_Operation.cpp +++ b/src/ModuleBase/ModuleBase_Operation.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + /* * ModuleBase_Operation.cpp * @@ -9,10 +11,10 @@ #include "ModuleBase_OperationDescription.h" #include "ModuleBase_ModelWidget.h" -#include "ModuleBase_WidgetValueFeature.h" #include "ModuleBase_ViewerPrs.h" #include "ModuleBase_IPropertyPanel.h" #include "ModuleBase_ISelection.h" +#include "ModuleBase_IViewer.h" #include #include @@ -29,6 +31,8 @@ #include +#include + #ifdef _DEBUG #include #endif @@ -45,6 +49,7 @@ ModuleBase_Operation::ModuleBase_Operation(const QString& theId, QObject* thePar ModuleBase_Operation::~ModuleBase_Operation() { delete myDescription; + clearPreselection(); } QString ModuleBase_Operation::id() const @@ -61,57 +66,18 @@ bool ModuleBase_Operation::isValid() const { if (!myFeature) return true; // rename operation + if (myFeature->isAction()) + return true; //Get validators for the Id SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); return aFactory->validate(myFeature); } -bool ModuleBase_Operation::isNestedOperationsEnabled() const -{ - return true; -} - -void ModuleBase_Operation::storeCustomValue() -{ - if (!myFeature) { -#ifdef _DEBUG - qDebug() << "ModuleBase_Operation::storeCustom: " << - "trying to store value without opening a transaction."; -#endif - return; - } - - ModuleBase_ModelWidget* aCustom = dynamic_cast(sender()); - if (aCustom) - aCustom->storeValue(); -} - -void ModuleBase_Operation::startOperation() -{ - if (!myIsEditing) - createFeature(); -} - -void ModuleBase_Operation::stopOperation() -{ -} - -void ModuleBase_Operation::abortOperation() -{ -} - -void ModuleBase_Operation::commitOperation() -{ -} - -void ModuleBase_Operation::afterCommitOperation() -{ -} bool ModuleBase_Operation::canBeCommitted() const { - return true; + return isValid(); } void ModuleBase_Operation::flushUpdated() @@ -124,13 +90,12 @@ void ModuleBase_Operation::flushCreated() Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); } -FeaturePtr ModuleBase_Operation::createFeature( - const bool theFlushMessage, CompositeFeaturePtr theCompositeFeature) +FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) { - if (theCompositeFeature) { - myFeature = theCompositeFeature->addFeature(getDescription()->operationId().toStdString()); + if (myParentFeature.get()) { + myFeature = myParentFeature->addFeature(getDescription()->operationId().toStdString()); } else { - boost::shared_ptr aDoc = document(); + std::shared_ptr aDoc = document(); myFeature = aDoc->addFeature(getDescription()->operationId().toStdString()); } if (myFeature) { // TODO: generate an error if feature was not created @@ -165,7 +130,7 @@ bool ModuleBase_Operation::hasObject(ObjectPtr theObj) const std::list aResults = aFeature->results(); std::list::const_iterator aIt; for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - if ((*aIt) == theObj) + if (theObj == (*aIt)) return true; } } @@ -173,7 +138,7 @@ bool ModuleBase_Operation::hasObject(ObjectPtr theObj) const } -boost::shared_ptr ModuleBase_Operation::document() const +std::shared_ptr ModuleBase_Operation::document() const { return ModelAPI_Session::get()->moduleDocument(); } @@ -181,17 +146,29 @@ boost::shared_ptr ModuleBase_Operation::document() const void ModuleBase_Operation::start() { - ModelAPI_Session::get()->startOperation(); + QString anId = getDescription()->operationId(); + if (myIsEditing) { + anId = anId.append(EditSuffix()); + } + ModelAPI_Session::get()->startOperation(anId.toStdString()); + + if (!myIsEditing) + createFeature(); startOperation(); emit started(); + +} + +void ModuleBase_Operation::postpone() +{ + postponeOperation(); + emit postponed(); } void ModuleBase_Operation::resume() { - if (myPropertyPanel) - connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), - this, SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); + resumeOperation(); emit resumed(); } @@ -199,8 +176,6 @@ void ModuleBase_Operation::abort() { abortOperation(); emit aborted(); - if (myPropertyPanel) - disconnect(myPropertyPanel, 0, this, 0); stopOperation(); @@ -212,15 +187,17 @@ bool ModuleBase_Operation::commit() { if (canBeCommitted()) { commitOperation(); - emit committed(); - - if (myPropertyPanel) - disconnect(myPropertyPanel, 0, this, 0); + // check whether there are modifications performed during the current operation + // in the model + // in case if there are no modifications, do not increase the undo/redo stack + if (ModelAPI_Session::get()->isModified()) + ModelAPI_Session::get()->finishOperation(); + else + ModelAPI_Session::get()->abortOperation(); stopOperation(); - ModelAPI_Session::get()->finishOperation(); - emit stopped(); + emit committed(); afterCommitOperation(); return true; @@ -235,100 +212,143 @@ void ModuleBase_Operation::setRunning(bool theState) } } -bool ModuleBase_Operation::activateByPreselection() +void ModuleBase_Operation::activateByPreselection() { - if (!myPropertyPanel) - return false; - if (myPreSelection.empty()) - return false; + if (!myPropertyPanel || myPreSelection.empty()) { + myPropertyPanel->activateNextWidget(NULL); + return; + } const QList& aWidgets = myPropertyPanel->modelWidgets(); - if (aWidgets.empty()) - return false; + if (aWidgets.empty()) { + myPropertyPanel->activateNextWidget(NULL); + return; + } - ModuleBase_ModelWidget* aWgt; - ModuleBase_ViewerPrs aPrs; + ModuleBase_ModelWidget* aWgt, *aFilledWgt = 0; QList::const_iterator aWIt; QList::const_iterator aPIt; + bool isSet = false; for (aWIt = aWidgets.constBegin(), aPIt = myPreSelection.constBegin(); (aWIt != aWidgets.constEnd()) && (aPIt != myPreSelection.constEnd()); - ++aWIt, ++aPIt) { + ++aWIt) { aWgt = (*aWIt); - aPrs = (*aPIt); - ModuleBase_WidgetValueFeature aValue; - aValue.setObject(aPrs.object()); - if (!aWgt->setValue(&aValue)) + ModuleBase_ViewerPrs aValue = (*aPIt); + if (!aWgt->canSetValue()) + continue; + + ++aPIt; + if (!aWgt->setSelection(aValue)) { + isSet = false; break; - } - if (canBeCommitted()) { - // if all widgets are filled with selection - commit(); - return true; + } else { + isSet = true; + aFilledWgt = aWgt; + } } - //ModuleBase_ModelWidget* aActiveWgt = myPropertyPanel->activeWidget(); - //if ((myPreSelection.size() > 0) && aActiveWgt) { - // const ModuleBase_ViewerPrs& aPrs = myPreSelection.first(); - // ModuleBase_WidgetValueFeature aValue; - // aValue.setObject(aPrs.object()); - // if (aActiveWgt->setValue(&aValue)) { - // myPreSelection.removeOne(aPrs); - // myPropertyPanel->activateNextWidget(); - // } - // // If preselection is enough to make a valid feature - apply it immediately - //} - return false; + myPropertyPanel->activateNextWidget(aFilledWgt); + if (aFilledWgt) + emit activatedByPreselection(); + } -void ModuleBase_Operation::initSelection(ModuleBase_ISelection* theSelection) +void ModuleBase_Operation::setParentFeature(CompositeFeaturePtr theParent) { - myPreSelection.clear(); + myParentFeature = theParent; +} +CompositeFeaturePtr ModuleBase_Operation::parentFeature() const +{ + return myParentFeature; +} + +void ModuleBase_Operation::initSelection(ModuleBase_ISelection* theSelection, + ModuleBase_IViewer* theViewer) +{ + clearPreselection(); + + QList aPreSelected; // Check that the selected result are not results of operation feature - QList aSelected = theSelection->getSelected(); FeaturePtr aFeature = feature(); if (aFeature) { + QList aSelected = theSelection->getSelected(); + std::list aResults = aFeature->results(); - QList aResList; + 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)) - myPreSelection.append(aPrs); + aPreSelected.append(aPrs); } } else - myPreSelection = aSelected; -} + aPreSelected = theSelection->getSelected(); -void ModuleBase_Operation::onWidgetActivated(ModuleBase_ModelWidget* theWidget) -{ - //activateByPreselection(); - //if (theWidget && myPropertyPanel) { - // myPropertyPanel->activateNextWidget(); - //// //emit activateNextWidget(myActiveWidget); + // 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::setWidgetValue(ObjectPtr theFeature, double theX, double theY) +//void ModuleBase_Operation::onWidgetActivated(ModuleBase_ModelWidget* theWidget) +//{ +// //activateByPreselection(); +// //if (theWidget && myPropertyPanel) { +// // myPropertyPanel->activateNextWidget(); +// //// //emit activateNextWidget(myActiveWidget); +// //} +//} + +//bool ModuleBase_Operation::setWidgetValue(ObjectPtr theFeature, double theX, double theY) +//{ +// ModuleBase_ModelWidget* aActiveWgt = myPropertyPanel->activeWidget(); +// if (!aActiveWgt) +// return false; +// ModuleBase_WidgetValueFeature* aValue = new ModuleBase_WidgetValueFeature(); +// aValue->setObject(theFeature); +// aValue->setPoint(std::shared_ptr(new GeomAPI_Pnt2d(theX, theY))); +// bool isApplyed = aActiveWgt->setValue(aValue); +// +// delete aValue; +// myIsModified = (myIsModified || isApplyed); +// return isApplyed; +//} + +bool ModuleBase_Operation::getViewerPoint(ModuleBase_ViewerPrs thePrs, + ModuleBase_IViewer* theViewer, + double& theX, double& theY) { - ModuleBase_ModelWidget* aActiveWgt = myPropertyPanel->activeWidget(); - if (!aActiveWgt) - return false; - ModuleBase_WidgetValueFeature* aValue = new ModuleBase_WidgetValueFeature(); - aValue->setObject(theFeature); - aValue->setPoint(boost::shared_ptr(new GeomAPI_Pnt2d(theX, theY))); - bool isApplyed = aActiveWgt->setValue(aValue); - - delete aValue; - myIsModified = (myIsModified || isApplyed); - return isApplyed; + return false; } +void ModuleBase_Operation::clearPreselection() +{ + myPreSelection.clear(); +} void ModuleBase_Operation::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) { myPropertyPanel = theProp; - connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), this, - SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); + myPropertyPanel->setEditingMode(isEditOperation()); + + // 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()) + activateByPreselection(); +} + +bool ModuleBase_Operation::isGranted(QString theId) const +{ + return myNestedFeatures.contains(theId); }