From cd8b35e801c7f6ed5e53a3e2877e9e7e690da4d6 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 29 Mar 2005 20:25:14 +0000 Subject: [PATCH] fix "can't paste from clipboard with only one row in clipboard" fix "can't Undo to a blank NoteField" clamp paste area so that pasting past the maximum beat is impossible --- stepmania/src/NoteData.cpp | 14 +++++++++++++ stepmania/src/NoteData.h | 1 + stepmania/src/ScreenEdit.cpp | 38 ++++++++++++++++++++++++++---------- stepmania/src/ScreenEdit.h | 1 + 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index e7ae718358..b3ccf10930 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -387,6 +387,20 @@ bool NoteData::IsHoldNoteAtBeat( int iTrack, int iRow, int *pHeadRow ) const return bFoundHead; } +bool NoteData::IsEmpty() const +{ + for( int t=0; t < GetNumTracks(); t++ ) + { + int iRow = -1; + if( !GetNextTapNoteRowForTrack( t, iRow ) ) + continue; + + return false; + } + + return true; +} + int NoteData::GetFirstRow() const { int iEarliestRowFoundSoFar = -1; diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 075db99d1a..c1cfd4ba54 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -123,6 +123,7 @@ public: // // statistics // + bool IsEmpty() const; int GetFirstRow() const; // return the beat number of the first note float GetFirstBeat() const { return NoteRowToBeat( GetFirstRow() ); } int GetLastRow() const; // return the beat number of the last note diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index b4e599818d..84257f2d70 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -549,6 +549,7 @@ void ScreenEdit::Init() m_Clipboard.SetNumTracks( m_NoteDataEdit.GetNumTracks() ); + m_bHasUndo = false; m_Undo.SetNumTracks( m_NoteDataEdit.GetNumTracks() ); @@ -1054,8 +1055,8 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ bool bAreaSelected = m_NoteFieldEdit.m_iBeginMarker!=-1 && m_NoteFieldEdit.m_iEndMarker!=-1; g_AreaMenu.rows[cut].bEnabled = bAreaSelected; g_AreaMenu.rows[copy].bEnabled = bAreaSelected; - g_AreaMenu.rows[paste_at_current_beat].bEnabled = m_Clipboard.GetLastBeat() != 0; - g_AreaMenu.rows[paste_at_begin_marker].bEnabled = m_Clipboard.GetLastBeat() != 0 && m_NoteFieldEdit.m_iBeginMarker!=-1; + g_AreaMenu.rows[paste_at_current_beat].bEnabled = !m_Clipboard.IsEmpty(); + g_AreaMenu.rows[paste_at_begin_marker].bEnabled = !m_Clipboard.IsEmpty() != 0 && m_NoteFieldEdit.m_iBeginMarker!=-1; g_AreaMenu.rows[clear].bEnabled = bAreaSelected; g_AreaMenu.rows[quantize].bEnabled = bAreaSelected; g_AreaMenu.rows[turn].bEnabled = bAreaSelected; @@ -1065,7 +1066,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ g_AreaMenu.rows[play].bEnabled = bAreaSelected; g_AreaMenu.rows[record].bEnabled = bAreaSelected; g_AreaMenu.rows[convert_beat_to_pause].bEnabled = bAreaSelected; - g_AreaMenu.rows[undo].bEnabled = m_Undo.GetLastBeat() != 0; + g_AreaMenu.rows[undo].bEnabled = m_bHasUndo; SCREENMAN->MiniMenu( &g_AreaMenu, SM_BackFromAreaMenu ); } break; @@ -1082,6 +1083,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ case EDIT_BUTTON_OPEN_PREV_STEPS: { // don't keep undo when changing Steps + m_bHasUndo = false; m_Undo.ClearAll(); // save current steps @@ -1591,6 +1593,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) { CopyFromLastSave(); m_pSteps->GetNoteData( m_NoteDataEdit ); + m_bHasUndo = false; m_Undo.ClearAll(); } } @@ -2051,15 +2054,28 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector &iAns } break; case paste_at_current_beat: - { - int iDestFirstRow = BeatToNoteRow( GAMESTATE->m_fSongBeat ); - m_NoteDataEdit.CopyRange( m_Clipboard, 0, m_Clipboard.GetLastRow()+1, iDestFirstRow ); - } - break; case paste_at_begin_marker: { - ASSERT( m_NoteFieldEdit.m_iBeginMarker!=-1 ); - m_NoteDataEdit.CopyRange( m_Clipboard, 0, m_Clipboard.GetLastRow()+1, m_NoteFieldEdit.m_iBeginMarker ); + int iDestFirstRow = -1; + switch( c ) + { + case paste_at_current_beat: + iDestFirstRow = BeatToNoteRow( GAMESTATE->m_fSongBeat ); + break; + case paste_at_begin_marker: + ASSERT( m_NoteFieldEdit.m_iBeginMarker!=-1 ); + iDestFirstRow = m_NoteFieldEdit.m_iBeginMarker; + break; + default: + ASSERT(0); + } + + int iRowsToCopy = m_Clipboard.GetLastRow()+1; + // Don't allow pasting past the maximum row + int iMaxRow = (GetMaximumBeat() == FLT_MAX) ? INT_MAX : BeatToNoteRow(GetMaximumBeat()); + CLAMP( iRowsToCopy, 0, iMaxRow - iDestFirstRow + 1 ); + + m_NoteDataEdit.CopyRange( m_Clipboard, 0, iRowsToCopy, iDestFirstRow ); } break; case clear: @@ -2551,12 +2567,14 @@ void ScreenEdit::CopyFromLastSave() void ScreenEdit::SaveUndo() { + m_bHasUndo = true; m_Undo.CopyAll( m_NoteDataEdit ); } void ScreenEdit::Undo() { m_NoteDataEdit.CopyAll( m_Undo ); + m_bHasUndo = false; m_Undo.ClearAll(); } diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 19b5e2fe50..2a62cff327 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -179,6 +179,7 @@ protected: int g_iShiftAnchor; NoteData m_Clipboard; + bool m_bHasUndo; NoteData m_Undo; RageSound m_soundAddNote;