-/*
+/*
Copyright (C) 2001 Brett Viren & Paul Davis
This program is free software; you can redistribute it and/or modify
$Id$
*/
-#include <iostream>
#include <string>
#include <sstream>
#include <time.h>
UndoTransaction::UndoTransaction (const UndoTransaction& rhs)
: Command(rhs._name)
- , PBD::ScopedConnectionList ()
, _clearing(false)
{
+ _timestamp = rhs._timestamp;
clear ();
actions.insert(actions.end(),rhs.actions.begin(),rhs.actions.end());
}
clear ();
}
-void
+void
command_death (UndoTransaction* ut, Command* c)
{
if (ut->clearing()) {
}
}
-UndoTransaction&
+UndoTransaction&
UndoTransaction::operator= (const UndoTransaction& rhs)
{
if (this == &rhs) return *this;
}
void
-UndoTransaction::add_command (Command *const action)
+UndoTransaction::add_command (Command *const cmd)
{
/* catch death of command (e.g. caused by death of object to
which it refers. command_death() is a normal static function
so there is no need to manage this connection.
*/
- action->DropReferences.connect_same_thread (*this, boost::bind (&command_death, this, action));
- actions.push_back (action);
+ cmd->DropReferences.connect_same_thread (*this, boost::bind (&command_death, this, cmd));
+ actions.push_back (cmd);
}
void
class UndoRedoSignaller {
public:
- UndoRedoSignaller (UndoHistory& uh)
- : _history (uh) {
- _history.BeginUndoRedo();
+ UndoRedoSignaller (UndoHistory& uh)
+ : _history (uh) {
+ _history.BeginUndoRedo();
}
- ~UndoRedoSignaller() {
- _history.EndUndoRedo();
+ ~UndoRedoSignaller() {
+ _history.EndUndoRedo();
}
private:
}
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 */
return;
}
- struct timeval start, end, diff;
- gettimeofday (&start, 0);
-
{
UndoRedoSignaller exception_safe_signaller (*this);
ut->undo ();
RedoList.push_back (ut);
}
- gettimeofday (&end, 0);
- timersub (&end, &start, &diff);
- cerr << "Undo-pre-signals took " << diff.tv_sec << '.' << diff.tv_usec << endl;
-
}
- gettimeofday (&end, 0);
- timersub (&end, &start, &diff);
- cerr << "Undo took " << diff.tv_sec << '.' << diff.tv_usec << endl;
-
Changed (); /* EMIT SIGNAL */
}
return;
}
- struct timeval start, end, diff;
- gettimeofday (&start, 0);
-
{
UndoRedoSignaller exception_safe_signaller (*this);
-
+
while (n--) {
if (RedoList.size() == 0) {
return;
ut->redo ();
UndoList.push_back (ut);
}
- gettimeofday (&end, 0);
- timersub (&end, &start, &diff);
- cerr << "Redo-pre-signals took " << diff.tv_sec << '.' << diff.tv_usec << endl;
}
- gettimeofday (&end, 0);
- timersub (&end, &start, &diff);
- cerr << "Redo took " << diff.tv_sec << '.' << diff.tv_usec << endl;
-
- EndUndoRedo (); /* EMIT SIGNAL */
Changed (); /* EMIT SIGNAL */
}
UndoHistory::clear_redo ()
{
_clearing = true;
+ for (std::list<UndoTransaction*>::iterator i = RedoList.begin(); i != RedoList.end(); ++i) {
+ delete *i;
+ }
RedoList.clear ();
_clearing = false;
UndoHistory::clear_undo ()
{
_clearing = true;
+ for (std::list<UndoTransaction*>::iterator i = UndoList.begin(); i != UndoList.end(); ++i) {
+ delete *i;
+ }
UndoList.clear ();
_clearing = false;
Changed (); /* EMIT SIGNAL */
}
-XMLNode&
+XMLNode&
UndoHistory::get_state (int32_t depth)
{
XMLNode *node = new XMLNode ("UndoHistory");