X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=e336d1652d3f7d2166cc095b231232cd09ece395;hb=061a63480f6840b6d945f7744b3b972e2d4cb25d;hp=e66e434a1348e12a4f3fef8cc3b7e043a8ee2dea;hpb=b14d19b6b3653386e498f107e76ee37784fb4d94;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index e66e434a1..e336d1652 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -38,13 +38,13 @@ static Model_Session* myImpl = new Model_Session(); bool Model_Session::load(const char* theFileName) { - bool aRes = ROOT_DOC->load(theFileName, ROOT_DOC); + bool aRes = ROOT_DOC->load(theFileName, "root", ROOT_DOC); return aRes; } bool Model_Session::save(const char* theFileName, std::list& theResults) { - return ROOT_DOC->save(theFileName, theResults); + return ROOT_DOC->save(theFileName, "root", theResults); } void Model_Session::closeAll() @@ -61,8 +61,11 @@ void Model_Session::startOperation(const std::string& theId, const bool theAttac (new Events_Message(Events_Loop::eventByName("StartOperation"))); Events_Loop::loop()->send(aStartedMsg); // remove all useless documents that has been closed: on start of operation undo/redo is cleared - std::list > aUsedDocs = allOpenedDocuments(); - Model_Application::getApplication()->removeUselessDocuments(aUsedDocs); + // MPV: this code is dangerous now because it may close the document that is activated right now + // but not in the list of the opened documents yet (create, delete, undo, activate Part) + // later this must be updated by correct usage of uniques IDs of documents, not names of results + //std::list > aUsedDocs = allOpenedDocuments(); + //Model_Application::getApplication()->removeUselessDocuments(aUsedDocs); } void Model_Session::finishOperation() @@ -183,29 +186,27 @@ FeaturePtr Model_Session::createFeature(string theFeatureID, Model_Document* the std::shared_ptr Model_Session::moduleDocument() { - bool aFirstCall = !Model_Application::getApplication()->hasDocument("root"); + Handle(Model_Application) anApp = Model_Application::getApplication(); + bool aFirstCall = !anApp->hasRoot(); if (aFirstCall) { // creation of the root document is always outside of the transaction, so, avoid checking it setCheckTransactions(false); - } - std::shared_ptr aDoc = std::shared_ptr( - Model_Application::getApplication()->getDocument("root")); - if (aFirstCall) { + anApp->createDocument(0); // 0 is a root ID // creation of the root document is always outside of the transaction, so, avoid checking it setCheckTransactions(true); } - return aDoc; + return anApp->rootDocument(); } -std::shared_ptr Model_Session::document(std::string theDocID) +std::shared_ptr Model_Session::document(int theDocID) { return std::shared_ptr( - Model_Application::getApplication()->getDocument(theDocID)); + Model_Application::getApplication()->document(theDocID)); } bool Model_Session::hasModuleDocument() { - return Model_Application::getApplication()->hasDocument("root"); + return Model_Application::getApplication()->hasRoot(); } std::shared_ptr Model_Session::activeDocument() @@ -219,6 +220,15 @@ std::shared_ptr Model_Session::activeDocument() static void makeCurrentLast(std::shared_ptr theDoc) { if (theDoc.get()) { 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); } } @@ -235,6 +245,18 @@ void Model_Session::setActiveDocument( std::shared_ptr aPrevious = myCurrentDoc; myCurrentDoc = theDoc; if (theDoc.get() && theSendSignal) { + // this must be before the synchronisation call because features in PartSet lower than this + // part feature must be disabled and don't recomputed anymore (issue 1156, + // translation feature is failed on activation of Part 2) + if (isOperation()) { // do it only in transaction, not on opening of document + DocumentPtr aRoot = moduleDocument(); + if (myCurrentDoc != aRoot) { + FeaturePtr aPartFeat = ModelAPI_Tools::findPartFeature(aRoot, myCurrentDoc); + if (aPartFeat.get()) { + aRoot->setCurrentFeature(aPartFeat, false); + } + } + } // syncronize the document: it may be just opened or opened but removed before std::shared_ptr aDoc = std::dynamic_pointer_cast(theDoc); if (aDoc.get()) { @@ -258,14 +280,6 @@ void Model_Session::setActiveDocument( } 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); - } - } } } } @@ -281,12 +295,10 @@ std::list > Model_Session::allOpenedDocuments DocumentPtr anAPIDoc = *aDoc; std::shared_ptr aDoc = std::dynamic_pointer_cast(anAPIDoc); if (aDoc) { - const std::set aSubs = aDoc->subDocuments(true); - std::set::const_iterator aSubIter = aSubs.cbegin(); + const std::set aSubs = aDoc->subDocuments(); + std::set::const_iterator aSubIter = aSubs.cbegin(); for(; aSubIter != aSubs.cend(); aSubIter++) { - if (!Model_Application::getApplication()->isLoadByDemand(*aSubIter)) { - aResult.push_back(Model_Application::getApplication()->getDocument(*aSubIter)); - } + aResult.push_back(Model_Application::getApplication()->document(*aSubIter)); } } } @@ -299,11 +311,9 @@ bool Model_Session::isLoadByDemand(const std::string theDocID) } std::shared_ptr Model_Session::copy( - std::shared_ptr theSource, std::string theID) + std::shared_ptr theSource, const int theDestID) { - // create a new document - std::shared_ptr aNew = std::dynamic_pointer_cast( - Model_Application::getApplication()->getDocument(theID)); + std::shared_ptr aNew = Model_Application::getApplication()->document(theDestID); // make a copy of all labels TDF_Label aSourceRoot = std::dynamic_pointer_cast(theSource)->document()->Main() .Father(); @@ -346,7 +356,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()); @@ -389,10 +399,25 @@ 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() && - !ModelAPI_Tools::findPartResult(moduleDocument(), activeDocument()).get()) // another part may be disabled + aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end()) { - setActiveDocument(moduleDocument()); + // check that the current feature of the session is still the active Part (even disabled) + bool aFound = false; + FeaturePtr aCurrentPart = moduleDocument()->currentFeature(true); + if (aCurrentPart.get()) { + const std::list >& aResList = aCurrentPart->results(); + std::list >::const_iterator aRes = aResList.begin(); + for(; !aFound && aRes != aResList.end(); aRes++) { + ResultPartPtr aPRes = std::dynamic_pointer_cast(*aRes); + if (aPRes.get() && aPRes->isActivated() && aPRes->partDoc() == activeDocument()) { + aFound = true; + + } + } + } + if (!aFound) { // if not, the part was removed, so activate the module document + setActiveDocument(moduleDocument()); + } } } }