summaryrefslogtreecommitdiff
path: root/libs/pbd/stateful_diff_command.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-03-02 00:00:00 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-03-02 00:00:00 +0000
commitdb8b575c30845bafc34b87bacd52129c95d1c478 (patch)
tree7a521b7795cc6cc4e41d717a0feabd1aefb83e1f /libs/pbd/stateful_diff_command.cc
parent3540594dc53137eb9e857f9e3c1309382a6d7bef (diff)
the mega-properties/SequenceProperty patch. split is broken at present (right hand starts has start-in-source of zero)
git-svn-id: svn://localhost/ardour2/branches/3.0@6718 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/stateful_diff_command.cc')
-rw-r--r--libs/pbd/stateful_diff_command.cc53
1 files changed, 41 insertions, 12 deletions
diff --git a/libs/pbd/stateful_diff_command.cc b/libs/pbd/stateful_diff_command.cc
index bf092a6594..0c7b8cc3f2 100644
--- a/libs/pbd/stateful_diff_command.cc
+++ b/libs/pbd/stateful_diff_command.cc
@@ -17,7 +17,10 @@
*/
+#include <iostream>
+
#include "pbd/stateful_diff_command.h"
+#include "pbd/property_list.h"
#include "i18n.h"
using namespace std;
@@ -30,24 +33,35 @@ using namespace PBD;
StatefulDiffCommand::StatefulDiffCommand (boost::shared_ptr<Stateful> s)
: _object (s)
+ , _before (new PropertyList)
+ , _after (new PropertyList)
{
- pair<XMLNode *, XMLNode*> const p = s->diff ();
- _before = p.first;
- _after = p.second;
+ s->diff (*_before, *_after);
}
StatefulDiffCommand::StatefulDiffCommand (boost::shared_ptr<Stateful> s, XMLNode const & n)
: _object (s)
+ , _before (0)
+ , _after (0)
{
- _before = new XMLNode (*n.children().front());
- _after = new XMLNode (*n.children().back());
+ const XMLNodeList& children (n.children());
+
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->name() == X_("Undo")) {
+ _before = s->property_factory (**i);
+ } else if ((*i)->name() == X_("Do")) {
+ _after = s->property_factory (**i);
+ }
+ }
+
+ assert (_before != 0);
+ assert (_after != 0);
}
-
StatefulDiffCommand::~StatefulDiffCommand ()
{
- delete _before;
- delete _after;
+ delete _before;
+ delete _after;
}
void
@@ -56,7 +70,10 @@ StatefulDiffCommand::operator() ()
boost::shared_ptr<Stateful> s (_object.lock());
if (s) {
- s->set_state (*_after, Stateful::current_state_version);
+ PropertyChange changed = s->set_properties (*_after);
+ if (!changed.empty()) {
+ s->PropertyChanged (changed);
+ }
}
}
@@ -66,7 +83,12 @@ StatefulDiffCommand::undo ()
boost::shared_ptr<Stateful> s (_object.lock());
if (s) {
- s->set_state (*_before, Stateful::current_state_version);
+ std::cerr << "Undoing a stateful diff command\n";
+ PropertyChange changed = s->set_properties (*_before);
+ if (!changed.empty()) {
+ std::cerr << "Sending changed\n";
+ s->PropertyChanged (changed);
+ }
}
}
@@ -84,8 +106,15 @@ StatefulDiffCommand::get_state ()
node->add_property ("obj-id", s->id().to_s());
node->add_property ("type-name", typeid(*s.get()).name());
- node->add_child_copy (*_before);
- node->add_child_copy (*_after);
+
+ XMLNode* before = new XMLNode (X_("Undo"));
+ XMLNode* after = new XMLNode (X_("Do"));
+
+ _before->add_history_state (before);
+ _after->add_history_state (after);
+
+ node->add_child_nocopy (*before);
+ node->add_child_nocopy (*after);
return *node;
}