304 lines
9.8 KiB
C++
304 lines
9.8 KiB
C++
// MainMenuDlg.cpp : implementation file
|
|
|
|
#define CO_EXIST_WITH_MFC
|
|
#include "global.h"
|
|
#include "stdafx.h"
|
|
#include "smpackage.h"
|
|
#include "MainMenuDlg.h"
|
|
#include "EditInsallations.h"
|
|
#include "SmpackageExportDlg.h"
|
|
#include "ChangeGameSettings.h"
|
|
#include "RageUtil.h"
|
|
#include "SMPackageUtil.h"
|
|
#include "mainmenudlg.h"
|
|
#include "archutils/Win32/SpecialDirs.h"
|
|
#include "SpecialFiles.h"
|
|
#include "ProductInfo.h"
|
|
#include "mainmenudlg.h"
|
|
#include "LanguagesDlg.h"
|
|
#include ".\mainmenudlg.h"
|
|
#include "archutils/Win32/DialogUtil.h"
|
|
#include "LocalizedString.h"
|
|
#include "RageFileManager.h"
|
|
#include "arch/Dialog/Dialog.h"
|
|
#include "archutils/Win32/ErrorStrings.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// MainMenuDlg dialog
|
|
|
|
|
|
MainMenuDlg::MainMenuDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(MainMenuDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(MainMenuDlg)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void MainMenuDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(MainMenuDlg)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(MainMenuDlg, CDialog)
|
|
//{{AFX_MSG_MAP(MainMenuDlg)
|
|
ON_BN_CLICKED(IDC_EXPORT_PACKAGES, OnExportPackages)
|
|
ON_BN_CLICKED(IDC_EDIT_INSTALLATIONS, OnEditInstallations)
|
|
ON_BN_CLICKED(IDC_CREATE_SONG, OnCreateSong)
|
|
ON_BN_CLICKED(IDC_CLEAR_KEYMAPS, OnBnClickedClearKeymaps)
|
|
ON_BN_CLICKED(IDC_CHANGE_PREFERENCES, OnBnClickedChangePreferences)
|
|
ON_BN_CLICKED(IDC_OPEN_PREFERENCES, OnBnClickedOpenPreferences)
|
|
ON_BN_CLICKED(IDC_CLEAR_PREFERENCES, OnBnClickedClearPreferences)
|
|
//}}AFX_MSG_MAP
|
|
ON_BN_CLICKED(IDC_BUTTON_LAUNCH_GAME, OnBnClickedButtonLaunchGame)
|
|
ON_BN_CLICKED(IDC_LANGUAGES, OnBnClickedLanguages)
|
|
ON_WM_CTLCOLOR()
|
|
ON_WM_ERASEBKGND()
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// MainMenuDlg message handlers
|
|
|
|
void MainMenuDlg::OnExportPackages()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
CSmpackageExportDlg dlg;
|
|
dlg.DoModal();
|
|
// if (nResponse == IDOK)
|
|
}
|
|
|
|
void MainMenuDlg::OnEditInstallations()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
EditInsallations dlg;
|
|
dlg.DoModal();
|
|
}
|
|
|
|
RString GetLastErrorString()
|
|
{
|
|
LPVOID lpMsgBuf;
|
|
FormatMessage(
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
NULL,
|
|
GetLastError(),
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPTSTR) &lpMsgBuf,
|
|
0,
|
|
NULL
|
|
);
|
|
// Process any inserts in lpMsgBuf.
|
|
// ...
|
|
// Display the string.
|
|
RString s = (LPCTSTR)lpMsgBuf;
|
|
// Free the buffer.
|
|
LocalFree( lpMsgBuf );
|
|
|
|
return s;
|
|
}
|
|
|
|
static LocalizedString MUSIC_FILE ( "MainMenuDlg", "Music file" );
|
|
static LocalizedString THE_SONG_DIRECTORY_ALREADY_EXISTS ( "MainMenuDlg", "The song directory '%s' already exists. You cannot override an existing song." );
|
|
static LocalizedString FAILED_TO_COPY_MUSIC_FILE ( "MainMenuDlg", "Failed to copy music file '%s' to '%s': %s" );
|
|
static LocalizedString FAILED_TO_CREATE_THE_SONG_FILE ( "MainMenuDlg", "Failed to create the song file '%s'." );
|
|
static LocalizedString SUCCESS_CREATED_THE_SONG ( "MainMenuDlg", "Success. Created the song '%s'." );
|
|
void MainMenuDlg::OnCreateSong()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
ASSERT(0);
|
|
// fix compile
|
|
CFileDialog dialog (
|
|
TRUE, // file open?
|
|
NULL, // default file extension
|
|
NULL, // default file name
|
|
OFN_HIDEREADONLY | OFN_NOCHANGEDIR, // flags
|
|
ConvertUTF8ToACP(MUSIC_FILE.GetValue()+" (*.mp3;*.ogg)|*.mp3;*.ogg|||").c_str()
|
|
);
|
|
int iRet = dialog.DoModal();
|
|
RString sMusicFile = dialog.GetPathName();
|
|
if( iRet != IDOK )
|
|
return;
|
|
|
|
RString sSongDirectory = "Songs/My Creations/" + GetFileNameWithoutExtension(sMusicFile) + "/";
|
|
RString sNewMusicFile = sSongDirectory + Basename(sMusicFile);
|
|
|
|
if( DoesFileExist(sSongDirectory) )
|
|
{
|
|
Dialog::OK( ssprintf(THE_SONG_DIRECTORY_ALREADY_EXISTS.GetValue(),sSongDirectory.c_str()) );
|
|
return;
|
|
}
|
|
|
|
RageFileOsAbsolute fileIn;
|
|
fileIn.Open( sMusicFile, RageFile::READ );
|
|
RageFile fileOut;
|
|
fileOut.Open( sNewMusicFile, RageFile::WRITE );
|
|
RString sError;
|
|
bool bSuccess = FileCopy( fileIn, fileOut, sError );
|
|
if( !bSuccess )
|
|
{
|
|
Dialog::OK( ssprintf(FAILED_TO_COPY_MUSIC_FILE.GetValue(),sMusicFile.c_str(),sNewMusicFile.c_str(),sError.c_str()) );
|
|
return;
|
|
}
|
|
|
|
// create a blank .sm file
|
|
RString sNewSongFile = sMusicFile;
|
|
SetExtension( sNewSongFile, "sm" );
|
|
RageFile file;
|
|
if( file.Open(sNewSongFile, RageFile::WRITE) )
|
|
{
|
|
Dialog::OK( ssprintf(FAILED_TO_CREATE_THE_SONG_FILE.GetValue(),sNewSongFile.c_str()) );
|
|
return;
|
|
}
|
|
file.Close();
|
|
|
|
Dialog::OK( ssprintf(SUCCESS_CREATED_THE_SONG.GetValue(),sSongDirectory.c_str()) );
|
|
}
|
|
|
|
BOOL MainMenuDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
DialogUtil::LocalizeDialogAndContents( *this );
|
|
DialogUtil::SetHeaderFont( *this, IDC_STATIC_HEADER_TEXT );
|
|
|
|
//DialogUtil::SetDlgItemHeader( *this, IDC_STATIC_HEADER_TEXT, "header" );
|
|
|
|
TCHAR szCurDir[MAX_PATH];
|
|
GetCurrentDirectory( ARRAYLEN(szCurDir), szCurDir );
|
|
GetDlgItem( IDC_EDIT_INSTALLATION )->SetWindowText( szCurDir );
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
static LocalizedString FAILED_TO_DELETE_FILE ( "MainMenuDlg", "Failed to delete file '%s'." );
|
|
static LocalizedString IS_ALREADY_CLEARED ( "MainMenuDlg", "'%s' is already cleared." );
|
|
static LocalizedString CLEARED( "MainMenuDlg", "'%s' cleared" );
|
|
void MainMenuDlg::OnBnClickedClearKeymaps()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
FILEMAN->FlushDirCache( Dirname(SpecialFiles::KEYMAPS_PATH) );
|
|
if( !DoesFileExist( SpecialFiles::KEYMAPS_PATH ) )
|
|
{
|
|
Dialog::OK( ssprintf(IS_ALREADY_CLEARED.GetValue(),SpecialFiles::KEYMAPS_PATH.c_str()) );
|
|
return;
|
|
}
|
|
|
|
if( !FILEMAN->Remove(SpecialFiles::KEYMAPS_PATH) )
|
|
Dialog::OK( ssprintf(FAILED_TO_DELETE_FILE.GetValue(), SpecialFiles::KEYMAPS_PATH.c_str()) );
|
|
|
|
Dialog::OK( ssprintf(CLEARED.GetValue(),SpecialFiles::KEYMAPS_PATH.c_str()) );
|
|
}
|
|
|
|
void MainMenuDlg::OnBnClickedChangePreferences()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
ChangeGameSettings dlg;
|
|
dlg.DoModal();
|
|
}
|
|
|
|
static LocalizedString DOESNT_EXIST_IT_WILL_BE_CREATED ( "MainMenuDlg", "'%s' doesn't exist. It will be created next time you start the game." );
|
|
static LocalizedString FAILED_TO_OPEN ( "MainMenuDlg", "Failed to open '%s': %s" );
|
|
void MainMenuDlg::OnBnClickedOpenPreferences()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
// TODO: Have RageFile* do the mapping to the OS file location.
|
|
RString sPreferencesOSFile = SpecialDirs::GetAppDataDir() + PRODUCT_ID + "/" + SpecialFiles::PREFERENCES_INI_PATH;
|
|
HINSTANCE hinst = ::ShellExecute( this->m_hWnd, "open", sPreferencesOSFile, "", "", SW_SHOWNORMAL );
|
|
if( (int)hinst == SE_ERR_FNF )
|
|
Dialog::OK( ssprintf(DOESNT_EXIST_IT_WILL_BE_CREATED.GetValue(),sPreferencesOSFile.c_str()) );
|
|
else if( (int)hinst <= 32 )
|
|
Dialog::OK( ssprintf(FAILED_TO_OPEN.GetValue(),sPreferencesOSFile.c_str(),GetLastErrorString().c_str()) );
|
|
}
|
|
|
|
void MainMenuDlg::OnBnClickedClearPreferences()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
FILEMAN->FlushDirCache();
|
|
if( !DoesFileExist(SpecialFiles::PREFERENCES_INI_PATH) )
|
|
{
|
|
Dialog::OK( ssprintf(IS_ALREADY_CLEARED.GetValue(),SpecialFiles::PREFERENCES_INI_PATH.c_str()) );
|
|
return;
|
|
}
|
|
|
|
if( !FILEMAN->Remove(SpecialFiles::PREFERENCES_INI_PATH) )
|
|
{
|
|
Dialog::OK( ssprintf(FAILED_TO_DELETE_FILE.GetValue(),SpecialFiles::PREFERENCES_INI_PATH.c_str()) );
|
|
return;
|
|
}
|
|
|
|
Dialog::OK( ssprintf(CLEARED.GetValue(),SpecialFiles::PREFERENCES_INI_PATH.c_str()) );
|
|
}
|
|
|
|
void MainMenuDlg::OnBnClickedButtonLaunchGame()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if( SMPackageUtil::LaunchGame() )
|
|
exit(0);
|
|
}
|
|
|
|
void MainMenuDlg::OnBnClickedLanguages()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
LanguagesDlg dlg;
|
|
dlg.DoModal();
|
|
}
|
|
|
|
HBRUSH MainMenuDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
|
{
|
|
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
|
|
|
|
// TODO: Change any attributes of the DC here
|
|
switch( pWnd->GetDlgCtrlID() )
|
|
{
|
|
case IDC_STATIC_HEADER_TEXT:
|
|
case IDC_STATIC_ICON:
|
|
hbr = (HBRUSH)::GetStockObject(WHITE_BRUSH);
|
|
pDC->SetBkMode(OPAQUE);
|
|
pDC->SetBkColor( RGB(255,255,255) );
|
|
break;
|
|
}
|
|
|
|
// TODO: Return a different brush if the default is not desired
|
|
return hbr;
|
|
}
|
|
|
|
/*
|
|
* (c) 2002-2005 Chris Danford
|
|
* All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
* whom the Software is furnished to do so, provided that the above
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
* the Software and that both the above copyright notice(s) and this
|
|
* permission notice appear in supporting documentation.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|