Add the copy/paste selected timing data feature.

Not perfect at this stage, but...well, everyone wanted it.
This commit is contained in:
Jason Felds
2011-07-26 16:05:14 -04:00
parent 4eeb2e6442
commit 9505e09f58
5 changed files with 162 additions and 15 deletions
+68 -8
View File
@@ -29,22 +29,83 @@ bool TimingData::empty() const
TimingData TimingData::CopyRange(int startRow, int endRow) const
{
TimingData tmp;
TimingData ret;
for (unsigned i = 0; i < NUM_TimingSegmentType; i++)
FOREACH_ENUM(TimingSegmentType, tst)
{
for (unsigned j = 0; j < this->allTimingSegments[i].size(); j++)
unsigned cnt = 0;
for (unsigned j = 0; j < this->allTimingSegments[tst].size(); j++)
{
int row = this->allTimingSegments[i][j]->GetRow();
int row = this->allTimingSegments[tst][j]->GetRow();
if (row >= startRow && row < endRow)
{
tmp.AddSegment(static_cast<TimingSegmentType>(i),
this->allTimingSegments[i][j]);
// TODO: This REALLY needs improving.
TimingSegment * org = this->allTimingSegments[tst][j];
TimingSegment * cpy;
switch (tst)
{
case SEGMENT_BPM:
{
cpy = new BPMSegment(*(static_cast<BPMSegment *>(org)));
break;
}
case SEGMENT_STOP_DELAY:
{
cpy = new StopSegment(*(static_cast<StopSegment *>(org)));
break;
}
case SEGMENT_TIME_SIG:
{
cpy = new TimeSignatureSegment(*(static_cast<TimeSignatureSegment *>(org)));
break;
}
case SEGMENT_WARP:
{
cpy = new WarpSegment(*(static_cast<WarpSegment *>(org)));
break;
}
case SEGMENT_LABEL:
{
cpy = new LabelSegment(*(static_cast<LabelSegment *>(org)));
break;
}
case SEGMENT_TICKCOUNT:
{
cpy = new TickcountSegment(*(static_cast<TickcountSegment *>(org)));
break;
}
case SEGMENT_COMBO:
{
cpy = new ComboSegment(*(static_cast<ComboSegment *>(org)));
break;
}
case SEGMENT_SPEED:
{
cpy = new SpeedSegment(*(static_cast<SpeedSegment *>(org)));
break;
}
case SEGMENT_SCROLL:
{
cpy = new ScrollSegment(*(static_cast<ScrollSegment *>(org)));
break;
}
case SEGMENT_FAKE:
{
cpy = new FakeSegment(*(static_cast<FakeSegment *>(org)));
break;
}
default: FAIL_M(ssprintf("An unknown timing segment type %d can't be copied over!", tst));
}
// reset the rows as if startRow was beat 0.
cpy->SetRow(org->GetRow() - startRow);
ret.AddSegment(tst, cpy);
cnt++;
}
}
}
return tmp;
return ret;
}
void TimingData::GetActualBPM( float &fMinBPMOut, float &fMaxBPMOut, float highest ) const
@@ -655,7 +716,6 @@ bool TimingData::IsFakeAtRow( int iNoteRow ) const
BPMSegment* TimingData::GetBPMSegmentAtRow( int iNoteRow )
{
vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
static BPMSegment empty;
if( bpms.empty() )
return new BPMSegment();