annotate base/CommandHistory.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7
lbajardsilogic@0 8 This program is free software; you can redistribute it and/or
lbajardsilogic@0 9 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 10 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 11 License, or (at your option) any later version. See the file
lbajardsilogic@0 12 COPYING included with this distribution for more information.
lbajardsilogic@0 13 */
lbajardsilogic@0 14
lbajardsilogic@0 15 /*
lbajardsilogic@0 16 This is a modified version of a source file from the Rosegarden
lbajardsilogic@0 17 MIDI and audio sequencer and notation editor, copyright 2000-2006
lbajardsilogic@0 18 Chris Cannam, distributed under the GNU General Public License.
lbajardsilogic@0 19
lbajardsilogic@0 20 This file contains traces of the KCommandHistory class from the KDE
lbajardsilogic@0 21 project, copyright 2000 Werner Trobin and David Faure and
lbajardsilogic@0 22 distributed under the GNU Lesser General Public License.
lbajardsilogic@0 23 */
lbajardsilogic@0 24
lbajardsilogic@0 25 #ifndef _MULTI_VIEW_COMMAND_HISTORY_H_
lbajardsilogic@0 26 #define _MULTI_VIEW_COMMAND_HISTORY_H_
lbajardsilogic@0 27
lbajardsilogic@0 28 #include <QObject>
lbajardsilogic@0 29 #include <QString>
lbajardsilogic@0 30
lbajardsilogic@0 31 #include <stack>
lbajardsilogic@0 32 #include <set>
lbajardsilogic@0 33 #include <map>
lbajardsilogic@0 34
lbajardsilogic@0 35 class Command;
lbajardsilogic@0 36 class MacroCommand;
lbajardsilogic@0 37 class QAction;
lbajardsilogic@0 38 class QMenu;
lbajardsilogic@0 39 class QToolBar;
lbajardsilogic@0 40 class QTimer;
lbajardsilogic@0 41
lbajardsilogic@0 42 /**
lbajardsilogic@0 43 * The CommandHistory class stores a list of executed commands and
lbajardsilogic@0 44 * maintains Undo and Redo actions synchronised with those commands.
lbajardsilogic@0 45 *
lbajardsilogic@0 46 * CommandHistory allows you to associate more than one Undo and Redo
lbajardsilogic@0 47 * menu or toolbar with the same command history, and it keeps them
lbajardsilogic@0 48 * all up-to-date at once. This makes it effective in systems where
lbajardsilogic@0 49 * multiple views may be editing the same data.
lbajardsilogic@0 50 */
lbajardsilogic@0 51
lbajardsilogic@0 52 class CommandHistory : public QObject
lbajardsilogic@0 53 {
lbajardsilogic@0 54 Q_OBJECT
lbajardsilogic@0 55
lbajardsilogic@0 56 public:
lbajardsilogic@0 57 virtual ~CommandHistory();
lbajardsilogic@0 58
lbajardsilogic@0 59 static CommandHistory *getInstance();
lbajardsilogic@0 60
lbajardsilogic@0 61 void clear();
lbajardsilogic@0 62
lbajardsilogic@0 63 void registerMenu(QMenu *menu);
lbajardsilogic@0 64 void registerToolbar(QToolBar *toolbar);
lbajardsilogic@0 65
lbajardsilogic@0 66 /**
lbajardsilogic@0 67 * Add a command to the command history.
lbajardsilogic@0 68 *
lbajardsilogic@0 69 * The command will normally be executed before being added; but
lbajardsilogic@0 70 * if a compound operation is in use (see startCompoundOperation
lbajardsilogic@0 71 * below), the execute status of the compound operation will
lbajardsilogic@0 72 * determine whether the command is executed or not.
lbajardsilogic@0 73 */
lbajardsilogic@0 74 void addCommand(Command *command);
lbajardsilogic@0 75
lbajardsilogic@0 76 /**
lbajardsilogic@0 77 * Add a command to the command history.
lbajardsilogic@0 78 *
lbajardsilogic@0 79 * If execute is true, the command will be executed before being
lbajardsilogic@0 80 * added. Otherwise it will be assumed to have been already
lbajardsilogic@0 81 * executed -- a command should not be added to the history unless
lbajardsilogic@0 82 * its work has actually been done somehow!
lbajardsilogic@0 83 *
lbajardsilogic@0 84 * If a compound operation is in use (see startCompoundOperation
lbajardsilogic@0 85 * below), the execute value passed to this method will override
lbajardsilogic@0 86 * the execute status of the compound operation. In this way it's
lbajardsilogic@0 87 * possible to have a compound operation mixing both to-execute
lbajardsilogic@0 88 * and pre-executed commands.
lbajardsilogic@0 89 *
lbajardsilogic@0 90 * If bundle is true, the command will be a candidate for bundling
lbajardsilogic@0 91 * with any adjacent bundeable commands that have the same name,
lbajardsilogic@0 92 * into a single compound command. This is useful for small
lbajardsilogic@0 93 * commands that may be executed repeatedly altering the same data
lbajardsilogic@0 94 * (e.g. type text, set a parameter) whose number and extent is
lbajardsilogic@0 95 * not known in advance. The bundle parameter will be ignored if
lbajardsilogic@0 96 * a compound operation is already in use.
lbajardsilogic@0 97 */
lbajardsilogic@0 98 void addCommand(Command *command, bool execute, bool bundle = false);
lbajardsilogic@0 99
lbajardsilogic@0 100 /// Return the maximum number of items in the undo history.
lbajardsilogic@0 101 int getUndoLimit() const { return m_undoLimit; }
lbajardsilogic@0 102
lbajardsilogic@0 103 /// Set the maximum number of items in the undo history.
lbajardsilogic@0 104 void setUndoLimit(int limit);
lbajardsilogic@0 105
lbajardsilogic@0 106 /// Return the maximum number of items in the redo history.
lbajardsilogic@0 107 int getRedoLimit() const { return m_redoLimit; }
lbajardsilogic@0 108
lbajardsilogic@0 109 /// Set the maximum number of items in the redo history.
lbajardsilogic@0 110 void setRedoLimit(int limit);
lbajardsilogic@0 111
lbajardsilogic@0 112 /// Return the maximum number of items visible in undo and redo menus.
lbajardsilogic@0 113 int getMenuLimit() const { return m_menuLimit; }
lbajardsilogic@0 114
lbajardsilogic@0 115 /// Set the maximum number of items in the menus.
lbajardsilogic@0 116 void setMenuLimit(int limit);
lbajardsilogic@0 117
lbajardsilogic@0 118 /// Return the time after which a bundle will be closed if nothing is added.
lbajardsilogic@0 119 int getBundleTimeout() const { return m_bundleTimeout; }
lbajardsilogic@0 120
lbajardsilogic@0 121 /// Set the time after which a bundle will be closed if nothing is added.
lbajardsilogic@0 122 void setBundleTimeout(int msec);
lbajardsilogic@0 123
lbajardsilogic@0 124 /// Start recording commands to batch up into a single compound command.
lbajardsilogic@0 125 void startCompoundOperation(QString name, bool execute);
lbajardsilogic@0 126
lbajardsilogic@0 127 /// Finish recording commands and store the compound command.
lbajardsilogic@0 128 void endCompoundOperation();
lbajardsilogic@0 129
lbajardsilogic@0 130 public slots:
lbajardsilogic@0 131 /**
lbajardsilogic@0 132 * Checkpoint function that should be called when the document is
lbajardsilogic@0 133 * saved. If the undo/redo stack later returns to the point at
lbajardsilogic@0 134 * which the document was saved, the documentRestored signal will
lbajardsilogic@0 135 * be emitted.
lbajardsilogic@0 136 */
lbajardsilogic@0 137 virtual void documentSaved();
lbajardsilogic@0 138
lbajardsilogic@0 139 /**
lbajardsilogic@0 140 * Add a command to the history that has already been executed,
lbajardsilogic@0 141 * without executing it again. Equivalent to addCommand(command, false).
lbajardsilogic@0 142 */
lbajardsilogic@0 143 void addExecutedCommand(Command *);
lbajardsilogic@0 144
lbajardsilogic@0 145 /**
lbajardsilogic@0 146 * Add a command to the history and also execute it. Equivalent
lbajardsilogic@0 147 * to addCommand(command, true).
lbajardsilogic@0 148 */
lbajardsilogic@0 149 void addCommandAndExecute(Command *);
lbajardsilogic@0 150
lbajardsilogic@0 151 void undo();
lbajardsilogic@0 152 void redo();
lbajardsilogic@0 153
lbajardsilogic@0 154 protected slots:
lbajardsilogic@0 155 void undoActivated(QAction *);
lbajardsilogic@0 156 void redoActivated(QAction *);
lbajardsilogic@0 157 void bundleTimerTimeout();
lbajardsilogic@0 158
lbajardsilogic@0 159 signals:
lbajardsilogic@0 160 /**
lbajardsilogic@0 161 * Emitted whenever a command has just been executed or
lbajardsilogic@0 162 * unexecuted, whether by addCommand, undo, or redo.
lbajardsilogic@0 163 */
lbajardsilogic@0 164 void commandExecuted();
lbajardsilogic@0 165
lbajardsilogic@0 166 /**
lbajardsilogic@0 167 * Emitted whenever a command has just been executed, whether by
lbajardsilogic@0 168 * addCommand or redo.
lbajardsilogic@0 169 */
lbajardsilogic@0 170 void commandExecuted(Command *);
lbajardsilogic@0 171
lbajardsilogic@0 172 /**
lbajardsilogic@0 173 * Emitted whenever a command has just been unexecuted, whether by
lbajardsilogic@0 174 * addCommand or undo.
lbajardsilogic@0 175 */
lbajardsilogic@0 176 void commandUnexecuted(Command *);
lbajardsilogic@0 177
lbajardsilogic@0 178 /**
lbajardsilogic@0 179 * Emitted when the undo/redo stack has reached the same state at
lbajardsilogic@0 180 * which the documentSaved slot was last called.
lbajardsilogic@0 181 */
lbajardsilogic@0 182 void documentRestored();
lbajardsilogic@0 183
lbajardsilogic@0 184 protected:
lbajardsilogic@0 185 CommandHistory();
lbajardsilogic@0 186 static CommandHistory *m_instance;
lbajardsilogic@0 187
lbajardsilogic@0 188 QAction *m_undoAction;
lbajardsilogic@0 189 QAction *m_redoAction;
lbajardsilogic@0 190 QAction *m_undoMenuAction;
lbajardsilogic@0 191 QAction *m_redoMenuAction;
lbajardsilogic@0 192 QMenu *m_undoMenu;
lbajardsilogic@0 193 QMenu *m_redoMenu;
lbajardsilogic@0 194
lbajardsilogic@0 195 std::map<QAction *, int> m_actionCounts;
lbajardsilogic@0 196
lbajardsilogic@0 197 typedef std::stack<Command *> CommandStack;
lbajardsilogic@0 198 CommandStack m_undoStack;
lbajardsilogic@0 199 CommandStack m_redoStack;
lbajardsilogic@0 200
lbajardsilogic@0 201 int m_undoLimit;
lbajardsilogic@0 202 int m_redoLimit;
lbajardsilogic@0 203 int m_menuLimit;
lbajardsilogic@0 204 int m_savedAt;
lbajardsilogic@0 205
lbajardsilogic@0 206 MacroCommand *m_currentCompound;
lbajardsilogic@0 207 bool m_executeCompound;
lbajardsilogic@0 208 void addToCompound(Command *command, bool execute);
lbajardsilogic@0 209
lbajardsilogic@0 210 MacroCommand *m_currentBundle;
lbajardsilogic@0 211 QString m_currentBundleName;
lbajardsilogic@0 212 QTimer *m_bundleTimer;
lbajardsilogic@0 213 int m_bundleTimeout;
lbajardsilogic@0 214 void addToBundle(Command *command, bool execute);
lbajardsilogic@0 215 void closeBundle();
lbajardsilogic@0 216
lbajardsilogic@0 217 void updateActions();
lbajardsilogic@0 218
lbajardsilogic@0 219 void clipCommands();
lbajardsilogic@0 220
lbajardsilogic@0 221 void clipStack(CommandStack &stack, int limit);
lbajardsilogic@0 222 void clearStack(CommandStack &stack);
lbajardsilogic@0 223 };
lbajardsilogic@0 224
lbajardsilogic@0 225
lbajardsilogic@0 226 #endif