add to LUA API (new Stripable API)
[ardour.git] / libs / pbd / undo.cc
index fd7c4d5fb85f6f052be32ae29bca7db9c039e592..88b3c4ead5b0b2b40f3e1eae7606a44cf45e4e9c 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
     Copyright (C) 2001 Brett Viren & Paul Davis
 
     This program is free software; you can redistribute it and/or modify
@@ -18,7 +18,6 @@
     $Id$
 */
 
-#include <iostream>
 #include <string>
 #include <sstream>
 #include <time.h>
@@ -52,7 +51,7 @@ UndoTransaction::~UndoTransaction ()
        clear ();
 }
 
-void 
+void
 command_death (UndoTransaction* ut, Command* c)
 {
        if (ut->clearing()) {
@@ -66,7 +65,7 @@ command_death (UndoTransaction* ut, Command* c)
        }
 }
 
-UndoTransaction& 
+UndoTransaction&
 UndoTransaction::operator= (const UndoTransaction& rhs)
 {
        if (this == &rhs) return *this;
@@ -136,13 +135,9 @@ UndoTransaction::redo ()
 XMLNode &UndoTransaction::get_state()
 {
     XMLNode *node = new XMLNode ("UndoTransaction");
-    stringstream ss;
-    ss << _timestamp.tv_sec;
-    node->add_property("tv_sec", ss.str());
-    ss.str("");
-    ss << _timestamp.tv_usec;
-    node->add_property("tv_usec", ss.str());
-    node->add_property("name", _name);
+    node->set_property("tv-sec", (int64_t)_timestamp.tv_sec);
+    node->set_property("tv-usec", (int64_t)_timestamp.tv_usec);
+    node->set_property("name", _name);
 
     list<Command*>::iterator it;
     for (it=actions.begin(); it!=actions.end(); it++)
@@ -153,12 +148,12 @@ XMLNode &UndoTransaction::get_state()
 
 class UndoRedoSignaller {
 public:
-    UndoRedoSignaller (UndoHistory& uh) 
-           : _history (uh) { 
-           _history.BeginUndoRedo(); 
+    UndoRedoSignaller (UndoHistory& uh)
+           : _history (uh) {
+           _history.BeginUndoRedo();
     }
-    ~UndoRedoSignaller() { 
-           _history.EndUndoRedo(); 
+    ~UndoRedoSignaller() {
+           _history.EndUndoRedo();
     }
 
 private:
@@ -221,6 +216,13 @@ UndoHistory::add (UndoTransaction* const ut)
        }
 
        UndoList.push_back (ut);
+       /* Adding a transacrion makes the redo list meaningless. */
+       _clearing = true;
+       for (std::list<UndoTransaction*>::iterator i = RedoList.begin(); i != RedoList.end(); ++i) {
+                delete *i;
+        }
+       RedoList.clear ();
+       _clearing = false;
 
        /* we are now owners of the transaction and must delete it when finished with it */
 
@@ -276,7 +278,7 @@ UndoHistory::redo (unsigned int n)
 
        {
                UndoRedoSignaller exception_safe_signaller (*this);
-               
+
                while (n--) {
                        if (RedoList.size() == 0) {
                                return;
@@ -295,6 +297,9 @@ void
 UndoHistory::clear_redo ()
 {
        _clearing = true;
+        for (std::list<UndoTransaction*>::iterator i = RedoList.begin(); i != RedoList.end(); ++i) {
+                delete *i;
+        }
        RedoList.clear ();
        _clearing = false;
 
@@ -306,6 +311,9 @@ void
 UndoHistory::clear_undo ()
 {
        _clearing = true;
+        for (std::list<UndoTransaction*>::iterator i = UndoList.begin(); i != UndoList.end(); ++i) {
+                delete *i;
+        }
        UndoList.clear ();
        _clearing = false;
 
@@ -321,7 +329,7 @@ UndoHistory::clear ()
        Changed (); /* EMIT SIGNAL */
 }
 
-XMLNode& 
+XMLNode&
 UndoHistory::get_state (int32_t depth)
 {
     XMLNode *node = new XMLNode ("UndoHistory");