diff --git a/src/Menus.cpp b/src/Menus.cpp index 0c9c1a6ea..d1c3698a1 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -8113,29 +8113,15 @@ void MenuCommandHandler::HandleMixAndRender if (uNewLeft) { // Remove originals, get stats on what tracks were mixed - TrackListIterator iter(tracks); - Track *t = iter.First(); - int selectedCount = 0; + auto trackRange = tracks->Selected< WaveTrack >(); + auto selectedCount = (trackRange + &Track::IsLeader).size(); wxString firstName; - - while (t) { - if (t->GetSelected() && (t->GetKind() == Track::Wave)) { - if (selectedCount==0) - firstName = t->GetName(); - - // Add one to the count if it's an unlinked track, or if it's the first - // in a stereo pair - if (t->GetLinked() || !t->GetLink()) - selectedCount++; - - if (!toNewTrack) { - t = iter.RemoveCurrent(); - } else { - t = iter.Next(); - }; - } - else - t = iter.Next(); + if (selectedCount > 0) + firstName = (*trackRange.begin())->GetName(); + if (!toNewTrack) { + // Beware iterator invalidation! + for (auto &it = trackRange.first, &end = trackRange.second; it != end;) + tracks->Remove( *it++ ); } // Add NEW tracks @@ -9671,34 +9657,31 @@ void MenuCommandHandler::OnRemoveTracks(const CommandContext &context) auto trackPanel = project.GetTrackPanel(); auto mixerBoard = project.GetMixerBoard(); - TrackListIterator iter(tracks); - Track *t = iter.First(); - Track *f = NULL; - Track *l = NULL; + std::vector toRemove; + for (auto track : tracks->Selected()) + toRemove.push_back(track); - while (t) { - if (t->GetSelected()) { - auto playable = dynamic_cast(t); - if (mixerBoard && playable) - mixerBoard->RemoveTrackCluster(playable); - if (!f) - f = l; // Capture the track preceeding the first removed track - t = iter.RemoveCurrent(); - } - else { - l = t; - t = iter.Next(); - } + // Capture the track preceding the first removed track + Track *f{}; + if (!toRemove.empty()) { + auto found = tracks->Find(toRemove[0]); + f = *--found; } - // All tracks but the last were removed...try to use the last track - if (!f) - f = l; + if (mixerBoard) + for (auto track : tracks->Selected()) + mixerBoard->RemoveTrackCluster(track); - // Try to use the first track after the removal or, if none, - // the track preceeding the removal + for (auto track : toRemove) + tracks->Remove(track); + + if (!f) + // try to use the last track + f = *tracks->Any().rbegin(); if (f) { - t = tracks->GetNext(f, true); + // Try to use the first track after the removal + auto found = tracks->FindLeader(f); + auto t = *++found; if (t) f = t; } diff --git a/src/Track.cpp b/src/Track.cpp index ffa80d2ba..7c6dcee50 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -523,23 +523,6 @@ Track *TrackListIterator::operator *() const return cur.first->get(); } -Track *TrackListIterator::RemoveCurrent() -{ - if ( !l || l->isNull( cur ) ) - return nullptr; - - cur = l->Remove( cur.first->get() ); - - #ifdef DEBUG_TLI // if we are debugging this bit - wxASSERT_MSG((!cur || (*l).Contains((*cur).t)), wxT("cur invalid after deletion of track.")); // check that cur is in the list - #endif - - if ( !l->isNull( cur ) ) - return cur.first->get(); - - return nullptr; -} - bool TrackListIterator::operator == (const TrackListIterator &other) const { // Order these steps so as not to use operator == on default-constructed diff --git a/src/Track.h b/src/Track.h index 76fb723ad..04776786f 100644 --- a/src/Track.h +++ b/src/Track.h @@ -1099,8 +1099,6 @@ class AUDACITY_DLL_API TrackListIterator /* not final */ virtual Track *Prev(); virtual Track *Last(); - Track *RemoveCurrent(); // deletes track, returns next - // Provide minimal STL forward-iterator idiom: // unlike Next, this is non-mutating.