summaryrefslogtreecommitdiff
path: root/libs/pbd/stateful_diff_command.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-08-25 17:31:57 +0000
committerCarl Hetherington <carl@carlh.net>2010-08-25 17:31:57 +0000
commit21855b71d2eb8006fda96aefacfa60140ae747d3 (patch)
treea5a5148ef41be377a0670bf708845b7197baf5d4 /libs/pbd/stateful_diff_command.cc
parent803f3a6a307bea4bdd804041a0e0a846f48938ee (diff)
Modify StatefulDiffCommand undo record to only contain the changes in one direction, as the other direction can be inferred. Breaks session history file compatibility.
git-svn-id: svn://localhost/ardour2/branches/3.0@7684 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/stateful_diff_command.cc')
-rw-r--r--libs/pbd/stateful_diff_command.cc38
1 files changed, 15 insertions, 23 deletions
diff --git a/libs/pbd/stateful_diff_command.cc b/libs/pbd/stateful_diff_command.cc
index 857235b803..ffd56c8fb1 100644
--- a/libs/pbd/stateful_diff_command.cc
+++ b/libs/pbd/stateful_diff_command.cc
@@ -34,10 +34,9 @@ using namespace PBD;
StatefulDiffCommand::StatefulDiffCommand (boost::shared_ptr<StatefulDestructible> s)
: _object (s)
- , _undo (new PropertyList)
- , _redo (new PropertyList)
+ , _changes (0)
{
- s->diff (*_undo, *_redo, this);
+ _changes = s->get_changes_as_properties (this);
/* if the stateful object that this command refers to goes away,
be sure to notify owners of this command.
@@ -48,21 +47,17 @@ StatefulDiffCommand::StatefulDiffCommand (boost::shared_ptr<StatefulDestructible
StatefulDiffCommand::StatefulDiffCommand (boost::shared_ptr<StatefulDestructible> s, XMLNode const & n)
: _object (s)
- , _undo (0)
- , _redo (0)
+ , _changes (0)
{
const XMLNodeList& children (n.children());
for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
- if ((*i)->name() == X_("Undo")) {
- _undo = s->property_factory (**i);
- } else if ((*i)->name() == X_("Do")) {
- _redo = s->property_factory (**i);
+ if ((*i)->name() == X_("Changes")) {
+ _changes = s->property_factory (**i);
}
- }
+ }
- assert (_undo != 0);
- assert (_redo != 0);
+ assert (_changes != 0);
/* if the stateful object that this command refers to goes away,
be sure to notify owners of this command.
@@ -75,8 +70,7 @@ StatefulDiffCommand::~StatefulDiffCommand ()
{
drop_references ();
- delete _undo;
- delete _redo;
+ delete _changes;
}
void
@@ -85,7 +79,7 @@ StatefulDiffCommand::operator() ()
boost::shared_ptr<Stateful> s (_object.lock());
if (s) {
- s->apply_changes (*_redo);
+ s->apply_changes (*_changes);
}
}
@@ -95,8 +89,9 @@ StatefulDiffCommand::undo ()
boost::shared_ptr<Stateful> s (_object.lock());
if (s) {
- std::cerr << "Undoing a stateful diff command\n";
- s->apply_changes (*_undo);
+ PropertyList p = *_changes;
+ p.invert ();
+ s->apply_changes (p);
}
}
@@ -115,14 +110,11 @@ StatefulDiffCommand::get_state ()
node->add_property ("obj-id", s->id().to_s());
node->add_property ("type-name", demangled_name (*s.get()));
- XMLNode* undo = new XMLNode (X_("Undo"));
- XMLNode* redo = new XMLNode (X_("Do"));
+ XMLNode* changes = new XMLNode (X_("Changes"));
- _undo->get_changes (undo);
- _redo->get_changes (redo);
+ _changes->get_changes_as_xml (changes);
- node->add_child_nocopy (*undo);
- node->add_child_nocopy (*redo);
+ node->add_child_nocopy (*changes);
return *node;
}