diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 56619fb27..8168f5db3 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -749,34 +749,13 @@ void TrackPanel::UpdateAccessibility() // Counts tracks, counting stereo tracks as one track. size_t TrackPanel::GetTrackCount() const { - size_t count = 0; - TrackListConstIterator iter(GetTracks()); - for (auto t = iter.First(); t; t = iter.Next()) { - count += 1; - if( t->GetLinked() ){ - t = iter.Next(); - if( !t ) - break; - } - } - return count; + return GetTracks()->Leaders().size(); } // Counts selected tracks, counting stereo tracks as one track. size_t TrackPanel::GetSelectedTrackCount() const { - size_t count = 0; - - TrackListConstIterator iter(GetTracks()); - for (auto t = iter.First(); t; t = iter.Next()) { - count += t->GetSelected() ? 1:0; - if( t->GetLinked() ){ - t = iter.Next(); - if( !t ) - break; - } - } - return count; + return GetTracks()->SelectedLeaders().size(); } void TrackPanel::MessageForScreenReader(const wxString& message) @@ -1845,10 +1824,8 @@ void TrackPanel::HighlightFocusedTrack(wxDC * dc, const wxRect & rect) void TrackPanel::UpdateVRulers() { - TrackListOfKindIterator iter(Track::Wave, GetTracks()); - for (Track *t = iter.First(); t; t = iter.Next()) { + for (auto t : GetTracks()->Any< const WaveTrack >()) UpdateTrackVRuler(t); - } UpdateVRulerSize(); } @@ -1883,14 +1860,12 @@ void TrackPanel::UpdateTrackVRuler(const Track *t) void TrackPanel::UpdateVRulerSize() { - TrackListIterator iter(GetTracks()); - Track *t = iter.First(); - if (t) { - wxSize s = t->vrulerSize; - while (t) { + auto trackRange = GetTracks()->Any(); + if (trackRange) { + wxSize s { 0, 0 }; + for (auto t : trackRange) s.IncTo(t->vrulerSize); - t = iter.Next(); - } + if (vrulerSize != s) { vrulerSize = s; mRuler->SetLeftOffset(GetLeftOffset()); // bevel on AdornedRuler @@ -1927,54 +1902,29 @@ void TrackPanel::OnTrackMenu(Track *t) Track * TrackPanel::GetFirstSelectedTrack() { - - TrackListIterator iter(GetTracks()); - - Track * t; - for ( t = iter.First();t!=NULL;t=iter.Next()) - { - //Find the first selected track - if(t->GetSelected()) - { - return t; - } - - } - //if nothing is selected, return the first track - t = iter.First(); - - if(t) + auto t = *GetTracks()->Selected().begin(); + if (t) return t; else - return NULL; + //if nothing is selected, return the first track + return *GetTracks()->Any().begin(); } void TrackPanel::EnsureVisible(Track * t) { - TrackListIterator iter(GetTracks()); - Track *it = NULL; - Track *nt = NULL; - SetFocusedTrack(t); int trackTop = 0; int trackHeight =0; - for (it = iter.First(); it; it = iter.Next()) { + for (auto it : GetTracks()->Leaders()) { trackTop += trackHeight; - trackHeight = it->GetHeight(); - //find the second track if this is stereo - if (it->GetLinked()) { - nt = iter.Next(); - trackHeight += nt->GetHeight(); - } - else { - nt = it; - } + auto channels = TrackList::Channels(it); + trackHeight = channels.sum( &Track::GetHeight ); //We have found the track we want to ensure is visible. - if ((it == t) || (nt == t)) { + if (channels.contains(t)) { //Get the size of the trackpanel. int width, height; @@ -2000,27 +1950,20 @@ void TrackPanel::EnsureVisible(Track * t) // 0.0 scrolls to top // 1.0 scrolls to bottom. void TrackPanel::VerticalScroll( float fracPosition){ - TrackListIterator iter(GetTracks()); - Track *it = NULL; - Track *nt = NULL; - // Compute trackHeight int trackTop = 0; - int trackHeight =0; + int trackHeight = 0; - for (it = iter.First(); it; it = iter.Next()) { - trackTop += trackHeight; - trackHeight = it->GetHeight(); + auto tracks = GetTracks(); + auto GetHeight = + [&]( const Track *t ){ return tracks->GetGroupHeight(t); }; - //find the second track if this is stereo - if (it->GetLinked()) { - nt = iter.Next(); - trackHeight += nt->GetHeight(); - } - else { - nt = it; - } + auto range = tracks->Leaders(); + if (!range.empty()) { + trackHeight = GetHeight( *range.rbegin() ); + --range.second; } + trackTop = range.sum( GetHeight ); int delta; diff --git a/src/TrackPanelAx.cpp b/src/TrackPanelAx.cpp index 98db548eb..96c115692 100644 --- a/src/TrackPanelAx.cpp +++ b/src/TrackPanelAx.cpp @@ -62,9 +62,7 @@ std::shared_ptr TrackPanelAx::GetFocus() focusedTrack = FindTrack(mNumFocusedTrack); } if (!focusedTrack) { - - TrackListIterator iter( mTrackPanel->GetTracks() ); - focusedTrack = Track::Pointer( iter.First() ); + focusedTrack = Track::Pointer( *mTrackPanel->GetTracks()->Any().first ); // only call SetFocus if the focus has changed to avoid // unnecessary focus events if (focusedTrack) @@ -99,10 +97,7 @@ std::shared_ptr TrackPanelAx::SetFocus( std::shared_ptr track ) #endif if( !track ) - { - TrackListIterator iter( mTrackPanel->GetTracks() ); - track = Track::Pointer( iter.First() ); - } + track = Track::Pointer( *mTrackPanel->GetTracks()->Any().begin() ); mFocusedTrack = track; mNumFocusedTrack = TrackNum(track); @@ -252,24 +247,7 @@ wxAccStatus TrackPanelAx::GetChild( int childId, wxAccessible** child ) // Gets the number of children. wxAccStatus TrackPanelAx::GetChildCount( int* childCount ) { - TrackListIterator iter( mTrackPanel->GetTracks() ); - Track *t = iter.First(); - int cnt = 0; - - while( t != NULL ) - { - cnt++; - - if( t->GetLink() != NULL ) - { - t = iter.Next(); - } - - t = iter.Next(); - } - - *childCount = cnt; - + *childCount = mTrackPanel->GetTrackCount(); return wxACC_OK; } diff --git a/src/tracks/labeltrack/ui/LabelDefaultClickHandle.cpp b/src/tracks/labeltrack/ui/LabelDefaultClickHandle.cpp index 02034e9ab..84bc458c7 100644 --- a/src/tracks/labeltrack/ui/LabelDefaultClickHandle.cpp +++ b/src/tracks/labeltrack/ui/LabelDefaultClickHandle.cpp @@ -34,19 +34,10 @@ void LabelDefaultClickHandle::SaveState( AudacityProject *pProject ) mLabelState = std::make_shared(); auto &pairs = mLabelState->mPairs; TrackList *const tracks = pProject->GetTracks(); - TrackListIterator iter(tracks); - Track *n = iter.First(); - while (n) { - if (n->GetKind() == Track::Label) { - LabelTrack *const lt = static_cast(n); - pairs.push_back( std::make_pair( - Track::Pointer( lt ), - lt->SaveFlags() ) - ); - } - n = iter.Next(); - } + for (auto lt : tracks->Any()) + pairs.push_back( std::make_pair( + Track::Pointer( lt ), lt->SaveFlags() ) ); } void LabelDefaultClickHandle::RestoreState( AudacityProject *pProject ) @@ -70,17 +61,12 @@ UIHandle::Result LabelDefaultClickHandle::Click { SaveState( pProject ); - TrackList *const tracks = pProject->GetTracks(); - TrackListIterator iter(tracks); - Track *n = iter.First(); - - while (n) { - if (n->GetKind() == Track::Label && evt.pCell.get() != n) { - LabelTrack *const lt = static_cast(n); + const auto pLT = evt.pCell.get(); + for (auto lt : pProject->GetTracks()->Any()) { + if (pLT != lt) { lt->ResetFlags(); lt->Unselect(); } - n = iter.Next(); } } diff --git a/src/tracks/labeltrack/ui/LabelTextHandle.cpp b/src/tracks/labeltrack/ui/LabelTextHandle.cpp index 2bf0924b8..41a5f0154 100644 --- a/src/tracks/labeltrack/ui/LabelTextHandle.cpp +++ b/src/tracks/labeltrack/ui/LabelTextHandle.cpp @@ -87,27 +87,16 @@ UIHandle::Result LabelTextHandle::Click { // IF the user clicked a label, THEN select all other tracks by Label - TrackListIterator iter(tracks); - Track *t = iter.First(); - //do nothing if at least one other track is selected - bool done = false; - while (!done && t) { - if (t->GetSelected() && t != pLT.get()) - done = true; - t = iter.Next(); - } + bool done = tracks->Selected().any_of( + [&](const Track *pTrack){ return pTrack != pLT.get(); } + ); if (!done) { //otherwise, select all tracks - t = iter.First(); - while (t) - { + for (auto t : tracks->Any()) selectionState.SelectTrack - ( *t, true, true, - pProject->GetMixerBoard() ); - t = iter.Next(); - } + ( *t, true, true, pProject->GetMixerBoard() ); } // Do this after, for its effect on TrackPanel's memory of last selected diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index ea7856e05..cca2fe513 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -229,13 +229,9 @@ void TimeShiftHandle::CreateListOfCapturedClips // First, if click was in selection, capture selected clips; otherwise // just the clicked-on clip - if ( state.capturedClipIsSelection ) { - TrackListIterator iter( &trackList ); - for (Track *t = iter.First(); t; t = iter.Next()) { - if (t->GetSelected()) - AddClipsToCaptured( state, viewInfo, t, true ); - } - } + if ( state.capturedClipIsSelection ) + for (auto t : trackList.Selected()) + AddClipsToCaptured( state, viewInfo, t, true ); else { state.capturedClipArray.push_back (TrackClip( &capturedTrack, state.capturedClip ));