Chris@16: /* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */ Chris@16: Chris@16: /* Chris@16: A waveform viewer and audio annotation editor. Chris@16: Chris Cannam, Queen Mary University of London, 2005-2006 Chris@16: Chris@16: This is experimental software. Not for distribution. Chris@16: */ Chris@16: Chris@16: /* Chris@16: This is a modified version of a source file from the Rosegarden Chris@16: MIDI and audio sequencer and notation editor, copyright 2000-2006 Chris@16: Chris Cannam, distributed under the GNU General Public License. Chris@16: Chris@16: This file contains traces of the KCommandHistory class from the KDE Chris@16: project, copyright 2000 Werner Trobin and David Faure and Chris@16: distributed under the GNU Lesser General Public License. Chris@16: */ Chris@16: Chris@16: #ifndef _MULTI_VIEW_COMMAND_HISTORY_H_ Chris@16: #define _MULTI_VIEW_COMMAND_HISTORY_H_ Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: class Command; Chris@44: class MacroCommand; Chris@16: class QAction; Chris@16: class QMenu; Chris@16: class QToolBar; Chris@16: Chris@16: /** Chris@17: * The CommandHistory class stores a list of executed commands and Chris@17: * maintains Undo and Redo actions synchronised with those commands. Chris@16: * Chris@17: * CommandHistory allows you to associate more than one Undo and Redo Chris@17: * menu or toolbar with the same command history, and it keeps them Chris@17: * all up-to-date at once. This makes it effective in systems where Chris@17: * multiple views may be editing the same data. Chris@16: */ Chris@16: Chris@17: class CommandHistory : public QObject Chris@16: { Chris@16: Q_OBJECT Chris@16: Chris@16: public: Chris@17: virtual ~CommandHistory(); Chris@17: Chris@17: static CommandHistory *getInstance(); Chris@16: Chris@16: void clear(); Chris@16: Chris@16: void registerMenu(QMenu *menu); Chris@16: void registerToolbar(QToolBar *toolbar); Chris@16: Chris@16: void addCommand(Command *command, bool execute = true); Chris@16: Chris@16: /// Return the maximum number of items in the undo history. Chris@46: int getUndoLimit() const { return m_undoLimit; } Chris@16: Chris@16: /// Set the maximum number of items in the undo history. Chris@16: void setUndoLimit(int limit); Chris@16: Chris@16: /// Return the maximum number of items in the redo history. Chris@46: int getRedoLimit() const { return m_redoLimit; } Chris@16: Chris@16: /// Set the maximum number of items in the redo history. Chris@16: void setRedoLimit(int limit); Chris@16: Chris@46: /// Return the maximum number of items visible in undo and redo menus. Chris@46: int getMenuLimit() const { return m_menuLimit; } Chris@46: Chris@46: /// Set the maximum number of items in the menus. Chris@46: void setMenuLimit(int limit); Chris@46: Chris@44: /// Start recording commands to batch up into a single compound command. Chris@44: void startCompoundOperation(QString name, bool execute); Chris@44: Chris@44: /// Finish recording commands and store the compound command. Chris@44: void endCompoundOperation(); Chris@44: Chris@16: public slots: Chris@16: /** Chris@16: * Checkpoint function that should be called when the document is Chris@16: * saved. If the undo/redo stack later returns to the point at Chris@16: * which the document was saved, the documentRestored signal will Chris@16: * be emitted. Chris@16: */ Chris@16: virtual void documentSaved(); Chris@16: Chris@17: /** Chris@17: * Add a command to the history that has already been executed, Chris@17: * without executing it again. Equivalent to addCommand(command, false). Chris@17: */ Chris@17: void addExecutedCommand(Command *); Chris@17: Chris@17: /** Chris@17: * Add a command to the history and also execute it. Equivalent Chris@17: * to addCommand(command, true). Chris@17: */ Chris@17: void addCommandAndExecute(Command *); Chris@17: Chris@16: protected slots: Chris@16: void undo(); Chris@16: void redo(); Chris@16: void undoActivated(QAction *); Chris@16: void redoActivated(QAction *); Chris@16: Chris@16: signals: Chris@16: /** Chris@17: * Emitted whenever a command has just been executed or Chris@17: * unexecuted, whether by addCommand, undo, or redo. Chris@17: */ Chris@17: void commandExecuted(); Chris@17: Chris@17: /** Chris@16: * Emitted whenever a command has just been executed, whether by Chris@17: * addCommand or redo. Chris@16: */ Chris@16: void commandExecuted(Command *); Chris@16: Chris@16: /** Chris@17: * Emitted whenever a command has just been unexecuted, whether by Chris@17: * addCommand or undo. Chris@16: */ Chris@17: void commandUnexecuted(Command *); Chris@16: Chris@16: /** Chris@16: * Emitted when the undo/redo stack has reached the same state at Chris@16: * which the documentSaved slot was last called. Chris@16: */ Chris@16: void documentRestored(); Chris@16: Chris@17: protected: Chris@17: CommandHistory(); Chris@17: static CommandHistory *m_instance; Chris@17: Chris@16: QAction *m_undoAction; Chris@16: QAction *m_redoAction; Chris@17: QAction *m_undoMenuAction; Chris@17: QAction *m_redoMenuAction; Chris@16: QMenu *m_undoMenu; Chris@16: QMenu *m_redoMenu; Chris@16: Chris@16: std::map m_actionCounts; Chris@16: Chris@16: typedef std::stack CommandStack; Chris@16: CommandStack m_undoStack; Chris@16: CommandStack m_redoStack; Chris@16: Chris@16: int m_undoLimit; Chris@16: int m_redoLimit; Chris@46: int m_menuLimit; Chris@16: int m_savedAt; Chris@16: Chris@44: MacroCommand *m_currentMacro; Chris@44: bool m_executeMacro; Chris@44: void addToMacro(Command *command); Chris@44: Chris@16: void updateActions(); Chris@16: Chris@16: void clipCommands(); Chris@16: Chris@16: void clipStack(CommandStack &stack, int limit); Chris@16: void clearStack(CommandStack &stack); Chris@16: }; Chris@16: Chris@16: Chris@16: #endif