diff base/MultiViewCommandHistory.h @ 16:cc98d496d52b

* Add command history class, and basic undo/redo menus. No actual commands to undo/redo yet. Selecting the placeholders sometimes seems to cause a crash, so this looks a little uncertain so far. * Add Rename Layer * Remove models from playback when their layers are removed (and ref counts hit zero) * Don't hang around waiting so much when there's work to be done in the audio buffer fill thread * Put more sensible names on layers generated from transforms * Add basic editing to time-value layer like existing editing in time-instants layer, and make both of them snap to the appropriate resolution during drag
author Chris Cannam
date Mon, 30 Jan 2006 17:51:56 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base/MultiViewCommandHistory.h	Mon Jan 30 17:51:56 2006 +0000
@@ -0,0 +1,136 @@
+/* -*- c-basic-offset: 4 -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    A waveform viewer and audio annotation editor.
+    Chris Cannam, Queen Mary University of London, 2005-2006
+    
+    This is experimental software.  Not for distribution.
+*/
+
+/*
+   This is a modified version of a source file from the Rosegarden
+   MIDI and audio sequencer and notation editor, copyright 2000-2006
+   Chris Cannam, distributed under the GNU General Public License.
+
+   This file contains traces of the KCommandHistory class from the KDE
+   project, copyright 2000 Werner Trobin and David Faure and
+   distributed under the GNU Lesser General Public License.
+*/
+
+#ifndef _MULTI_VIEW_COMMAND_HISTORY_H_
+#define _MULTI_VIEW_COMMAND_HISTORY_H_
+
+#include <QObject>
+#include <QString>
+
+#include <stack>
+#include <set>
+#include <map>
+
+class Command;
+class QAction;
+class QMenu;
+class QToolBar;
+
+/**
+ * The MultiViewCommandHistory class stores a list of executed
+ * commands and maintains Undo and Redo actions synchronised with
+ * those commands.
+ *
+ * MultiViewCommandHistory also allows you to associate more than one
+ * Undo and Redo action with the same command history, and it keeps
+ * them all up-to-date at once.  This makes it effective in systems
+ * where multiple views may be editing the same data at once.
+ */
+
+class MultiViewCommandHistory : public QObject
+{
+    Q_OBJECT
+
+public:
+    MultiViewCommandHistory();
+    virtual ~MultiViewCommandHistory();
+
+    void clear();
+    
+    void registerMenu(QMenu *menu);
+    void registerToolbar(QToolBar *toolbar);
+
+    void addCommand(Command *command, bool execute = true);
+    
+    /// Return the maximum number of items in the undo history.
+    int undoLimit() { return m_undoLimit; }
+
+    /// Set the maximum number of items in the undo history.
+    void setUndoLimit(int limit);
+
+    /// Return the maximum number of items in the redo history.
+    int redoLimit() { return m_redoLimit; }
+
+    /// Set the maximum number of items in the redo history.
+    void setRedoLimit(int limit);
+    
+public slots:
+    /**
+     * Checkpoint function that should be called when the document is
+     * saved.  If the undo/redo stack later returns to the point at
+     * which the document was saved, the documentRestored signal will
+     * be emitted.
+     */
+    virtual void documentSaved();
+
+protected slots:
+    void undo();
+    void redo();
+    void undoActivated(QAction *);
+    void redoActivated(QAction *);
+
+signals:
+    /**
+     * Emitted whenever a command has just been executed, whether by
+     * addCommand, undo, or redo.
+     */
+    void commandExecuted(Command *);
+
+    /**
+     * Emitted whenever a command has just been executed, whether by
+     * addCommand, undo, or redo.
+     */
+    void commandExecuted();
+
+    /**
+     * Emitted when the undo/redo stack has reached the same state at
+     * which the documentSaved slot was last called.
+     */
+    void documentRestored();
+
+private:
+    QAction *m_undoAction;
+    QAction *m_redoAction;
+    QMenu *m_undoMenu;
+    QMenu *m_redoMenu;
+
+    std::map<QAction *, int> m_actionCounts;
+
+    typedef std::stack<Command *> CommandStack;
+    CommandStack m_undoStack;
+    CommandStack m_redoStack;
+
+    int m_undoLimit;
+    int m_redoLimit;
+    int m_savedAt;
+
+    void updateActions();
+//    void updateMenus();
+
+//    void updateButtons();
+//    void updateButton(bool undo, const QString &name, CommandStack &stack);
+//    void updateMenu(bool undo, const QString &name, CommandStack &stack);
+    void clipCommands();
+
+    void clipStack(CommandStack &stack, int limit);
+    void clearStack(CommandStack &stack);
+};
+
+
+#endif