]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - include/iundo.h
Merge commit '830125fad042fad35dc029b6eb57c8156ad7e176'
[xonotic/netradiant.git] / include / iundo.h
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #if !defined( INCLUDED_IUNDO_H )
23 #define INCLUDED_IUNDO_H
24
25 /// \file
26 /// \brief The undo-system interface. Uses the 'memento' pattern.
27
28 #include <cstddef>
29 #include "generic/constant.h"
30 #include "generic/callbackfwd.h"
31
32 class UndoMemento
33 {
34 public:
35 virtual void release() = 0;
36 };
37
38 class Undoable
39 {
40 public:
41 virtual UndoMemento* exportState() const = 0;
42 virtual void importState( const UndoMemento* state ) = 0;
43 };
44
45 class UndoObserver
46 {
47 public:
48 virtual void save( Undoable* undoable ) = 0;
49 };
50
51 class UndoTracker
52 {
53 public:
54 virtual void clear() = 0;
55 virtual void begin() = 0;
56 virtual void undo() = 0;
57 virtual void redo() = 0;
58 };
59
60 class UndoSystem
61 {
62 public:
63 INTEGER_CONSTANT( Version, 1 );
64 STRING_CONSTANT( Name, "undo" );
65
66 virtual UndoObserver* observer( Undoable* undoable ) = 0;
67 virtual void release( Undoable* undoable ) = 0;
68
69 virtual std::size_t size() const = 0;
70 virtual void start() = 0;
71 virtual void finish( const char* command ) = 0;
72 virtual void undo() = 0;
73 virtual void redo() = 0;
74 virtual void clear() = 0;
75
76 virtual void trackerAttach( UndoTracker& tracker ) = 0;
77 virtual void trackerDetach( UndoTracker& tracker ) = 0;
78 };
79
80 #include "modulesystem.h"
81
82 template<typename Type>
83 class GlobalModule;
84 typedef GlobalModule<UndoSystem> GlobalUndoModule;
85
86 template<typename Type>
87 class GlobalModuleRef;
88 typedef GlobalModuleRef<UndoSystem> GlobalUndoModuleRef;
89
90 inline UndoSystem& GlobalUndoSystem(){
91         return GlobalUndoModule::getTable();
92 }
93
94 class UndoableCommand
95 {
96 const char* m_command;
97 public:
98 UndoableCommand( const char* command ) : m_command( command ){
99         GlobalUndoSystem().start();
100 }
101 ~UndoableCommand(){
102         GlobalUndoSystem().finish( m_command );
103 }
104 };
105
106
107 #endif