Files
2026-06-13 00:10:11 +08:00

345 lines
7.6 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "BackupUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
TMelodyBackup::TMelodyBackup()
{
m_iKey = -1;
m_nBarCount = 0;
m_nStageCount = 0;
m_bModified = false;
m_aChords = NULL;
m_aFills = NULL;
m_aStages = NULL;
}
TMelodyBackup::~TMelodyBackup()
{
Clear();
}
void TMelodyBackup::Clear()
{
m_iKey = -1;
m_nBarCount = 0;
m_nStageCount = 0;
m_bModified = false;
if( m_aChords ){
delete[] m_aChords;
m_aChords = NULL;
}
if( m_aFills ){
delete[] m_aFills;
m_aFills = NULL;
}
if( m_aStages ){
delete[] m_aStages;
m_aStages = NULL;
}
}
void TMelodyBackup::Backup()
{
//±¸·ÝMelodyÊý¾Ý
m_iKey = g_iMelodyKey;
if( m_nBarCount!=g_lstMelodyBars.size() ){
m_nBarCount = g_lstMelodyBars.size();
if( m_aChords ){
delete m_aChords;
m_aChords = NULL;
}
m_aChords = new int[m_nBarCount][2];
if( m_aFills ){
delete m_aFills;
m_aFills = NULL;
}
m_aFills = new int[m_nBarCount];
}
if( m_nStageCount!=g_lstMelodyStages.size() ){
m_nStageCount = g_lstMelodyStages.size();
if( m_aStages ){
delete m_aStages;
m_aStages = NULL;
}
m_aStages = new int[g_lstMelodyStages.size()][3];
}
for( int i=0; i<g_lstMelodyBars.size(); i++ ){
MELODYBAR *pMBar = g_lstMelodyBars[i];
m_aChords[i][0] = pMBar->iChords[0];
m_aChords[i][1] = pMBar->iChords[1];
m_aFills[i] = pMBar->iFill;
}
for( int i=0; i<g_lstMelodyStages.size(); i++ ){
MELODYSTAGE* pStage = g_lstMelodyStages[i];
m_aStages[i][0] = pStage->iFirstBar;
m_aStages[i][1] = pStage->iLastBar;
m_aStages[i][2] = pStage->iVar;
}
m_bModified = false;
}
void TMelodyBackup::Restore()
{
g_iMelodyKey = m_iKey;
for( int i=0; i<g_lstMelodyBars.size(); i++ ){
MELODYBAR *pMBar = g_lstMelodyBars[i];
pMBar->iChords[0] = m_aChords[i][0];
pMBar->iChords[1] = m_aChords[i][1];
pMBar->iFill = m_aFills[i];
}
if( m_nStageCount!=g_lstMelodyStages.size() ){
ClearGlobalVars( LIST_MELODYSTAGES );
for( int i=0; i<m_nStageCount; i++ ){
MELODYSTAGE * pStage = new MELODYSTAGE;
pStage->iFirstBar = m_aStages[i][0];
pStage->iLastBar = m_aStages[i][1];
pStage->iVar = m_aStages[i][2];
g_lstMelodyStages.push_back( pStage );
}
}
else{
for( int i=0; i<m_nStageCount; i++ ){
MELODYSTAGE * pStage = g_lstMelodyStages[i];
pStage->iFirstBar = m_aStages[i][0];
pStage->iLastBar = m_aStages[i][1];
pStage->iVar = m_aStages[i][2];
}
}
m_bModified = false;
}
BOOL TMelodyBackup::CheckModified( int iCheckType )
{
if( iCheckType==CHECK_GET ){
return m_bModified;
}
m_bModified &= ~iCheckType;
if( iCheckType & CHECK_KEY ){
if( m_iKey != g_iMelodyKey )
m_bModified |= CHECK_KEY;
}
if( iCheckType & CHECK_BAR ){
if( m_nBarCount!=g_lstMelodyBars.size() ){
m_bModified |= CHECK_BAR;
}
}
if( !(m_bModified & CHECK_BAR) && ((iCheckType & CHECK_CHORD)||(iCheckType & CHECK_FILL) )){
for( int i=0; i<m_nBarCount; i++ ){
MELODYBAR *pMBar = g_lstMelodyBars[i];
if( !(m_bModified & CHECK_CHORD) && (iCheckType & CHECK_CHORD) ){
if( m_aChords[i][0]!=pMBar->iChords[0] || m_aChords[i][1]!=pMBar->iChords[1] ){
m_bModified |= CHECK_CHORD;
}
}
if( !(m_bModified & CHECK_FILL ) && (iCheckType & CHECK_FILL ) ){
if( m_aFills[i]!=pMBar->iFill ){
m_bModified |= CHECK_FILL;
}
}
}
}
if( iCheckType & CHECK_STAGE ){
if( m_nStageCount!=g_lstMelodyStages.size() ){
m_bModified |= CHECK_STAGE;
}
}
if( !(m_bModified & CHECK_STAGE) && ((iCheckType & CHECK_POS)||(iCheckType & CHECK_VAR))){
for( int i=0; i<m_nStageCount; i++ ){
MELODYSTAGE* pStage = g_lstMelodyStages[i];
if( !(m_bModified & CHECK_POS) && (iCheckType & CHECK_POS) ){
if( m_aStages[i][0]!=pStage->iFirstBar || m_aStages[i][1]!=pStage->iLastBar ){
m_bModified |= CHECK_POS;
}
}
if( !(m_bModified & CHECK_VAR) && (iCheckType & CHECK_VAR ) ){
if( m_aStages[i][2]!=pStage->iVar ){
m_bModified |= CHECK_VAR;
}
}
}
}
return m_bModified;
}
TComposeBackup::TComposeBackup()
{
m_nStageCount = 0;
m_bModified = false;
m_iKey = -1;
}
TComposeBackup::~TComposeBackup()
{
Clear();
}
void TComposeBackup::Backup( int iKey )
{
Clear();
m_iKey = iKey;
m_nStageCount = g_lstComposeStages.size();
for( int i=0; i<m_nStageCount; i++ ){
COMPOSESTAGE *pNewStage = new COMPOSESTAGE;
COMPOSESTAGE *pBkStage = g_lstComposeStages[i];
pNewStage->iMelodyStage = pBkStage->iMelodyStage;
pNewStage->nStageBars = pBkStage->nStageBars;
pNewStage->iVar = pBkStage->iVar;
pNewStage->idStyle = pBkStage->idStyle;
pNewStage->strStyleName = pBkStage->strStyleName;
for( int j=0; j<pBkStage->aFills.size(); j++ ){
pNewStage->aFills.push_back(pBkStage->aFills[j]);
}
m_lstStages.push_back( pNewStage );
}
m_bModified = false;
}
void TComposeBackup::Restore()
{
if( m_nStageCount!=g_lstComposeStages.size() ){
ClearGlobalVars( LIST_COMPOSESTAGES );
for( int i=0; i<m_nStageCount; i++ ){
COMPOSESTAGE *pNewStage = new COMPOSESTAGE;
COMPOSESTAGE *pBkStage = m_lstStages[i];
pNewStage->iMelodyStage = pBkStage->iMelodyStage;
pNewStage->nStageBars = pBkStage->nStageBars;
pNewStage->iVar = pBkStage->iVar;
pNewStage->idStyle = pBkStage->idStyle;
pNewStage->strStyleName = pBkStage->strStyleName;
for( int j=0; j<pBkStage->aFills.size(); j++ ){
pNewStage->aFills.push_back(pBkStage->aFills[j]);
}
g_lstComposeStages.push_back( pNewStage );
}
}
else{
for( int i=0; i<m_nStageCount; i++ ){
COMPOSESTAGE *pCStage = g_lstComposeStages[i];
COMPOSESTAGE *pBkStage = m_lstStages[i];
pCStage->iMelodyStage = pBkStage->iMelodyStage;
pCStage->nStageBars = pBkStage->nStageBars;
pCStage->iVar = pBkStage->iVar;
pCStage->idStyle = pBkStage->idStyle;
pCStage->aFills.clear();
for( int j=0; j<pBkStage->aFills.size(); j++ ){
pCStage->aFills.push_back(pBkStage->aFills[j]);
}
}
}
m_bModified = false;
}
BOOL TComposeBackup::CheckModified( int iCheckType )
{
if( iCheckType==CHECK_GET ){
return m_bModified;
}
m_bModified &= ~iCheckType;
if( iCheckType & CHECK_STAGE ){
if( m_nStageCount!=g_lstComposeStages.size() ){
m_bModified |= CHECK_STAGE;
}
}
if( !(m_bModified & CHECK_STAGE) && (iCheckType & CHECK_STAGE || iCheckType & CHECK_POS ||
iCheckType & CHECK_VAR || iCheckType & CHECK_FILL ||
iCheckType & CHECK_STYLE ) ){
for( int i=0; i<m_nStageCount; i++ ){
COMPOSESTAGE* pCpStage = g_lstComposeStages[i];
COMPOSESTAGE* pBkStage = m_lstStages[i];
if( !(m_bModified & CHECK_POS) && (iCheckType & CHECK_POS) ){
if( pCpStage->iMelodyStage!=pBkStage->iMelodyStage ||
pCpStage->nStageBars!=pBkStage->nStageBars ){
m_bModified |= CHECK_POS;
}
}
if( !(m_bModified & CHECK_VAR) && (iCheckType & CHECK_VAR) ){
if( pCpStage->iVar!=pBkStage->iVar ){
m_bModified |= CHECK_VAR;
}
}
if( !(m_bModified & CHECK_STYLE) && (iCheckType & CHECK_STYLE) ){
if( pCpStage->idStyle!=pBkStage->idStyle ){
m_bModified |= CHECK_STYLE;
}
}
if( !(m_bModified & CHECK_FILL) && (iCheckType & CHECK_FILL) ){
if( pCpStage->aFills.size()!=pBkStage->aFills.size() ){
m_bModified |= CHECK_FILL;
}
else{
for( int j=0; j<pBkStage->aFills.size(); j++ ){
if( pCpStage->aFills[j]!=pBkStage->aFills[j] ){
m_bModified |= CHECK_FILL;
break;
}
}
}
}
}
}
return m_bModified;
}
void TComposeBackup::Clear()
{
m_iKey = -1;
for( int i=0; i<m_nStageCount; i++ ){
delete m_lstStages[i];
}
m_lstStages.clear();
m_nStageCount = 0;
}
TMelodyBackup g_bkMelody;
TComposeBackup g_bkCompose;