Salome HOME
Make edition transaction where actually nothing was changed as empty one and do not...
[modules/shaper.git] / src / Model / Model_Session.cpp
index 9d76861f6411516a1cfae49ef2f6151b2937d1dc..172b7d3ff220ffd0e685853b53ffc524b62cb89f 100644 (file)
@@ -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<Events_Message> 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<ModelAPI_Document> Model_Session::activeDocument()
 /// makes the last feature in the document as the current
 static void makeCurrentLast(std::shared_ptr<ModelAPI_Document> theDoc) {
   if (theDoc.get()) {
-    FeaturePtr aLastFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theDoc->object(
-      ModelAPI_Feature::group(), theDoc->size(ModelAPI_Feature::group()) - 1));
-    theDoc->setCurrentFeature(aLastFeature, false);
+    FeaturePtr aLast = std::dynamic_pointer_cast<Model_Document>(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<ModelAPI_Document> 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<ModelAPI_Session>(this));
   // register the configuration reading listener
   Events_Loop* aLoop = Events_Loop::loop();
@@ -335,7 +355,7 @@ void Model_Session::processEvent(const std::shared_ptr<Events_Message>& theMessa
     const std::shared_ptr<Config_FeatureMessage> aMsg = 
       std::dynamic_pointer_cast<Config_FeatureMessage>(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<std::string, std::string>(
           aMsg->pluginLibrary(), aMsg->documentKind());
@@ -425,3 +445,8 @@ ModelAPI_ValidatorsFactory* Model_Session::validators()
   static Model_ValidatorsFactory* aFactory = new Model_ValidatorsFactory;
   return aFactory;
 }
+
+int Model_Session::transactionID()
+{
+  return ROOT_DOC->transactionID();
+}