Merge pull request #278 from kyzentun/EditSwapUD

Added Swap Up/Down option to Edit Alter Menu.
This commit is contained in:
Colby Klein
2014-08-31 18:16:29 -07:00
7 changed files with 168 additions and 11 deletions
+61
View File
@@ -1453,6 +1453,49 @@ static void GetTrackMapping( StepsType st, NoteDataUtil::TrackMapping tt, int Nu
break;
}
break;
case NoteDataUtil::swap_up_down:
switch(st)
{
case StepsType_dance_single:
case StepsType_dance_double:
case StepsType_dance_couple:
case StepsType_dance_routine:
iTakeFromTrack[0]= 0;
iTakeFromTrack[1]= 2;
iTakeFromTrack[2]= 1;
iTakeFromTrack[3]= 3;
iTakeFromTrack[4]= 4;
iTakeFromTrack[5]= 6;
iTakeFromTrack[6]= 5;
iTakeFromTrack[7]= 7;
break;
case StepsType_pump_single:
case StepsType_pump_double:
case StepsType_pump_couple:
case StepsType_pump_routine:
iTakeFromTrack[0]= 1;
iTakeFromTrack[1]= 0;
iTakeFromTrack[2]= 2;
iTakeFromTrack[3]= 4;
iTakeFromTrack[4]= 3;
iTakeFromTrack[5]= 6;
iTakeFromTrack[6]= 5;
iTakeFromTrack[7]= 7;
iTakeFromTrack[8]= 9;
iTakeFromTrack[9]= 8;
break;
case StepsType_pump_halfdouble:
iTakeFromTrack[0]= 0;
iTakeFromTrack[1]= 2;
iTakeFromTrack[2]= 1;
iTakeFromTrack[3]= 4;
iTakeFromTrack[4]= 3;
iTakeFromTrack[5]= 5;
break;
default:
break;
}
break;
default:
ASSERT(0);
}
@@ -2221,6 +2264,24 @@ void NoteDataUtil::ShiftRight( NoteData &inout )
ShiftTracks( inout, +1 );
}
void NoteDataUtil::SwapUpDown(NoteData& inout, StepsType st)
{
int TakeFrom[MAX_NOTE_TRACKS];
GetTrackMapping(st, NoteDataUtil::swap_up_down, inout.GetNumTracks(), TakeFrom);
NoteData tempND;
tempND.LoadTransformed(inout, inout.GetNumTracks(), TakeFrom);
inout.CopyAll(tempND);
inout.RevalidateATIs(vector<int>(), false);
}
void NoteDataUtil::ArbitraryRemap(NoteData& inout, int* mapping)
{
NoteData tempND;
tempND.LoadTransformed(inout, inout.GetNumTracks(), mapping);
inout.CopyAll(tempND);
inout.RevalidateATIs(vector<int>(), false);
}
struct ValidRow
{
+3
View File
@@ -124,6 +124,7 @@ namespace NoteDataUtil
soft_shuffle,
super_shuffle,
stomp,
swap_up_down,
NUM_TRACK_MAPPINGS
};
void Turn( NoteData &inout, StepsType st, TrackMapping tt, int iStartIndex = 0, int iEndIndex = MAX_NOTE_ROW );
@@ -165,6 +166,8 @@ namespace NoteDataUtil
void ShiftTracks( NoteData &inout, int iShiftBy );
void ShiftLeft( NoteData &inout );
void ShiftRight( NoteData &inout );
void SwapUpDown( NoteData &inout, StepsType st );
void ArbitraryRemap( NoteData &inout, int* mapping );
void SnapToNearestNoteType( NoteData &inout, NoteType nt1, NoteType nt2, int iStartIndex, int iEndIndex );
+10
View File
@@ -1751,6 +1751,16 @@ void MakeLower( wchar_t *p, size_t iLen )
UnicodeUpperLower( p, iLen, g_LowerCase );
}
bool operator>>(const RString& lhs, int& rhs)
{
return istringstream(lhs) >> rhs;
}
bool operator>>(const RString& lhs, float& rhs)
{
return istringstream(lhs) >> rhs;
}
int StringToInt( const RString &sString )
{
int ret;
+3
View File
@@ -418,6 +418,9 @@ RString IntToString( const int &iNum );
float StringToFloat( const RString &sString );
RString FloatToString( const float &num );
bool StringToFloat( const RString &sString, float &fOut );
// Better than IntToString because you can check for success.
bool operator>>(const RString& lhs, int& rhs);
bool operator>>(const RString& lhs, float& rhs);
RString WStringToRString( const wstring &sString );
RString WcharToUTF8( wchar_t c );
+75 -1
View File
@@ -62,6 +62,7 @@ AutoScreenMessage( SM_UpdateTextInfo );
AutoScreenMessage( SM_BackFromMainMenu );
AutoScreenMessage( SM_BackFromAreaMenu );
AutoScreenMessage( SM_BackFromAlterMenu );
AutoScreenMessage( SM_BackFromArbitraryRemap );
AutoScreenMessage( SM_BackFromStepsInformation );
AutoScreenMessage( SM_BackFromStepsData );
AutoScreenMessage( SM_BackFromOptions );
@@ -616,7 +617,7 @@ static MenuDef g_AlterMenu(
MenuRowDef(ScreenEdit::alter, "Alter", true,
EditMode_Practice, true, true, 0, "Autogen To Fill Width","Backwards","Swap Sides",
"Copy Left To Right","Copy Right To Left","Clear Left","Clear Right",
"Collapse To One","Collapse Left","Shift Left","Shift Right" ),
"Collapse To One","Collapse Left","Shift Left","Shift Right", "Swap Up/Down", "Arbitrary Remap Columns" ),
MenuRowDef(ScreenEdit::tempo, "Tempo", true,
EditMode_Full, true, true, 0, "Compress 2x","Compress 3->2",
"Compress 4->3","Expand 3->4","Expand 2->3","Expand 2x" ),
@@ -3285,6 +3286,10 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
{
HandleAlterMenuChoice( (AlterMenuChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
}
else if( SM == SM_BackFromArbitraryRemap )
{
HandleArbitraryRemapping(ScreenTextEntry::s_sLastAnswer);
}
else if( SM == SM_BackFromStepsInformation )
{
HandleStepsInformationChoice( (StepsInformationChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
@@ -4532,6 +4537,66 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
GAMESTATE->SetProcessedTimingData(NULL);
}
static LocalizedString ENTER_ARBITRARY_MAPPING( "ScreenEdit", "Enter the new track mapping." );
static bool ConvertMappingInputToMapping(RString const& mapstr, int* mapping, RString& error)
{
vector<RString> mapping_input;
split(mapstr, ",", mapping_input);
int tracks_for_type= GAMEMAN->GetStepsTypeInfo(GAMESTATE->m_pCurSteps[0]->m_StepsType).iNumTracks;
if(mapping_input.size() > tracks_for_type)
{
error= "Too many tracks specified.";
return false;
}
// mapping_input.size() < tracks_for_type is not checked because
// unspecified tracks are mapped directly. -Kyz
size_t track= 0;
// track will be used for filling in the unspecified part of the mapping.
for(; track < mapping_input.size(); ++track)
{
if(mapping_input[track].empty())
{
mapping[track]= track;
}
else if(!(mapping_input[track] >> mapping[track]))
{
error= "'" + mapping_input[track] + "' is not a track id.";
return false;
}
if(mapping[track] < 0 || mapping[track] >= tracks_for_type)
{
error= ssprintf("Entry %d, '%s', '%d' is out of range 0 to %d.", track, mapping_input[track].c_str(), mapping[track], tracks_for_type-1);
return false;
}
}
for(; track < tracks_for_type; ++track)
{
mapping[track]= track;
}
return true;
}
static bool ArbitraryRemapValidate(const RString& answer, RString& error_out)
{
int mapping[MAX_NOTE_TRACKS];
return ConvertMappingInputToMapping(answer, mapping, error_out);
}
void ScreenEdit::HandleArbitraryRemapping(RString const& mapstr)
{
const NoteData OldClipboard( m_Clipboard );
HandleAlterMenuChoice( cut, false );
int mapping[MAX_NOTE_TRACKS];
RString error;
// error is actually reported by the validate function, and unused here.
if(ConvertMappingInputToMapping(mapstr, mapping, error))
{
NoteDataUtil::ArbitraryRemap(m_Clipboard, mapping);
}
HandleAreaMenuChoice( paste_at_begin_marker, false );
m_Clipboard = OldClipboard;
}
void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector<int> &iAnswers, bool bAllowUndo)
{
ASSERT_M(m_NoteFieldEdit.m_iBeginMarker!=-1 && m_NoteFieldEdit.m_iEndMarker!=-1,
@@ -4676,6 +4741,15 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector<int> &iAn
case collapse_left: NoteDataUtil::CollapseLeft( m_Clipboard ); break;
case shift_left: NoteDataUtil::ShiftLeft( m_Clipboard ); break;
case shift_right: NoteDataUtil::ShiftRight( m_Clipboard ); break;
case swap_up_down: NoteDataUtil::SwapUpDown(m_Clipboard, GAMESTATE->m_pCurSteps[0]->m_StepsType); break;
case arbitrary_remap:
ScreenTextEntry::TextEntry(
SM_BackFromArbitraryRemap, ENTER_ARBITRARY_MAPPING,
"0, 1, 2, 3", MAX_NOTE_TRACKS * 4,
// 2 chars for digit, one for comma, one for space.
ArbitraryRemapValidate
);
break;
}
HandleAreaMenuChoice( paste_at_begin_marker, false );
+13 -10
View File
@@ -442,6 +442,7 @@ public:
modify_keysounds_at_row, /**< Modify the keysounds at this row. */
NUM_AREA_MENU_CHOICES
};
void HandleArbitraryRemapping(RString const& mapstr);
void HandleAlterMenuChoice(AlterMenuChoice c,
const vector<int> &iAnswers,
bool bAllowUndo = true);
@@ -491,16 +492,18 @@ public:
enum AlterType
{
autogen_to_fill_width,
backwards,
swap_sides,
copy_left_to_right,
copy_right_to_left,
clear_left,
clear_right,
collapse_to_one,
collapse_left,
shift_left,
shift_right,
backwards,
swap_sides,
copy_left_to_right,
copy_right_to_left,
clear_left,
clear_right,
collapse_to_one,
collapse_left,
shift_left,
shift_right,
swap_up_down,
arbitrary_remap,
NUM_ALTER_TYPES
};
enum TempoType