X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=c0d83dd648d770bb887e13f3acfc0aa0345ebe95;hb=7dc85ea3929c3543703b2d8e689f8a66c0384272;hp=d5a79927c9eb78537dc0d221989490297776fc4d;hpb=c8e35a67c60489a46aaf7c8ff75001511ac2635b;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index d5a79927c..c0d83dd64 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -49,11 +50,11 @@ bool Model_Session::save(const char* theFileName, std::list& theRes void Model_Session::closeAll() { Model_Application::getApplication()->deleteAllDocuments(); - //ROOT_DOC->close(true); } -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 @@ -206,10 +215,25 @@ std::shared_ptr Model_Session::activeDocument() return myCurrentDoc; } +/// 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); + } +} + void Model_Session::setActiveDocument( std::shared_ptr theDoc, bool theSendSignal) { if (myCurrentDoc != theDoc) { + if (myCurrentDoc.get()) + myCurrentDoc->setActive(false); + if (theDoc.get()) + theDoc->setActive(true); + + std::shared_ptr aPrevious = myCurrentDoc; myCurrentDoc = theDoc; if (theDoc.get() && theSendSignal) { // syncronize the document: it may be just opened or opened but removed before @@ -225,6 +249,25 @@ void Model_Session::setActiveDocument( new Events_Message(Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED))); Events_Loop::loop()->send(aMsg); } + // make the current state correct and synchronised in the module and sub-documents + if (isOperation()) { // do it only in transaction, not on opening of document + if (myCurrentDoc == moduleDocument()) { + // make the current feature the latest in root, in previous root current become also last + makeCurrentLast(aPrevious); + makeCurrentLast(myCurrentDoc); + } else { + // make the current feature the latest in sub, root current feature becomes this sub + makeCurrentLast(myCurrentDoc); + DocumentPtr aRoot = moduleDocument(); + ResultPtr aPartRes = ModelAPI_Tools::findPartResult(aRoot, myCurrentDoc); + if (aPartRes.get()) { + FeaturePtr aPartFeat = aRoot->feature(aPartRes); + if (aPartFeat.get()) { + aRoot->setCurrentFeature(aPartFeat, false); + } + } + } + } } } @@ -280,6 +323,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(); @@ -344,7 +388,8 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa std::shared_ptr aDeleted = std::dynamic_pointer_cast(theMessage); if (aDeleted && - aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end()) + aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end() && + !ModelAPI_Tools::findPartResult(moduleDocument(), activeDocument()).get()) // another part may be disabled { setActiveDocument(moduleDocument()); } @@ -390,3 +435,8 @@ ModelAPI_ValidatorsFactory* Model_Session::validators() static Model_ValidatorsFactory* aFactory = new Model_ValidatorsFactory; return aFactory; } + +int Model_Session::transactionID() +{ + return ROOT_DOC->transactionID(); +}