Files
2026-06-13 00:05:19 +08:00

131 lines
3.1 KiB
C++

//---------------------------------------------------------------------------
#ifndef UndoH
#define UndoH
//---------------------------------------------------------------------------
#define UNDO_VOLUME 0x00
#define UNDO_PRESET 0x01
#define UNDO_FONT_SET 0x02
#define UNDO_KEY_MELODY 0x10
#define UNDO_KEY_BARS 0x11
#define UNDO_CHORD 0x20
#define UNDO_AUDIO_ERASE 0x30
#define UNDO_AUDIO_COPY 0x31
#define UNDO_AUDIO_MOVE 0x32
#define UNDO_AUDIO_LOAD 0x33
#define UNDO_AUDIO_RECORD 0x34
#define UNDO_AUDIO_FX 0x35
#define UNDO_BAR_INSERT 0x40
#define UNDO_BAR_DELETE 0x41
#define UNDO_BAR_MOVE 0x42
#define UNDO_BAR_CHANGE 0x43
#define UNDO_MIDI_ADD 0x50
#define UNDO_MIDI_DEL 0x51
#define UNDO_MIDI_SUB 0x52
#define UNDO_MIDI_FONT 0x53
#define UNDO_OPUS_STYLE 0x60
#define UNDO_STAGE_VOL 0x61
#define UNDO_PROG_VOL 0x62
#define UNDO_FX_ADD 0x70
#define UNDO_FX_DEL 0x71
#define UNDO_FX_MOVE 0x72
#define UNDO_FX_PARAM 0x73
#define UNDO_TRACK_STATE 0x80
#define UNDO_TRACK_VOL 0x81
#define UNDO_TRACK_PAN 0x82
#define UNDO_TRACK_GAIN 0x83
#define UNDO_TRACK_CHNO 0x84
#define UNDO_TRKAUD_ADD 0x90
#define UNDO_TRKAUD_DEL 0x91
#define UNDO_TRKAUD_DELALL 0x92
#define UNDO_TRKAUD_SHOW 0x93
#define UNDO_TRKAUD_SHOWALL 0x94
#define UNDO_TRKAUD_HIDE 0x95
#define UNDO_TRKAUD_HIDEALL 0x96
#define UNDO_TRKMID_ADD 0xA0
#define UNDO_TRKMID_DEL 0xA1
#define UNDO_TRKMID_DELALL 0xA2
#define UNDO_TRKMID_SHOW 0xA3
#define UNDO_TRKMID_SHOWALL 0xA4
#define UNDO_TRKMID_HIDE 0xA5
#define UNDO_TRKMID_HIDEALL 0xA6
#include <vector>
using namespace std;
extern char* g_strUndoType[][16];
typedef struct tagUndoLite
{
int iType;
int iCode;
int iBegin, iEnd; //修改范围
int iExt1, iExt2, iExt3; //整形附加参数
void *pBefore, //修改前参数
*pAfter, //修改后参数
*pExt1, //指针型附加参数1
*pExt2; //指针型附加参数2
tagUndoLite( int iTypeP, int iCodeP, int iBeginP, int iEndP ){
iType = iTypeP;
iCode = iCodeP;
iBegin = iBeginP;
iEnd = iEndP;
iExt1 = iExt2 = iExt3 = 0;
pBefore = pAfter = pExt1 = pExt2 = NULL;
}
} TUndoLite;
class TUndo
{
private:
vector<TUndoLite*> m_lstLites; //操作列表
int m_iPos; //当前位置
void RemoveLites( int iFrom );
void DelLiteParams( TUndoLite* pLite );
public:
void AddUndo( int iType, int iCode, int iBegin, int iEnd, void* pBefore, void* pAfter );
void SetUndoExtra( int iExt1, int iExt2, int iExt3, void* pExt1, void* pExt2 );
void SetUndoCode( int iCode );
void CancelUndo();
TUndoLite* GetLastLite() { return m_iPos==0 ? NULL : m_lstLites[m_iPos-1]; };
int GetUndoType()
{ return m_iPos>0 ? m_lstLites[m_iPos-1]->iType : -1; };
int GetRedoType()
{ return m_iPos<m_lstLites.size() ? m_lstLites[m_iPos]->iType : -1; };
int GetUndoCode()
{ return m_iPos>0 ? m_lstLites[m_iPos-1]->iCode : -1; };
int GetRedoCode()
{ return m_iPos<m_lstLites.size() ? m_lstLites[m_iPos]->iCode : -1; };
TUndoLite* Undo()
{ return m_lstLites[--m_iPos]; };
TUndoLite* Redo()
{ return m_lstLites[m_iPos++]; };
void ClearUndoList()
{ RemoveLites( m_iPos = 0 ); };
TUndo()
{ m_iPos = 0; };
~TUndo()
{ ClearUndoList(); };
};
extern TUndo g_Undo;
#endif