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
This commit is contained in:
Chris Danford
2005-03-29 20:25:14 +00:00
parent 06c846b020
commit cd8b35e801
4 changed files with 44 additions and 10 deletions
+28 -10
View File
@@ -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<int> &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();
}