Files
AC_Pro/SaveFormUnit.cpp
2026-06-13 00:05:19 +08:00

310 lines
7.6 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "SaveFormUnit.h"
#include "GlobalUnit.h"
#include "Project.h"
#include <System.IOUtils.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "GeneralDialogPanel"
#pragma link "PNGButton"
#pragma link "LineEdit"
#pragma link "TextButton"
#pragma link "CKBox"
#pragma link "ComboBoxComponent"
#pragma resource "*.dfm"
TSaveForm *SaveForm;
//---------------------------------------------------------------------------
__fastcall TSaveForm::TSaveForm(TComponent* Owner, int iType)
: TForm(Owner)
{
SetTransparent( this );
memset( m_aTypeIndex, -1, sizeof( m_aTypeIndex ) );
int ind = 0;
if( iType & SAVE_PROJECT ){
m_aTypeIndex[ind++] = FILETYPE_CPJ;
}
if( (( iType & SAVE_COMPOSE ) || ( iType & SAVE_AUDIO ))
&& ( !g_bUpdateMandatory || SOFTWARE_ID==e_Pro_Lite ) ){
m_aTypeIndex[ind++] = FILETYPE_MP3;
m_aTypeIndex[ind++] = FILETYPE_WAVE;
m_aTypeIndex[ind++] = FILETYPE_MIDI;
}
FSaveType = -1;
FMediaOption = iType==SAVE_ALL ? g_iLastSaveOption & 0x0F00 : iType;
m_DefName = L"untitle-";
m_DefName += g_strTSName[g_iMelodyTimeSignature];
m_DefName += L"-";
m_DefName += IntToStr(g_nMelodyTempo);
m_MediaPath = String(g_strLastSavePath.c_str());
m_ProjPath = String(g_strLastProjSavePath.c_str());
String basePath;
basePath.sprintf(L"%s", g_strUserPath.c_str());
if( m_MediaPath.IsEmpty() ){
m_MediaPath = basePath + L"Save";
if(!DirectoryExists(m_MediaPath, false))
ForceDirectories(m_MediaPath);
m_MediaPath += L"\\";// + m_DefName + L".mp3";
}
if( m_ProjPath.IsEmpty() ){
m_ProjPath = basePath + L"Projects";
if(!DirectoryExists(m_ProjPath, false))
ForceDirectories(m_ProjPath);
m_ProjPath += L"\\";// + m_DefName + L".cpj";
}
if( strlen( g_infoSong.strSongName )>0 ){
m_MediaPath += g_infoSong.strSongName;
m_ProjPath += g_infoSong.strSongName;
}
else{
m_MediaPath += m_DefName;
m_ProjPath += m_DefName;
}
m_MediaPath += L".mp3";
m_ProjPath += L".cpj";
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::BtnBrowseClick(TObject *Sender)
{
TSaveDialog * pDlg = new TSaveDialog(NULL);
pDlg->Options << ofCreatePrompt << ofOverwritePrompt;
pDlg->Title = L"导出为";
pDlg->FileName = ExtractFileName(m_editFileName->Text);
pDlg->InitialDir = ExtractFilePath(m_editFileName->Text);
switch( m_aTypeIndex[m_SaveTypeCombo->DefItemIndex] ){
case FILETYPE_CPJ:
if(m_editFileName->Text.Length() == 0)
pDlg->FileName = m_DefName;
pDlg->Filter = "编曲工程文件(*.cpj)|*.cpj";
pDlg->DefaultExt = "cpj";
break;
case FILETYPE_MP3:
pDlg->Filter = "MP3文件(*.mp3)|*.mp3";
pDlg->DefaultExt = "mp3";
break;
case FILETYPE_WAVE:
pDlg->Filter = "WAVE文件(*.wav)|*.wav";
pDlg->DefaultExt = "wav";
break;
case FILETYPE_MIDI:
pDlg->Filter = "MIDI文件(*.mid)|*.mid";
pDlg->DefaultExt = "mid";
break;
default:
pDlg->Filter = "所有文件(*.*)|*.*";
break;
};
if(pDlg->Execute()){
m_editFileName->Text = pDlg->FileName;
}
delete pDlg;
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::FileNameChange(TObject *Sender)
{
FFilePath = m_editFileName->Text;
String fileExt = ExtractFileExt(m_editFileName->Text);
if(FilePath.IsEmpty())
{
m_btnOk->Enabled = false;
return;
}
int iType = m_aTypeIndex[m_SaveTypeCombo->DefItemIndex];
if( iType==FILETYPE_CPJ ){
// 保存工程
if(fileExt.CompareIC(L".cpj") == 0)
m_btnOk->Enabled = true;
else
m_btnOk->Enabled = false;
m_ProjPath = FFilePath;
}
else{
bool bPostfixGood = true;
if( iType==FILETYPE_MP3 ){
if( fileExt.CompareIC(L".mp3") )
bPostfixGood = false;
}
else if( iType==FILETYPE_WAVE ){
if( fileExt.CompareIC(L".wav") )
bPostfixGood = false;
}
else if( iType==FILETYPE_MIDI ){
if( fileExt.CompareIC(L".mid") )
bPostfixGood = false;
}
m_btnOk->Enabled = bPostfixGood && FMediaOption;
m_MediaPath = FFilePath;
}
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch(Key)
{
case VK_RETURN:
if(m_btnOk->Enabled)
ModalResult = mrOk;
break;
case VK_ESCAPE:
ModalResult = mrCancel;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::DoComboChange(TComboBoxItem *Sender, int Index)
{
int iType = m_aTypeIndex[Index];
if( m_aTypeIndex[0]!=FILETYPE_CPJ || iType==FILETYPE_CPJ ){
m_ComposeCheck->Visible = false;
m_SongCheck->Visible = false;
}
if( iType==FILETYPE_CPJ ){
m_editFileName->Text = ChangeFileExt( m_ProjPath, L".cpj" );
}
else{
m_editFileName->Text = ChangeFileExt(m_MediaPath, iType==FILETYPE_MP3 ? L".mp3"
: iType==FILETYPE_WAVE ? L".wav"
: L".mid");
if( m_aTypeIndex[0]==FILETYPE_CPJ ){
if( iType==FILETYPE_MIDI ){
m_ComposeCheck->Visible = false;
m_ComposeCheck->Checked = true;
m_SongCheck->Visible = false;
m_SongCheck->Checked = false;
}
else{
m_ComposeCheck->Visible = true;
m_SongCheck->Visible = true;
m_SongCheck->Enabled = iType!=FILETYPE_MIDI
&& (( g_iPreStage==0 && g_aAudioTracks[0]->lstBars.size()>0 )
|| g_iPreStage>0 && g_aAudioTracks.size()>1 );
}
}
}
FSaveType = iType;
FileNameChange(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::DoComposeCheck(TObject *Sender)
{
if( m_ComposeCheck->Checked ){
FMediaOption |= SAVE_COMPOSE;
}
else{
FMediaOption &= ~SAVE_COMPOSE;
}
m_btnOk->Enabled = FMediaOption!=0;
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::DoSongCheck(TObject *Sender)
{
if( m_SongCheck->Checked ){
FMediaOption |= SAVE_AUDIO;
}
else{
FMediaOption &= ~SAVE_AUDIO;
}
m_btnOk->Enabled = FMediaOption!=0;
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::SetMediaOption(int Value)
{
if(FMediaOption != Value)
{
FMediaOption = Value;
}
}
//---------------------------------------------------------------------------
void __fastcall TSaveForm::FormCreate(TObject *Sender)
{
DialogPanel->Font->Size = g_szFont9;
m_btnOk->FontSize = g_szFont9;
m_btnBrowse->FontSize = g_szFont9;
m_btnCancel->FontSize = g_szFont9;
m_SongCheck->Font->Size = g_szFont9;
m_ComposeCheck->Font->Size = g_szFont9;
m_SaveTypeCombo->SetFont(g_strTxtFontName, g_szFont9);
m_editFileName->SetTextFont(g_strTxtFontName, g_szFont9);
m_ComposeCheck->Checked = (bool)(FMediaOption & SAVE_COMPOSE);
m_SongCheck->Checked = (bool)(FMediaOption & SAVE_AUDIO) && ( g_iPreStage>0 && g_aAudioTracks.size()>1
|| g_iPreStage==0 && g_aAudioTracks[0]->lstBars.size()>0 );
int ind = -1;
for( int i=0; i<4; i++ ){
if( m_aTypeIndex[i]==FILETYPE_CPJ ){
m_SaveTypeCombo->AddItem("工程文件(*.cpj)");
}
else if( m_aTypeIndex[i]==FILETYPE_MP3 ){
m_SaveTypeCombo->AddItem("MP3文件(*.mp3)");
}
else if( m_aTypeIndex[i]==FILETYPE_WAVE ){
m_SaveTypeCombo->AddItem("WAVE文件(*.wav)");
}
else if( m_aTypeIndex[i]==FILETYPE_MIDI ){
m_SaveTypeCombo->AddItem("MIDI文件(*.mid))");
}
else{
break;
}
if( ind<0 || g_iLastSaveType==m_aTypeIndex[i] )
ind = i;
}
m_SaveTypeCombo->DefItemIndex = ind;
DoComboChange(NULL, ind);
}
//---------------------------------------------------------------------------