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

205 lines
5.7 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Compose.h"
#include "AudioTrack.h"
#include "MidiTrack.h"
//#include "StyleItem.h"
#include "Undo.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
char* g_strUndoType[][16] = {
{ "调节音量", "预设段落结构", "改变全局音色库" },
{ "改变全局调号", "改变小节调号" },
{ "修改和弦" },
{ "删除音频", "复制音频", "移动音频", "导入音频片段", "录音", "局部音效处理" },
{ "插入小节/段", "删除小节/段", "移动小节/段", "改变小节/段风格" },
{ "添加乐器织体", "删除乐器织体", "更换乐器织体", "更换织体音色" },
{ "替换全曲风格", "调节段落音量", "调节织体音量" },
{ "添加轨道音效", "删除轨道音效", "改变音效顺序", "调节音效参数" },
{ "改变轨道状态", "调节轨道音量", "调节轨道声像", "调节轨道增益", "改变通道号" },
{ "添加音频轨道", "删除音频轨道", "删除全部音频轨道", "显示音频轨道", "显示全部音频轨道",
"隐藏音频轨道", "隐藏全部音频轨道" },
{ "添加MIDI轨道", "删除MIDI轨道", "删除全部MIDI轨道", "显示MIDI轨道", "显示全部MIDI轨道",
"隐藏MIDI轨道", "隐藏全部MIDI轨道" }
};
TUndo g_Undo;
//---------------------------------------------------------------------------
void DeleteList( TAudioTrackList* pList )
{
while( !pList->empty() ){
delete pList->back();
pList->pop_back();
}
}
void DeleteList( TMidiTrackList* pList )
{
while( !pList->empty() ){
delete pList->back();
pList->pop_back();
}
}
void DeleteList( TEffect* pList )
{
TEffect * pE = pList;
while( pE ){
TEffect *pTemp = pE->pNext;
delete pE;
pE = pTemp;
}
}
void DeleteList( TOpusStageList* pList )
{
while( !pList->empty() ){
delete pList->back();
pList->pop_back();
}
}
void TUndo::AddUndo( int iType, int iCode, int iBegin, int iEnd, void* pBefore, void* pAfter )
{
RemoveLites( m_iPos++ );
TUndoLite* pLite = new TUndoLite( iType, iCode, iBegin, iEnd );
pLite->pBefore = pBefore;
pLite->pAfter = pAfter;
m_lstLites.push_back( pLite );
}
//---------------------------------------------------------------------------
void TUndo::SetUndoExtra( int iExt1, int iExt2, int iExt3, void* pExt1, void* pExt2 )
{
TUndoLite* pLite = m_lstLites.back();
pLite->iExt1 = iExt1;
pLite->iExt2 = iExt2;
pLite->iExt3 = iExt3;
pLite->pExt1 = pExt1;
pLite->pExt2 = pExt2;
}
//---------------------------------------------------------------------------
void TUndo::SetUndoCode( int iCode )
{
TUndoLite* pLite = m_lstLites.back();
pLite->iCode = iCode;
}
//---------------------------------------------------------------------------
void TUndo::CancelUndo()
{
RemoveLites( --m_iPos );
}
//---------------------------------------------------------------------------
void TUndo::RemoveLites( int iFrom )
{
while( m_lstLites.size()>iFrom ){
TUndoLite* pLite = m_lstLites.back();
DelLiteParams( pLite );
delete pLite;
m_lstLites.pop_back();
}
}
//---------------------------------------------------------------------------
void TUndo::DelLiteParams( TUndoLite* pLite )
{
if( pLite->iType==UNDO_KEY_BARS ){
if( pLite->pBefore )
delete[] (int*)pLite->pBefore;
}
else if( pLite->iType==UNDO_CHORD ){
if( pLite->pBefore )
delete[] (BYTE*)pLite->pBefore;
if( pLite->pAfter )
delete[] (BYTE*)pLite->pAfter;
}
else if( pLite->iType==UNDO_TRKAUD_DEL || pLite->iType==UNDO_TRKAUD_DELALL ){
if( pLite->pBefore )
DeleteList( (TAudioTrackList*)pLite->pBefore );
}
else if( pLite->iType>=UNDO_TRKAUD_SHOW && pLite->iType<=UNDO_TRKAUD_HIDEALL
|| pLite->iType>=UNDO_TRKMID_SHOW && pLite->iType<=UNDO_TRKMID_HIDEALL ){
if( pLite->pBefore )
delete (vector<BYTE>*)pLite->pBefore;
}
else if( pLite->iType>=UNDO_AUDIO_ERASE && pLite->iType<=UNDO_AUDIO_FX ){
if( pLite->iCode>0 ){
if( pLite->pBefore )
delete[] (DWORD*)pLite->pBefore;
if( pLite->pAfter )
delete[] (DWORD*)pLite->pAfter;
if( pLite->pExt1 )
delete[] (DWORD*)pLite->pExt1;
if( pLite->pExt2 )
delete[] (DWORD*)pLite->pExt2;
}
else {
if( pLite->pBefore )
delete (TAudioTrack*)pLite->pBefore;
if( pLite->pAfter )
delete (TAudioTrack*)pLite->pAfter;
if( pLite->pExt1 )
DeleteList( (TOpusStageList*)pLite->pExt1 );
if( pLite->pExt2 )
DeleteList( (TOpusStageList*)pLite->pExt2 );
}
}
else if( pLite->iType>=UNDO_BAR_INSERT && pLite->iType<=UNDO_BAR_CHANGE
|| pLite->iType==UNDO_OPUS_STYLE
|| pLite->iType==UNDO_PRESET
|| pLite->iType==UNDO_KEY_MELODY ){
if( pLite->pBefore )
DeleteList( (TOpusStageList*)pLite->pBefore );
if( pLite->pAfter )
DeleteList( (TOpusStageList*)pLite->pAfter );
if( pLite->pExt1 )
DeleteList( (TAudioTrackList*)pLite->pExt1 );
}
else if( pLite->iType>=UNDO_MIDI_ADD && pLite->iType<=UNDO_MIDI_FONT
|| pLite->iType==UNDO_TRKMID_DEL ){
if( pLite->pBefore )
delete[] (TTrack*)pLite->pBefore;
if( pLite->pAfter )
delete (TTrack*)pLite->pAfter;
if( pLite->pExt1 )
delete (vector<DWORD>*)pLite->pExt1;
if( pLite->pExt2 )
delete (vector<DWORD>*)pLite->pExt2;
}
else if( pLite->iType==UNDO_TRKMID_DELALL ){
if( pLite->pBefore )
DeleteList( (TOpusStageList*)pLite->pBefore );
if( pLite->pAfter )
DeleteList( (TOpusStageList*)pLite->pAfter );
if( pLite->pExt1 )
DeleteList( (TMidiTrackList*)pLite->pExt1 );
}
else if( pLite->iType==UNDO_PROG_VOL ){
if( pLite->pExt1 )
delete (TTrack*)pLite->pExt1;
}
else if( pLite->iType>=UNDO_FX_ADD && pLite->iType<=UNDO_FX_MOVE ){
if( pLite->pBefore )
delete (TAudioFx*)pLite->pBefore;
if( pLite->pAfter )
delete (TAudioFx*)pLite->pAfter;
}
else if( pLite->iType==UNDO_FX_PARAM ){
if( pLite->pBefore )
delete (float*)pLite->pBefore;
if( pLite->pAfter )
delete (float*)pLite->pAfter;
}
}