$Id$
*/
+#include <iostream>
#include <string>
#include <sstream>
#include <time.h>
: Command(rhs._name)
, _clearing(false)
{
+ _timestamp = rhs._timestamp;
clear ();
actions.insert(actions.end(),rhs.actions.begin(),rhs.actions.end());
}
}
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.
*/
- scoped_connect (action->GoingAway, 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
return *node;
}
+class UndoRedoSignaller {
+public:
+ UndoRedoSignaller (UndoHistory& uh)
+ : _history (uh) {
+ _history.BeginUndoRedo();
+ }
+ ~UndoRedoSignaller() {
+ _history.EndUndoRedo();
+ }
+
+private:
+ UndoHistory& _history;
+};
+
UndoHistory::UndoHistory ()
{
_clearing = false;
{
uint32_t current_depth = UndoList.size();
- scoped_connect (ut->GoingAway, boost::bind (&UndoHistory::remove, this, ut));
+ ut->DropReferences.connect_same_thread (*this, boost::bind (&UndoHistory::remove, this, ut));
/* if the current undo history is larger than or equal to the currently
requested depth, then pop off at least 1 element to make space
void
UndoHistory::undo (unsigned int n)
{
- while (n--) {
- if (UndoList.size() == 0) {
- return;
+ if (n == 0) {
+ return;
+ }
+
+ {
+ UndoRedoSignaller exception_safe_signaller (*this);
+
+ while (n--) {
+ if (UndoList.size() == 0) {
+ return;
+ }
+ UndoTransaction* ut = UndoList.back ();
+ UndoList.pop_back ();
+ ut->undo ();
+ RedoList.push_back (ut);
}
- UndoTransaction* ut = UndoList.back ();
- UndoList.pop_back ();
- ut->undo ();
- RedoList.push_back (ut);
}
Changed (); /* EMIT SIGNAL */
void
UndoHistory::redo (unsigned int n)
{
- while (n--) {
- if (RedoList.size() == 0) {
- return;
+ if (n == 0) {
+ return;
+ }
+
+ {
+ UndoRedoSignaller exception_safe_signaller (*this);
+
+ while (n--) {
+ if (RedoList.size() == 0) {
+ return;
+ }
+ UndoTransaction* ut = RedoList.back ();
+ RedoList.pop_back ();
+ ut->redo ();
+ UndoList.push_back (ut);
}
- UndoTransaction* ut = RedoList.back ();
- RedoList.pop_back ();
- ut->redo ();
- UndoList.push_back (ut);
}
Changed (); /* EMIT SIGNAL */