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 | |
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')
-rw-r--r-- | libs/pbd/pbd/memento_command.h | 82 | ||||
-rw-r--r-- | libs/pbd/pbd/stateful.h | 3 | ||||
-rw-r--r-- | libs/pbd/undo.cc | 8 |
3 files changed, 39 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__ diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 3038f16b4f..5adddfc1c0 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -22,6 +22,7 @@ #define __pbd_stateful_h__ #include <string> +#include <pbd/id.h> class XMLNode; @@ -41,10 +42,12 @@ class Stateful { virtual void add_instant_xml (XMLNode&, const std::string& dir); XMLNode *instant_xml (const std::string& str, const std::string& dir); + PBD::ID id() { return _id; } protected: XMLNode *_extra_xml; XMLNode *_instant_xml; + PBD::ID _id; }; #endif /* __pbd_stateful_h__ */ diff --git a/libs/pbd/undo.cc b/libs/pbd/undo.cc index 8d1b416c16..6f421de84e 100644 --- a/libs/pbd/undo.cc +++ b/libs/pbd/undo.cc @@ -23,6 +23,7 @@ #include <pbd/undo.h> #include <pbd/xml++.h> #include <string> +#include <sstream> using namespace std; using namespace sigc; @@ -87,6 +88,13 @@ UndoTransaction::redo () XMLNode &UndoTransaction::get_state() { XMLNode *node = new XMLNode ("UndoTransaction"); + stringstream ss; + ss << _timestamp.tv_sec; + node->add_property("tv_sec", ss.str()); + ss.str(""); + ss << _timestamp.tv_usec; + node->add_property("tv_usec", ss.str()); + node->add_property("name", _name); list<Command*>::iterator it; for (it=actions.begin(); it!=actions.end(); it++) |