bool WaveTrack::HandleClear(double t0, double t1, bool addCutLines, bool split) { if (t1 < t0) return false; WaveClipList::Node* it; WaveClipList clipsToDelete; WaveClipList clipsToAdd; for (it=GetClipIterator(); it; it=it->GetNext()) { WaveClip *clip = it->GetData(); if (t0 <= clip->GetStartTime() && t1 >= clip->GetEndTime()) { // Whole clip must be deleted - remember this clipsToDelete.Append(clip); } else if (t1 > clip->GetStartTime() && t0 < clip->GetEndTime()) { // Clip data is affected by command if (addCutLines) { if (!clip->ClearAndAddCutLine(t0,t1)) return false; } else { if (split) { // Three cases: if (t0 <= clip->GetStartTime()) { // Delete from the left edge clip->Clear(clip->GetStartTime(), t1); clip->Offset(t1-clip->GetStartTime()); } else if (t1 >= clip->GetEndTime()) { // Delete to right edge clip->Clear(t0, clip->GetEndTime()); } else { // Delete in the middle of the clip...we actually create two // new clips out of the left and right halves... WaveClip *left = new WaveClip(*clip, mDirManager); left->Clear(t0, clip->GetEndTime()); clipsToAdd.Append(left); WaveClip *right = new WaveClip(*clip, mDirManager); right->Clear(clip->GetStartTime(), t1); right->Offset(t1-clip->GetStartTime()); clipsToAdd.Append(right); clipsToDelete.Append(clip); } } else { if (!clip->Clear(t0,t1)) return false; } } } else if (clip->GetStartTime() >= t1) { // Clip is "behind" the region -- offset it unless we're splitting if (!split) clip->Offset(-(t1-t0)); } } for (it=clipsToDelete.GetFirst(); it; it=it->GetNext()) { mClips.DeleteObject(it->GetData()); delete it->GetData(); } for (it=clipsToAdd.GetFirst(); it; it=it->GetNext()) { mClips.Append(it->GetData()); } return true; }