diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-02 21:41:35 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-02 21:41:35 +0000 |
commit | 449aab3c465bbbf66d221fac3d7ea559f1720357 (patch) | |
tree | 6843cc40c88250a132acac701271f1504cd2df04 /libs/pbd/pbd/undo.h | |
parent | 9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (diff) |
rollback to 3428, before the mysterious removal of libs/* at 3431/3432
git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/pbd/undo.h')
-rw-r--r-- | libs/pbd/pbd/undo.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/libs/pbd/pbd/undo.h b/libs/pbd/pbd/undo.h new file mode 100644 index 0000000000..8f1716d09f --- /dev/null +++ b/libs/pbd/pbd/undo.h @@ -0,0 +1,108 @@ +/* + Copyright (C) 2002 Brett Viren & Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __lib_pbd_undo_h__ +#define __lib_pbd_undo_h__ + +#include <string> +#include <list> +#include <map> +#include <sigc++/slot.h> +#include <sigc++/bind.h> +#include <sys/time.h> +#include <pbd/command.h> + +typedef sigc::slot<void> UndoAction; + +class UndoTransaction : public Command +{ + public: + UndoTransaction (); + UndoTransaction (const UndoTransaction&); + UndoTransaction& operator= (const UndoTransaction&); + ~UndoTransaction (); + + void clear (); + bool empty() const; + bool clearing () const { return _clearing; } + + void add_command (Command* const); + void remove_command (Command* const); + + void operator() (); + void undo(); + void redo(); + + XMLNode &get_state(); + + void set_timestamp (struct timeval &t) { + _timestamp = t; + } + + const struct timeval& timestamp() const { + return _timestamp; + } + + private: + std::list<Command*> actions; + struct timeval _timestamp; + bool _clearing; + + friend void command_death (UndoTransaction*, Command *); +}; + +class UndoHistory : public sigc::trackable +{ + public: + UndoHistory(); + ~UndoHistory() {} + + void add (UndoTransaction* ut); + void undo (unsigned int n); + void redo (unsigned int n); + + unsigned long undo_depth() const { return UndoList.size(); } + unsigned long redo_depth() const { return RedoList.size(); } + + std::string next_undo() const { return (UndoList.empty() ? std::string() : UndoList.back()->name()); } + std::string next_redo() const { return (RedoList.empty() ? std::string() : RedoList.back()->name()); } + + void clear (); + void clear_undo (); + void clear_redo (); + + XMLNode &get_state(int32_t depth = 0); + void save_state(); + + void set_depth (int32_t); + int32_t get_depth() const { return _depth; } + + sigc::signal<void> Changed; + + private: + bool _clearing; + int32_t _depth; + std::list<UndoTransaction*> UndoList; + std::list<UndoTransaction*> RedoList; + + void remove (UndoTransaction*); +}; + + +#endif /* __lib_pbd_undo_h__ */ |