]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #71: abort all actions inside of the sketch on sketch abort
authormpv <mikhail.ponikarov@opencascade.com>
Mon, 26 May 2014 07:49:20 +0000 (11:49 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Mon, 26 May 2014 07:49:20 +0000 (11:49 +0400)
src/Model/Model_Document.cpp
src/Model/Model_Document.h

index 2c29b653558c48e7dfbaa1499eff5cfeed25aee4..87ad7e0b1b9ff76537be65847e04afdd0436717d 100644 (file)
@@ -184,6 +184,8 @@ void Model_Document::startOperation()
       myNestedNum = 0;
       myDoc->InitDeltaCompaction();
     }
+    myIsEmptyTr[myTransactionsAfterSave] = false;
+    myTransactionsAfterSave++;
     myDoc->NewCommand();
   } else { // start of simple command
     myDoc->NewCommand();
@@ -194,6 +196,17 @@ void Model_Document::startOperation()
     subDocument(*aSubIter)->startOperation();
 }
 
+void Model_Document::compactNested() {
+  while(myNestedNum != -1) {
+    myTransactionsAfterSave--;
+    myIsEmptyTr.erase(myTransactionsAfterSave);
+    myNestedNum--;
+  }
+  myIsEmptyTr[myTransactionsAfterSave] = false;
+  myTransactionsAfterSave++;
+  myDoc->PerformDeltaCompaction();
+}
+
 void Model_Document::finishOperation()
 {
   // just to be sure that everybody knows that changes were performed
@@ -205,15 +218,8 @@ void Model_Document::finishOperation()
     myNestedNum++;
   if (!myDoc->HasOpenCommand()) {
     if (myNestedNum != -1) {
-      myNestedNum -= 2; // one is just incremented before, one is left (and not empty!)
-      while(myNestedNum != -1) {
-        myIsEmptyTr.erase(myTransactionsAfterSave);
-        myTransactionsAfterSave--;
-        myNestedNum--;
-      }
-      myIsEmptyTr[myTransactionsAfterSave] = false;
-      myTransactionsAfterSave++;
-      myDoc->PerformDeltaCompaction();
+      myNestedNum--;
+      compactNested();
     }
   } else {
     // returns false if delta is empty and no transaction was made
@@ -229,13 +235,23 @@ void Model_Document::finishOperation()
 
 void Model_Document::abortOperation()
 {
-  if (myNestedNum == 0)
-    myNestedNum = -1;
-  myDoc->AbortCommand();
+  if (myNestedNum > 0 && !myDoc->HasOpenCommand()) { // abort all what was done in nested
+    // first compact all nested
+    compactNested();
+    // for nested it is undo and clear redos
+    myDoc->Undo();
+    myDoc->ClearRedos();
+    myTransactionsAfterSave--;
+    myIsEmptyTr.erase(myTransactionsAfterSave);
+  } else {
+    if (myNestedNum == 0) // abort only high-level
+      myNestedNum = -1;
+    myDoc->AbortCommand();
+  }
   synchronizeFeatures(true);
   // abort for all subs
   set<string>::iterator aSubIter = mySubs.begin();
-  for(; aSubIter != mySubs.end(); aSubIter++)
+    for(; aSubIter != mySubs.end(); aSubIter++)
     subDocument(*aSubIter)->abortOperation();
 }
 
index 097a3ba249446156189b5474494422f6a3ad679a..41f7d51f6a54bbdd828176d9d49d3a0e3b3902dd 100644 (file)
@@ -110,6 +110,9 @@ protected:
 
   Handle_TDocStd_Document document() {return myDoc;}
 
+  //! performas compactification of all nested operations into one
+  void compactNested();
+
   friend class Model_Application;
   friend class Model_PluginManager;