X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Operation.cpp;h=96060b463837050075cb47244ca5f19fe8fabb13;hb=75e68c6f8a1de4ad94c3466a7b364c8c9a6a59a6;hp=ec6c0e1e680ca86147122b361047136981795d44;hpb=4b9217e2590e05ae2b4d5de741e7e6bd5ff0e1d1;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Operation.cpp b/src/ModuleBase/ModuleBase_Operation.cpp index ec6c0e1e6..96060b463 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,6 +11,10 @@ #include "ModuleBase_OperationDescription.h" #include "ModuleBase_ModelWidget.h" +#include "ModuleBase_ViewerPrs.h" +#include "ModuleBase_IPropertyPanel.h" +#include "ModuleBase_ISelection.h" +#include "ModuleBase_IViewer.h" #include #include @@ -17,10 +23,16 @@ #include #include #include +#include #include +#include + +#include #include +#include + #ifdef _DEBUG #include #endif @@ -28,7 +40,8 @@ ModuleBase_Operation::ModuleBase_Operation(const QString& theId, QObject* theParent) : QObject(theParent), myIsEditing(false), - myIsModified(false) + myIsModified(false), + myPropertyPanel(NULL) { myDescription = new ModuleBase_OperationDescription(theId); } @@ -36,6 +49,7 @@ ModuleBase_Operation::ModuleBase_Operation(const QString& theId, QObject* thePar ModuleBase_Operation::~ModuleBase_Operation() { delete myDescription; + clearPreselection(); } QString ModuleBase_Operation::id() const @@ -58,57 +72,10 @@ bool ModuleBase_Operation::isValid() const 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::onWidgetActivated(ModuleBase_ModelWidget* theWidget) -{ -} - -void ModuleBase_Operation::startOperation() -{ - if (!myIsEditing) - createFeature(); - //emit callSlot(); - //commit(); -} - -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() @@ -123,8 +90,12 @@ void ModuleBase_Operation::flushCreated() FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) { - boost::shared_ptr aDoc = document(); - myFeature = aDoc->addFeature(getDescription()->operationId().toStdString()); + if (myParentFeature.get()) { + myFeature = myParentFeature->addFeature(getDescription()->operationId().toStdString()); + } else { + std::shared_ptr aDoc = document(); + 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. @@ -145,11 +116,6 @@ FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) void ModuleBase_Operation::setFeature(FeaturePtr theFeature) { myFeature = theFeature; -} - -void ModuleBase_Operation::setEditingFeature(FeaturePtr theFeature) -{ - setFeature(theFeature); myIsEditing = true; } @@ -162,7 +128,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; } } @@ -170,7 +136,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(); } @@ -180,12 +146,23 @@ void ModuleBase_Operation::start() { ModelAPI_Session::get()->startOperation(); + if (!myIsEditing) + createFeature(); + startOperation(); emit started(); + +} + +void ModuleBase_Operation::postpone() +{ + postponeOperation(); + emit postponed(); } void ModuleBase_Operation::resume() { + resumeOperation(); emit resumed(); } @@ -204,12 +181,17 @@ bool ModuleBase_Operation::commit() { if (canBeCommitted()) { commitOperation(); - emit committed(); + // 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; @@ -223,3 +205,144 @@ void ModuleBase_Operation::setRunning(bool theState) abort(); } } + +void ModuleBase_Operation::activateByPreselection() +{ + if (!myPropertyPanel || myPreSelection.empty()) { + myPropertyPanel->activateNextWidget(NULL); + return; + } + const QList& aWidgets = myPropertyPanel->modelWidgets(); + if (aWidgets.empty()) { + myPropertyPanel->activateNextWidget(NULL); + return; + } + + 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) { + aWgt = (*aWIt); + ModuleBase_ViewerPrs aValue = (*aPIt); + if (!aWgt->canSetValue()) + continue; + + ++aPIt; + if (!aWgt->setSelection(aValue)) { + isSet = false; + break; + } else { + isSet = true; + aFilledWgt = aWgt; + } + } + + myPropertyPanel->activateNextWidget(aFilledWgt); + if (aFilledWgt) + emit activatedByPreselection(); + +} + +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) +{ + clearPreselection(); + + QList aPreSelected; + // Check that the selected result are not results of operation feature + FeaturePtr aFeature = feature(); + if (aFeature) { + QList aSelected = theSelection->getSelected(); + + 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(); + + // 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; +} + +//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) +{ + return false; +} + +void ModuleBase_Operation::clearPreselection() +{ + myPreSelection.clear(); +} + +void ModuleBase_Operation::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) +{ + myPropertyPanel = theProp; + 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); +}