diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index ae2cce24f7..53c47ca7b3 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -831,6 +831,7 @@ Edit steps information=Edit steps information Exit Edit Mode=Exit Edit Mode Edit stop=Edit stop Edit delay=Edit delay +Edit Timing Data=Edit Timing Data Edit time signature=Edit time signature (not working yet) Edit time signature (top)=Edit time signature (beats per measure) Edit time signature (bottom)=Edit time signature (single beat note value) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 0489e83703..8164915509 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -3611,6 +3611,9 @@ Fallback="ScreenMiniMenu" [ScreenMiniMenuSongInformation] Fallback="ScreenMiniMenu" +[ScreenMiniMenuTimingDataInformation] +Fallback="ScreenMiniMenu" + [ScreenMiniMenuBackgroundChange] Fallback="ScreenMiniMenu" diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index 092f06cedb..6b8d59180a 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -71,6 +71,7 @@ AutoScreenMessage( SM_BackFromInsertCourseAttackPlayerOptions ); AutoScreenMessage( SM_BackFromCourseModeMenu ); AutoScreenMessage( SM_DoRevertToLastSave ); AutoScreenMessage( SM_DoRevertFromDisk ); +AutoScreenMessage( SM_BackFromTimingDataInformation ); AutoScreenMessage( SM_BackFromBPMChange ); AutoScreenMessage( SM_BackFromStopChange ); AutoScreenMessage( SM_BackFromDelayChange ); @@ -506,12 +507,7 @@ static MenuDef g_MainMenu( MenuRowDef( ScreenEdit::revert_from_disk, "Revert from disk", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef( ScreenEdit::options, "Editor options", true, EditMode_Practice, true, true, 0, NULL ), MenuRowDef( ScreenEdit::edit_song_info, "Edit song info", true, EditMode_Full, true, true, 0, NULL ), - MenuRowDef( ScreenEdit::edit_bpm, "Edit BPM change", true, EditMode_Full, true, true, 0, NULL ), - MenuRowDef( ScreenEdit::edit_stop, "Edit stop", true, EditMode_Full, true, true, 0, NULL ), - MenuRowDef( ScreenEdit::edit_delay, "Edit delay", true, EditMode_Full, true, true, 0, NULL ), - //MenuRowDef( ScreenEdit::edit_time_signature, "Edit time signature", true, EditMode_Full, true, true, 0, NULL ), - MenuRowDef( ScreenEdit::edit_time_signature_numerator, "Edit time signature (top)", true, EditMode_Full, true, true, 0, NULL ), - MenuRowDef( ScreenEdit::edit_time_signature_denominator,"Edit time signature (bottom)", true, EditMode_Full, true, true, 0, NULL ), + MenuRowDef( ScreenEdit::edit_timing_data, "Edit Timing Data", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef( ScreenEdit::play_preview_music, "Play preview music", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef( ScreenEdit::exit, "Exit Edit Mode", true, EditMode_Practice, true, true, 0, NULL ) ); @@ -572,6 +568,16 @@ static MenuDef g_SongInformation( MenuRowDef( ScreenEdit::last_beat_hint, "Last beat hint", true, EditMode_Full, true, true, 0, NULL ) ); +static MenuDef g_TimingDataInformation( + "ScreenMiniMenuTimingDataInformation", + MenuRowDef( ScreenEdit::bpm, "Edit BPM change", true, EditMode_Full, true, true, 0, NULL ), + MenuRowDef( ScreenEdit::stop, "Edit stop", true, EditMode_Full, true, true, 0, NULL ), + MenuRowDef( ScreenEdit::delay, "Edit delay", true, EditMode_Full, true, true, 0, NULL ), + MenuRowDef( ScreenEdit::time_signature_numerator, "Edit time signature (top)", true, EditMode_Full, true, true, 0, NULL ), + MenuRowDef( ScreenEdit::time_signature_denominator, "Edit time signature (bottom)", true, EditMode_Full, true, true, 0, NULL ) + +); + enum { song_bganimation, song_movie, song_bitmap, global_bganimation, global_movie, global_movie_song_group, global_movie_song_group_and_genre, dynamic_random, baked_random, none }; static bool EnabledIfSet1SongBGAnimation(); static bool EnabledIfSet1SongMovie(); @@ -2556,6 +2562,10 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) { HandleSongInformationChoice( (SongInformationChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers ); } + else if( SM == SM_BackFromTimingDataInformation ) + { + HandleTimingDataInformationChoice( (TimingDataInformationChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers ); + } else if( SM == SM_BackFromBPMChange ) { float fBPM = StringToFloat( ScreenTextEntry::s_sLastAnswer ); @@ -2901,11 +2911,6 @@ static LocalizedString REVERT_LAST_SAVE ( "ScreenEdit", "Do you want to revert static LocalizedString DESTROY_ALL_UNSAVED_CHANGES ( "ScreenEdit", "This will destroy all unsaved changes." ); static LocalizedString REVERT_FROM_DISK ( "ScreenEdit", "Do you want to revert from disk?" ); static LocalizedString SAVE_CHANGES_BEFORE_EXITING ( "ScreenEdit", "Do you want to save changes before exiting?" ); -static LocalizedString ENTER_BPM_VALUE ( "ScreenEdit", "Enter a new BPM value." ); -static LocalizedString ENTER_STOP_VALUE ( "ScreenEdit", "Enter a new Stop value." ); -static LocalizedString ENTER_DELAY_VALUE ( "ScreenEdit", "Enter a new Delay value." ); -static LocalizedString ENTER_TIME_SIGNATURE_NUMERATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature numerator value." ); -static LocalizedString ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature denominator value." ); void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector &iAnswers ) { @@ -3091,70 +3096,21 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector &iAns EditMiniMenu( &g_SongInformation, SM_BackFromSongInformation ); } break; - case edit_bpm: - // todo: Call a screen with class ScreenTextEntry instead. -aj - ScreenTextEntry::TextEntry( - SM_BackFromBPMChange, - ENTER_BPM_VALUE, - ssprintf( "%.4f", m_pSong->GetBPMAtBeat(GAMESTATE->m_fSongBeat) ), - 10 - ); - break; - case edit_stop: - // todo: Call a screen with class ScreenTextEntry instead. -aj - bool bThrowaway; // is it? - ScreenTextEntry::TextEntry( - SM_BackFromStopChange, - ENTER_STOP_VALUE, - ssprintf( "%.4f", m_pSong->m_Timing.GetStopAtRow( BeatToNoteRow(GAMESTATE->m_fSongBeat), bThrowaway ) ), - 10 - ); - break; - case edit_delay: - // todo: Call a screen with class ScreenTextEntry instead. -aj - ScreenTextEntry::TextEntry( - SM_BackFromDelayChange, - ENTER_DELAY_VALUE, - ssprintf( "%.4f", m_pSong->m_Timing.GetStopAtRow( BeatToNoteRow(GAMESTATE->m_fSongBeat), bThrowaway ) ), - 10 - ); - break; - /* - The following code does not work due to problems with having two - ScreenTextEntry's at the same time. A proper fix is not known - at the time of this comment. -wolfman2000 - case edit_time_signature: - // These need to be in reverse order due to the stack nature. - ScreenTextEntry::TextEntry( - SM_BackFromTimeSignatureDenominatorChange, - ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE, - ssprintf( "%d", m_pSong->m_Timing.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_fSongBeat ).m_iDenominator ), - 3 - ); - ScreenTextEntry::TextEntry( - SM_BackFromTimeSignatureNumeratorChange, - ENTER_TIME_SIGNATURE_NUMERATOR_VALUE, - ssprintf( "%d", m_pSong->m_Timing.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_fSongBeat ).m_iNumerator ), - 3 - ); - break; - */ - case edit_time_signature_numerator: - ScreenTextEntry::TextEntry( - SM_BackFromTimeSignatureNumeratorChange, - ENTER_TIME_SIGNATURE_NUMERATOR_VALUE, - ssprintf( "%d", m_pSong->m_Timing.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_fSongBeat ).m_iNumerator ), - 3 - ); - break; - case edit_time_signature_denominator: - ScreenTextEntry::TextEntry( - SM_BackFromTimeSignatureDenominatorChange, - ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE, - ssprintf( "%d", m_pSong->m_Timing.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_fSongBeat ).m_iDenominator ), - 3 - ); + case edit_timing_data: + { + const Song* pSong = GAMESTATE->m_pCurSong; + TimingData pTime = pSong->m_Timing; + const float fBeat = GAMESTATE->m_fSongBeat; + g_TimingDataInformation.rows[bpm].SetOneUnthemedChoice( ssprintf("%.5f", pSong->GetBPMAtBeat( fBeat ) ) ); + g_TimingDataInformation.rows[stop].SetOneUnthemedChoice( ssprintf("%.5f", pTime.GetStopAtBeat( fBeat ) ) ) ; + g_TimingDataInformation.rows[delay].SetOneUnthemedChoice( ssprintf("%.5f", pTime.GetDelayAtBeat( fBeat ) ) ); + g_TimingDataInformation.rows[time_signature_numerator].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTimeSignatureNumeratorAtBeat( fBeat ) ) ); + g_TimingDataInformation.rows[time_signature_denominator].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTimeSignatureDenominatorAtBeat( fBeat ) ) ); + + EditMiniMenu( &g_TimingDataInformation, SM_BackFromTimingDataInformation ); + } break; + case play_preview_music: PlayPreviewMusic(); break; @@ -3571,6 +3527,63 @@ void ScreenEdit::HandleSongInformationChoice( SongInformationChoice c, const vec }; } +static LocalizedString ENTER_BPM_VALUE ( "ScreenEdit", "Enter a new BPM value." ); +static LocalizedString ENTER_STOP_VALUE ( "ScreenEdit", "Enter a new Stop value." ); +static LocalizedString ENTER_DELAY_VALUE ( "ScreenEdit", "Enter a new Delay value." ); +static LocalizedString ENTER_TIME_SIGNATURE_NUMERATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature numerator value." ); +static LocalizedString ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature denominator value." ); +void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice c, const vector &iAnswers ) +{ + switch( c ) + { + DEFAULT_FAIL( c ); + case bpm: + // todo: Call a screen with class ScreenTextEntry instead. -aj + ScreenTextEntry::TextEntry( + SM_BackFromBPMChange, + ENTER_BPM_VALUE, + ssprintf( "%.4f", m_pSong->GetBPMAtBeat(GAMESTATE->m_fSongBeat) ), + 10 + ); + break; + case stop: + // todo: Call a screen with class ScreenTextEntry instead. -aj + bool bThrowaway; // is it? + ScreenTextEntry::TextEntry( + SM_BackFromStopChange, + ENTER_STOP_VALUE, + ssprintf( "%.4f", m_pSong->m_Timing.GetStopAtRow( BeatToNoteRow(GAMESTATE->m_fSongBeat), bThrowaway ) ), + 10 + ); + break; + case delay: + // todo: Call a screen with class ScreenTextEntry instead. -aj + ScreenTextEntry::TextEntry( + SM_BackFromDelayChange, + ENTER_DELAY_VALUE, + ssprintf( "%.4f", m_pSong->m_Timing.GetStopAtRow( BeatToNoteRow(GAMESTATE->m_fSongBeat), bThrowaway ) ), + 10 + ); + break; + case time_signature_numerator: + ScreenTextEntry::TextEntry( + SM_BackFromTimeSignatureNumeratorChange, + ENTER_TIME_SIGNATURE_NUMERATOR_VALUE, + ssprintf( "%d", m_pSong->m_Timing.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_fSongBeat ).m_iNumerator ), + 3 + ); + break; + case time_signature_denominator: + ScreenTextEntry::TextEntry( + SM_BackFromTimeSignatureDenominatorChange, + ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE, + ssprintf( "%d", m_pSong->m_Timing.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_fSongBeat ).m_iDenominator ), + 3 + ); + break; + } +} + void ScreenEdit::HandleBGChangeChoice( BGChangeChoice c, const vector &iAnswers ) { BackgroundChange newChange; diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index 426c3d5c20..3c30664f29 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -310,12 +310,7 @@ public: revert_from_disk, options, edit_song_info, - edit_bpm, - edit_stop, - edit_delay, - // edit_time_signature, - edit_time_signature_numerator, - edit_time_signature_denominator, + edit_timing_data, play_preview_music, exit, save_on_exit, @@ -442,6 +437,19 @@ public: NUM_SONG_INFORMATION_CHOICES }; void HandleSongInformationChoice( SongInformationChoice c, const vector &iAnswers ); + + enum TimingDataInformationChoice + { + bpm, + stop, + delay, +// time_signature, + time_signature_numerator, + time_signature_denominator, + NUM_TIMING_DATA_INFORMATION_CHOICES + }; + + void HandleTimingDataInformationChoice ( TimingDataInformationChoice c, const vector &iAnswers ); enum BGChangeChoice {