You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rosegarden/src/document/MultiViewCommandHistory.h

154 lines
4.2 KiB

/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
/*
Rosegarden
A MIDI and audio sequencer and musical notation editor.
This program is Copyright 2000-2008
Guillaume Laurent <glaurent@telegraph-road.org>,
Chris Cannam <cannam@all-day-breakfast.com>,
Richard Bown <richard.bown@ferventsoftware.com>
The moral rights of Guillaume Laurent, Chris Cannam, and Richard
Bown to claim authorship of this work have been asserted.
Other copyrights also apply to some parts of this work. Please
see the AUTHORS file and individual file headers for details.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version. See the file
COPYING included with this distribution for more information.
*/
#ifndef _RG_MULTIVIEWCOMMANDHISTORY_H_
#define _RG_MULTIVIEWCOMMANDHISTORY_H_
#include <set>
#include <stack>
#include <tqobject.h>
class TQString;
class KCommand;
class KActionCollection;
namespace Rosegarden
{
/**
* The MultiViewCommandHistory class is much like KCommandHistory in
* that it stores a list of executed commands and maintains Undo and
* Redo actions synchronised with those commands.
*
* The difference is that MultiViewCommandHistory 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 TQObject
{
Q_OBJECT
TQ_OBJECT
public:
MultiViewCommandHistory();
virtual ~MultiViewCommandHistory();
void clear();
void attachView(KActionCollection *collection);
void detachView(KActionCollection *collection);
void addCommand(KCommand *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:
/**
* Remember when you saved the document.
* Call this right after saving the document. As soon as
* the history reaches the current index again (via some
* undo/redo operations) it will emit @ref documentRestored
* If you implemented undo/redo properly the document is
* the same you saved before.
*/
virtual void documentSaved();
protected slots:
void slotUndo();
void slotRedo();
void slotUndoAboutToShow();
void slotUndoActivated(int);
void slotRedoAboutToShow();
void slotRedoActivated(int);
signals:
/**
* This is emitted every time a command is executed
* (whether by addCommand, undo or redo).
* You can use this to update the GUI, for instance.
*/
void commandExecuted(KCommand *);
/**
* This is emitted every time a command is executed
* (whether by addCommand, undo or redo).
*
* It should be connected to the update() slot of widgets
* which need to tqrepaint after a command
*/
void commandExecuted();
/**
* This is emitted every time we reach the index where you
* saved the document for the last time. See @ref documentSaved
*/
void documentRestored();
private:
//--------------- Data members ---------------------------------
typedef std::set<KActionCollection *> ViewSet;
ViewSet m_views;
typedef std::stack<KCommand *> CommandStack;
CommandStack m_undoStack;
CommandStack m_redoStack;
int m_undoLimit;
int m_redoLimit;
int m_savedAt;
void updateButtons();
void updateButton(bool undo, const TQString &name, CommandStack &stack);
void updateMenu(bool undo, const TQString &name, CommandStack &stack);
void clipCommands();
void clipStack(CommandStack &stack, int limit);
void clearStack(CommandStack &stack);
};
}
#endif