adjust save flow; uncommit and don't exit if the save fails

This commit is contained in:
Glenn Maynard
2005-03-14 04:43:25 +00:00
parent d90e526018
commit f11197bd00
+50 -18
View File
@@ -71,7 +71,8 @@ const ScreenMessage SM_DoRevertToLastSave = (ScreenMessage)(SM_User+13);
const ScreenMessage SM_DoUpdateTextInfo = (ScreenMessage)(SM_User+14); const ScreenMessage SM_DoUpdateTextInfo = (ScreenMessage)(SM_User+14);
const ScreenMessage SM_BackFromBPMChange = (ScreenMessage)(SM_User+15); const ScreenMessage SM_BackFromBPMChange = (ScreenMessage)(SM_User+15);
const ScreenMessage SM_BackFromStopChange = (ScreenMessage)(SM_User+16); const ScreenMessage SM_BackFromStopChange = (ScreenMessage)(SM_User+16);
const ScreenMessage SM_DoExit = (ScreenMessage)(SM_User+17); const ScreenMessage SM_DoSaveAndExit = (ScreenMessage)(SM_User+17);
const ScreenMessage SM_DoExit = (ScreenMessage)(SM_User+18);
const CString HELP_TEXT = const CString HELP_TEXT =
#if !defined(XBOX) #if !defined(XBOX)
@@ -513,6 +514,7 @@ void ScreenEdit::Init()
// save the originals for reverting later // save the originals for reverting later
CopyToLastSave(); CopyToLastSave();
m_CurrentAction = MAIN_MENU_CHOICE_INVALID;
// set both players to joined so the credit message doesn't show // set both players to joined so the credit message doesn't show
FOREACH_PlayerNumber( p ) FOREACH_PlayerNumber( p )
@@ -1601,8 +1603,43 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
UpdateTextInfo(); UpdateTextInfo();
break; break;
case SM_DoSaveAndExit: // just asked "save before exiting? yes, no, cancel"
switch( ScreenPrompt::s_LastAnswer )
{
case ANSWER_YES:
// This will send SM_Success or SM_Failure.
HandleMainMenuChoice( ScreenEdit::save_on_exit, NULL );
return;
case ANSWER_NO:
/* Don't save; just exit. */
SCREENMAN->SendMessageToTopScreen( SM_DoExit );
return;
case ANSWER_CANCEL:
break; // do nothing
}
break;
case SM_Success:
LOG->Trace( "Save successful." );
m_pSteps->SetSavedToDisk( true );
CopyToLastSave();
if( m_CurrentAction == save_on_exit )
HandleScreenMessage( SM_DoExit );
break;
case SM_Failure: // save failed; stay in the editor
/* We committed the steps to SongManager. Revert to the last save, and
* recommit the reversion to SongManager. */
LOG->Trace( "Save failed. Changes uncommitted from memory." );
CopyFromLastSave();
m_pSteps->SetNoteData( m_NoteDataEdit );
break;
case SM_DoExit: case SM_DoExit:
if( ScreenPrompt::s_LastAnswer != ANSWER_CANCEL )
{ {
// IMPORTANT: CopyFromLastSave before deleteing the Steps below // IMPORTANT: CopyFromLastSave before deleteing the Steps below
CopyFromLastSave(); CopyFromLastSave();
@@ -1618,9 +1655,9 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
m_pSteps = NULL; m_pSteps = NULL;
GAMESTATE->m_pCurSteps[PLAYER_1].Set( NULL ); GAMESTATE->m_pCurSteps[PLAYER_1].Set( NULL );
} }
m_Out.StartTransitioning( SM_GoToNextScreen );
} }
m_Out.StartTransitioning( SM_GoToNextScreen );
break; break;
case SM_GainFocus: case SM_GainFocus:
@@ -1704,12 +1741,6 @@ void ChangeArtistTranslit( CString sNew )
pSong->m_sArtistTranslit = sNew; pSong->m_sArtistTranslit = sNew;
} }
ScreenEdit *g_pScreenEdit = NULL;
static void DoSaveOnExit( void* )
{
g_pScreenEdit->HandleMainMenuChoice( ScreenEdit::save_on_exit, NULL );
}
// End helper functions // End helper functions
void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers ) void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers )
@@ -1755,16 +1786,13 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers )
case save: case save:
case save_on_exit: case save_on_exit:
{ {
m_CurrentAction = c;
// copy edit into current Steps // copy edit into current Steps
Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1]; Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
ASSERT( pSteps ); ASSERT( pSteps );
pSteps->SetNoteData( m_NoteDataEdit ); pSteps->SetNoteData( m_NoteDataEdit );
pSteps->SetSavedToDisk( true );
CopyToLastSave();
if( HOME_EDIT_MODE ) if( HOME_EDIT_MODE )
{ {
@@ -1779,6 +1807,9 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers )
} }
else else
{ {
pSteps->SetSavedToDisk( true );
CopyToLastSave();
GAMESTATE->m_pCurSong->Save(); GAMESTATE->m_pCurSong->Save();
SCREENMAN->ZeroNextUpdate(); SCREENMAN->ZeroNextUpdate();
@@ -1789,6 +1820,8 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers )
SCREENMAN->SystemMessage( "Saved as SM and DWI." ); SCREENMAN->SystemMessage( "Saved as SM and DWI." );
else else
SCREENMAN->SystemMessage( "Saved as SM." ); SCREENMAN->SystemMessage( "Saved as SM." );
HandleScreenMessage( SM_Success );
} }
SOUND->PlayOnce( THEME->GetPathS("ScreenEdit","save") ); SOUND->PlayOnce( THEME->GetPathS("ScreenEdit","save") );
@@ -1922,11 +1955,10 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers )
PlayPreviewMusic(); PlayPreviewMusic();
break; break;
case exit: case exit:
g_pScreenEdit = this;
SCREENMAN->Prompt( SCREENMAN->Prompt(
SM_DoExit, SM_DoSaveAndExit,
"Do you want to save changes before exiting?", "Do you want to save changes before exiting?",
PROMPT_YES_NO_CANCEL, ANSWER_NO, DoSaveOnExit ); PROMPT_YES_NO_CANCEL, ANSWER_NO );
break; break;
default: default:
ASSERT(0); ASSERT(0);