Chris@16
|
1 /* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@16
|
2
|
Chris@16
|
3 /*
|
Chris@16
|
4 A waveform viewer and audio annotation editor.
|
Chris@16
|
5 Chris Cannam, Queen Mary University of London, 2005-2006
|
Chris@16
|
6
|
Chris@16
|
7 This is experimental software. Not for distribution.
|
Chris@16
|
8 */
|
Chris@16
|
9
|
Chris@16
|
10 /*
|
Chris@16
|
11 This is a modified version of a source file from the Rosegarden
|
Chris@16
|
12 MIDI and audio sequencer and notation editor, copyright 2000-2006
|
Chris@16
|
13 Chris Cannam, distributed under the GNU General Public License.
|
Chris@16
|
14
|
Chris@16
|
15 This file contains traces of the KCommandHistory class from the KDE
|
Chris@16
|
16 project, copyright 2000 Werner Trobin and David Faure and
|
Chris@16
|
17 distributed under the GNU Lesser General Public License.
|
Chris@16
|
18 */
|
Chris@16
|
19
|
Chris@16
|
20 #ifndef _MULTI_VIEW_COMMAND_HISTORY_H_
|
Chris@16
|
21 #define _MULTI_VIEW_COMMAND_HISTORY_H_
|
Chris@16
|
22
|
Chris@16
|
23 #include <QObject>
|
Chris@16
|
24 #include <QString>
|
Chris@16
|
25
|
Chris@16
|
26 #include <stack>
|
Chris@16
|
27 #include <set>
|
Chris@16
|
28 #include <map>
|
Chris@16
|
29
|
Chris@16
|
30 class Command;
|
Chris@16
|
31 class QAction;
|
Chris@16
|
32 class QMenu;
|
Chris@16
|
33 class QToolBar;
|
Chris@16
|
34
|
Chris@16
|
35 /**
|
Chris@17
|
36 * The CommandHistory class stores a list of executed commands and
|
Chris@17
|
37 * maintains Undo and Redo actions synchronised with those commands.
|
Chris@16
|
38 *
|
Chris@17
|
39 * CommandHistory allows you to associate more than one Undo and Redo
|
Chris@17
|
40 * menu or toolbar with the same command history, and it keeps them
|
Chris@17
|
41 * all up-to-date at once. This makes it effective in systems where
|
Chris@17
|
42 * multiple views may be editing the same data.
|
Chris@16
|
43 */
|
Chris@16
|
44
|
Chris@17
|
45 class CommandHistory : public QObject
|
Chris@16
|
46 {
|
Chris@16
|
47 Q_OBJECT
|
Chris@16
|
48
|
Chris@16
|
49 public:
|
Chris@17
|
50 virtual ~CommandHistory();
|
Chris@17
|
51
|
Chris@17
|
52 static CommandHistory *getInstance();
|
Chris@16
|
53
|
Chris@16
|
54 void clear();
|
Chris@16
|
55
|
Chris@16
|
56 void registerMenu(QMenu *menu);
|
Chris@16
|
57 void registerToolbar(QToolBar *toolbar);
|
Chris@16
|
58
|
Chris@16
|
59 void addCommand(Command *command, bool execute = true);
|
Chris@16
|
60
|
Chris@16
|
61 /// Return the maximum number of items in the undo history.
|
Chris@16
|
62 int undoLimit() { return m_undoLimit; }
|
Chris@16
|
63
|
Chris@16
|
64 /// Set the maximum number of items in the undo history.
|
Chris@16
|
65 void setUndoLimit(int limit);
|
Chris@16
|
66
|
Chris@16
|
67 /// Return the maximum number of items in the redo history.
|
Chris@16
|
68 int redoLimit() { return m_redoLimit; }
|
Chris@16
|
69
|
Chris@16
|
70 /// Set the maximum number of items in the redo history.
|
Chris@16
|
71 void setRedoLimit(int limit);
|
Chris@16
|
72
|
Chris@16
|
73 public slots:
|
Chris@16
|
74 /**
|
Chris@16
|
75 * Checkpoint function that should be called when the document is
|
Chris@16
|
76 * saved. If the undo/redo stack later returns to the point at
|
Chris@16
|
77 * which the document was saved, the documentRestored signal will
|
Chris@16
|
78 * be emitted.
|
Chris@16
|
79 */
|
Chris@16
|
80 virtual void documentSaved();
|
Chris@16
|
81
|
Chris@17
|
82 /**
|
Chris@17
|
83 * Add a command to the history that has already been executed,
|
Chris@17
|
84 * without executing it again. Equivalent to addCommand(command, false).
|
Chris@17
|
85 */
|
Chris@17
|
86 void addExecutedCommand(Command *);
|
Chris@17
|
87
|
Chris@17
|
88 /**
|
Chris@17
|
89 * Add a command to the history and also execute it. Equivalent
|
Chris@17
|
90 * to addCommand(command, true).
|
Chris@17
|
91 */
|
Chris@17
|
92 void addCommandAndExecute(Command *);
|
Chris@17
|
93
|
Chris@16
|
94 protected slots:
|
Chris@16
|
95 void undo();
|
Chris@16
|
96 void redo();
|
Chris@16
|
97 void undoActivated(QAction *);
|
Chris@16
|
98 void redoActivated(QAction *);
|
Chris@16
|
99
|
Chris@16
|
100 signals:
|
Chris@16
|
101 /**
|
Chris@17
|
102 * Emitted whenever a command has just been executed or
|
Chris@17
|
103 * unexecuted, whether by addCommand, undo, or redo.
|
Chris@17
|
104 */
|
Chris@17
|
105 void commandExecuted();
|
Chris@17
|
106
|
Chris@17
|
107 /**
|
Chris@16
|
108 * Emitted whenever a command has just been executed, whether by
|
Chris@17
|
109 * addCommand or redo.
|
Chris@16
|
110 */
|
Chris@16
|
111 void commandExecuted(Command *);
|
Chris@16
|
112
|
Chris@16
|
113 /**
|
Chris@17
|
114 * Emitted whenever a command has just been unexecuted, whether by
|
Chris@17
|
115 * addCommand or undo.
|
Chris@16
|
116 */
|
Chris@17
|
117 void commandUnexecuted(Command *);
|
Chris@16
|
118
|
Chris@16
|
119 /**
|
Chris@16
|
120 * Emitted when the undo/redo stack has reached the same state at
|
Chris@16
|
121 * which the documentSaved slot was last called.
|
Chris@16
|
122 */
|
Chris@16
|
123 void documentRestored();
|
Chris@16
|
124
|
Chris@17
|
125 protected:
|
Chris@17
|
126 CommandHistory();
|
Chris@17
|
127 static CommandHistory *m_instance;
|
Chris@17
|
128
|
Chris@16
|
129 QAction *m_undoAction;
|
Chris@16
|
130 QAction *m_redoAction;
|
Chris@17
|
131 QAction *m_undoMenuAction;
|
Chris@17
|
132 QAction *m_redoMenuAction;
|
Chris@16
|
133 QMenu *m_undoMenu;
|
Chris@16
|
134 QMenu *m_redoMenu;
|
Chris@16
|
135
|
Chris@16
|
136 std::map<QAction *, int> m_actionCounts;
|
Chris@16
|
137
|
Chris@16
|
138 typedef std::stack<Command *> CommandStack;
|
Chris@16
|
139 CommandStack m_undoStack;
|
Chris@16
|
140 CommandStack m_redoStack;
|
Chris@16
|
141
|
Chris@16
|
142 int m_undoLimit;
|
Chris@16
|
143 int m_redoLimit;
|
Chris@16
|
144 int m_savedAt;
|
Chris@16
|
145
|
Chris@16
|
146 void updateActions();
|
Chris@16
|
147
|
Chris@16
|
148 void clipCommands();
|
Chris@16
|
149
|
Chris@16
|
150 void clipStack(CommandStack &stack, int limit);
|
Chris@16
|
151 void clearStack(CommandStack &stack);
|
Chris@16
|
152 };
|
Chris@16
|
153
|
Chris@16
|
154
|
Chris@16
|
155 #endif
|