diff options
author | Hans Fugal <hans@fugal.net> | 2006-08-12 21:49:20 +0000 |
---|---|---|
committer | Hans Fugal <hans@fugal.net> | 2006-08-12 21:49:20 +0000 |
commit | 57f7f71ce3c1acae5a50e903d2dd472743df8043 (patch) | |
tree | 6bb6ea6e16a17bbc5e96ecdc70d839ef7b3a955c /libs/pbd/pbd/memento_command.h | |
parent | f995ac37860140c513e29c3bc58701474a7ed336 (diff) |
r316@gandalf: fugalh | 2006-08-11 17:06:48 -0600
Reconstitution. Comiples, untested.
git-svn-id: svn://localhost/ardour2/branches/undo@797 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/pbd/memento_command.h')
-rw-r--r-- | libs/pbd/pbd/memento_command.h | 82 |
1 files changed, 28 insertions, 54 deletions
diff --git a/libs/pbd/pbd/memento_command.h b/libs/pbd/pbd/memento_command.h index 122dcb4c86..3a72fc9841 100644 --- a/libs/pbd/pbd/memento_command.h +++ b/libs/pbd/pbd/memento_command.h @@ -36,70 +36,44 @@ class MementoCommand : public Command public: MementoCommand(XMLNode &state); MementoCommand(obj_T &obj, - XMLNode &before, - XMLNode &after + XMLNode *before, + XMLNode *after ) : obj(obj), before(before), after(after) {} - void operator() () { obj.set_state(after); } - void undo() { obj.set_state(before); } + void operator() () + { + if (after) + obj.set_state(*after); + } + void undo() + { + if (before) + obj.set_state(*before); + } virtual XMLNode &get_state() { - XMLNode *node = new XMLNode("MementoCommand"); + string name; + if (before && after) + name = "MementoCommand"; + else if (before) + name = "MementoUndoCommand"; + else + name = "MementoRedoCommand"; + + XMLNode *node = new XMLNode(name); node->add_property("obj_id", obj.id().to_s()); node->add_property("type_name", typeid(obj).name()); - node->add_child_copy(before); - node->add_child_copy(after); + + if (before) + node->add_child_copy(*before); + if (after) + node->add_child_copy(*after); + return *node; } protected: obj_T &obj; - XMLNode &before, &after; -}; - -template <class obj_T> -class MementoUndoCommand : public Command -{ -public: - MementoUndoCommand(XMLNode &state); - MementoUndoCommand(obj_T &obj, - XMLNode &before) - : obj(obj), before(before) {} - void operator() () { /* noop */ } - void undo() { obj.set_state(before); } - virtual XMLNode &get_state() - { - XMLNode *node = new XMLNode("MementoUndoCommand"); - node->add_property("obj_id", obj.id().to_s()); - node->add_property("type_name", typeid(obj).name()); - node->add_child_copy(before); - return *node; - } -protected: - obj_T &obj; - XMLNode &before; -}; - -template <class obj_T> -class MementoRedoCommand : public Command -{ -public: - MementoRedoCommand(XMLNode &state); - MementoRedoCommand(obj_T &obj, - XMLNode &after) - : obj(obj), after(after) {} - void operator() () { obj.set_state(after); } - void undo() { /* noop */ } - virtual XMLNode &get_state() - { - XMLNode *node = new XMLNode("MementoRedoCommand"); - node->add_property("obj_id", obj.id().to_s()); - node->add_property("type_name", typeid(obj).name()); - node->add_child_copy(after); - return *node; - } -protected: - obj_T &obj; - XMLNode &after; + XMLNode *before, *after; }; #endif // __lib_pbd_memento_h__ |