diff options
Diffstat (limited to 'libs/pbd/stateful_diff_command.cc')
-rw-r--r-- | libs/pbd/stateful_diff_command.cc | 53 |
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; } |