X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=172b7d3ff220ffd0e685853b53ffc524b62cb89f;hb=a83e22046c5fb877969fa8879e42491d4054f198;hp=daae187f0cb829159cbe0149a182356ff4e1f85e;hpb=298e667eb49d3d1441664d76c1ab4f5fdc80645e;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index daae187f0..172b7d3ff 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -52,8 +52,9 @@ void Model_Session::closeAll() Model_Application::getApplication()->deleteAllDocuments(); } -void Model_Session::startOperation(const std::string& theId) +void Model_Session::startOperation(const std::string& theId, const bool theAttachedToNested) { + myOperationAttachedToNext = theAttachedToNested; ROOT_DOC->startOperation(); ROOT_DOC->operationId(theId); static std::shared_ptr aStartedMsg @@ -68,6 +69,10 @@ void Model_Session::finishOperation() { setCheckTransactions(false); ROOT_DOC->finishOperation(); + if (myOperationAttachedToNext) { // twice, with nested + ROOT_DOC->finishOperation(); + myOperationAttachedToNext = false; + } setCheckTransactions(true); } @@ -75,6 +80,10 @@ void Model_Session::abortOperation() { setCheckTransactions(false); ROOT_DOC->abortOperation(); + if (myOperationAttachedToNext) { // twice, with nested + ROOT_DOC->abortOperation(); + myOperationAttachedToNext = false; + } setCheckTransactions(true); // here the update mechanism may work after abort, so, supress the warnings about // modifications outside of the transactions @@ -209,9 +218,17 @@ std::shared_ptr Model_Session::activeDocument() /// makes the last feature in the document as the current static void makeCurrentLast(std::shared_ptr theDoc) { if (theDoc.get()) { - FeaturePtr aLastFeature = std::dynamic_pointer_cast(theDoc->object( - ModelAPI_Feature::group(), theDoc->size(ModelAPI_Feature::group()) - 1)); - theDoc->setCurrentFeature(aLastFeature, false); + FeaturePtr aLast = std::dynamic_pointer_cast(theDoc)->lastFeature(); + // if last is nested into something else, make this something else as last: + // otherwise it will look like edition of sub-element, so, the main will be disabled + if (aLast.get()) { + CompositeFeaturePtr aMain = ModelAPI_Tools::compositeOwner(aLast); + while(aMain.get()) { + aLast = aMain; + aMain = ModelAPI_Tools::compositeOwner(aLast); + } + } + theDoc->setCurrentFeature(aLast, false); } } @@ -232,7 +249,8 @@ void Model_Session::setActiveDocument( if (aDoc.get()) { bool aWasChecked = myCheckTransactions; setCheckTransactions(false); - aDoc->objects()->synchronizeFeatures(false, true, true); + TDF_LabelList anEmptyUpdated; + aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true); if (aWasChecked) setCheckTransactions(true); } @@ -306,7 +324,8 @@ std::shared_ptr Model_Session::copy( aRT->SetRelocation(aSourceRoot, aTargetRoot); TDF_CopyTool::Copy(aDS, aRT); - aNew->objects()->synchronizeFeatures(false, true, true); + TDF_LabelList anEmptyUpdated; + aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true); return aNew; } @@ -314,6 +333,7 @@ Model_Session::Model_Session() { myPluginsInfoLoaded = false; myCheckTransactions = true; + myOperationAttachedToNext = false; ModelAPI_Session::setSession(std::shared_ptr(this)); // register the configuration reading listener Events_Loop* aLoop = Events_Loop::loop(); @@ -335,7 +355,7 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa const std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); if (aMsg) { - // proccess the plugin info, load plugin + // process the plugin info, load plugin if (myPlugins.find(aMsg->id()) == myPlugins.end()) { myPlugins[aMsg->id()] = std::pair( aMsg->pluginLibrary(), aMsg->documentKind());