1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-20 14:20:06 +02:00

Rewrite some iterations over tracks and channels in TrackPanel

This commit is contained in:
Paul Licameli 2018-09-12 12:23:57 -04:00
parent aee4005044
commit 23a85893a1
5 changed files with 42 additions and 150 deletions

View File

@ -749,34 +749,13 @@ void TrackPanel::UpdateAccessibility()
// Counts tracks, counting stereo tracks as one track. // Counts tracks, counting stereo tracks as one track.
size_t TrackPanel::GetTrackCount() const size_t TrackPanel::GetTrackCount() const
{ {
size_t count = 0; return GetTracks()->Leaders().size();
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;
} }
// Counts selected tracks, counting stereo tracks as one track. // Counts selected tracks, counting stereo tracks as one track.
size_t TrackPanel::GetSelectedTrackCount() const size_t TrackPanel::GetSelectedTrackCount() const
{ {
size_t count = 0; return GetTracks()->SelectedLeaders().size();
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;
} }
void TrackPanel::MessageForScreenReader(const wxString& message) void TrackPanel::MessageForScreenReader(const wxString& message)
@ -1845,10 +1824,8 @@ void TrackPanel::HighlightFocusedTrack(wxDC * dc, const wxRect & rect)
void TrackPanel::UpdateVRulers() void TrackPanel::UpdateVRulers()
{ {
TrackListOfKindIterator iter(Track::Wave, GetTracks()); for (auto t : GetTracks()->Any< const WaveTrack >())
for (Track *t = iter.First(); t; t = iter.Next()) {
UpdateTrackVRuler(t); UpdateTrackVRuler(t);
}
UpdateVRulerSize(); UpdateVRulerSize();
} }
@ -1883,14 +1860,12 @@ void TrackPanel::UpdateTrackVRuler(const Track *t)
void TrackPanel::UpdateVRulerSize() void TrackPanel::UpdateVRulerSize()
{ {
TrackListIterator iter(GetTracks()); auto trackRange = GetTracks()->Any();
Track *t = iter.First(); if (trackRange) {
if (t) { wxSize s { 0, 0 };
wxSize s = t->vrulerSize; for (auto t : trackRange)
while (t) {
s.IncTo(t->vrulerSize); s.IncTo(t->vrulerSize);
t = iter.Next();
}
if (vrulerSize != s) { if (vrulerSize != s) {
vrulerSize = s; vrulerSize = s;
mRuler->SetLeftOffset(GetLeftOffset()); // bevel on AdornedRuler mRuler->SetLeftOffset(GetLeftOffset()); // bevel on AdornedRuler
@ -1927,54 +1902,29 @@ void TrackPanel::OnTrackMenu(Track *t)
Track * TrackPanel::GetFirstSelectedTrack() Track * TrackPanel::GetFirstSelectedTrack()
{ {
auto t = *GetTracks()->Selected().begin();
TrackListIterator iter(GetTracks()); if (t)
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)
return t; return t;
else else
return NULL; //if nothing is selected, return the first track
return *GetTracks()->Any().begin();
} }
void TrackPanel::EnsureVisible(Track * t) void TrackPanel::EnsureVisible(Track * t)
{ {
TrackListIterator iter(GetTracks());
Track *it = NULL;
Track *nt = NULL;
SetFocusedTrack(t); SetFocusedTrack(t);
int trackTop = 0; int trackTop = 0;
int trackHeight =0; int trackHeight =0;
for (it = iter.First(); it; it = iter.Next()) { for (auto it : GetTracks()->Leaders()) {
trackTop += trackHeight; trackTop += trackHeight;
trackHeight = it->GetHeight();
//find the second track if this is stereo auto channels = TrackList::Channels(it);
if (it->GetLinked()) { trackHeight = channels.sum( &Track::GetHeight );
nt = iter.Next();
trackHeight += nt->GetHeight();
}
else {
nt = it;
}
//We have found the track we want to ensure is visible. //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. //Get the size of the trackpanel.
int width, height; int width, height;
@ -2000,27 +1950,20 @@ void TrackPanel::EnsureVisible(Track * t)
// 0.0 scrolls to top // 0.0 scrolls to top
// 1.0 scrolls to bottom. // 1.0 scrolls to bottom.
void TrackPanel::VerticalScroll( float fracPosition){ void TrackPanel::VerticalScroll( float fracPosition){
TrackListIterator iter(GetTracks());
Track *it = NULL;
Track *nt = NULL;
// Compute trackHeight
int trackTop = 0; int trackTop = 0;
int trackHeight =0; int trackHeight = 0;
for (it = iter.First(); it; it = iter.Next()) { auto tracks = GetTracks();
trackTop += trackHeight; auto GetHeight =
trackHeight = it->GetHeight(); [&]( const Track *t ){ return tracks->GetGroupHeight(t); };
//find the second track if this is stereo auto range = tracks->Leaders();
if (it->GetLinked()) { if (!range.empty()) {
nt = iter.Next(); trackHeight = GetHeight( *range.rbegin() );
trackHeight += nt->GetHeight(); --range.second;
}
else {
nt = it;
}
} }
trackTop = range.sum( GetHeight );
int delta; int delta;

View File

@ -62,9 +62,7 @@ std::shared_ptr<Track> TrackPanelAx::GetFocus()
focusedTrack = FindTrack(mNumFocusedTrack); focusedTrack = FindTrack(mNumFocusedTrack);
} }
if (!focusedTrack) { if (!focusedTrack) {
focusedTrack = Track::Pointer( *mTrackPanel->GetTracks()->Any().first );
TrackListIterator iter( mTrackPanel->GetTracks() );
focusedTrack = Track::Pointer( iter.First() );
// only call SetFocus if the focus has changed to avoid // only call SetFocus if the focus has changed to avoid
// unnecessary focus events // unnecessary focus events
if (focusedTrack) if (focusedTrack)
@ -99,10 +97,7 @@ std::shared_ptr<Track> TrackPanelAx::SetFocus( std::shared_ptr<Track> track )
#endif #endif
if( !track ) if( !track )
{ track = Track::Pointer( *mTrackPanel->GetTracks()->Any().begin() );
TrackListIterator iter( mTrackPanel->GetTracks() );
track = Track::Pointer( iter.First() );
}
mFocusedTrack = track; mFocusedTrack = track;
mNumFocusedTrack = TrackNum(track); mNumFocusedTrack = TrackNum(track);
@ -252,24 +247,7 @@ wxAccStatus TrackPanelAx::GetChild( int childId, wxAccessible** child )
// Gets the number of children. // Gets the number of children.
wxAccStatus TrackPanelAx::GetChildCount( int* childCount ) wxAccStatus TrackPanelAx::GetChildCount( int* childCount )
{ {
TrackListIterator iter( mTrackPanel->GetTracks() ); *childCount = mTrackPanel->GetTrackCount();
Track *t = iter.First();
int cnt = 0;
while( t != NULL )
{
cnt++;
if( t->GetLink() != NULL )
{
t = iter.Next();
}
t = iter.Next();
}
*childCount = cnt;
return wxACC_OK; return wxACC_OK;
} }

View File

@ -34,19 +34,10 @@ void LabelDefaultClickHandle::SaveState( AudacityProject *pProject )
mLabelState = std::make_shared<LabelState>(); mLabelState = std::make_shared<LabelState>();
auto &pairs = mLabelState->mPairs; auto &pairs = mLabelState->mPairs;
TrackList *const tracks = pProject->GetTracks(); TrackList *const tracks = pProject->GetTracks();
TrackListIterator iter(tracks);
Track *n = iter.First();
while (n) { for (auto lt : tracks->Any<LabelTrack>())
if (n->GetKind() == Track::Label) { pairs.push_back( std::make_pair(
LabelTrack *const lt = static_cast<LabelTrack*>(n); Track::Pointer<LabelTrack>( lt ), lt->SaveFlags() ) );
pairs.push_back( std::make_pair(
Track::Pointer<LabelTrack>( lt ),
lt->SaveFlags() )
);
}
n = iter.Next();
}
} }
void LabelDefaultClickHandle::RestoreState( AudacityProject *pProject ) void LabelDefaultClickHandle::RestoreState( AudacityProject *pProject )
@ -70,17 +61,12 @@ UIHandle::Result LabelDefaultClickHandle::Click
{ {
SaveState( pProject ); SaveState( pProject );
TrackList *const tracks = pProject->GetTracks(); const auto pLT = evt.pCell.get();
TrackListIterator iter(tracks); for (auto lt : pProject->GetTracks()->Any<LabelTrack>()) {
Track *n = iter.First(); if (pLT != lt) {
while (n) {
if (n->GetKind() == Track::Label && evt.pCell.get() != n) {
LabelTrack *const lt = static_cast<LabelTrack*>(n);
lt->ResetFlags(); lt->ResetFlags();
lt->Unselect(); lt->Unselect();
} }
n = iter.Next();
} }
} }

View File

@ -87,27 +87,16 @@ UIHandle::Result LabelTextHandle::Click
{ {
// IF the user clicked a label, THEN select all other tracks by Label // 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 //do nothing if at least one other track is selected
bool done = false; bool done = tracks->Selected().any_of(
while (!done && t) { [&](const Track *pTrack){ return pTrack != pLT.get(); }
if (t->GetSelected() && t != pLT.get()) );
done = true;
t = iter.Next();
}
if (!done) { if (!done) {
//otherwise, select all tracks //otherwise, select all tracks
t = iter.First(); for (auto t : tracks->Any())
while (t)
{
selectionState.SelectTrack selectionState.SelectTrack
( *t, true, true, ( *t, true, true, pProject->GetMixerBoard() );
pProject->GetMixerBoard() );
t = iter.Next();
}
} }
// Do this after, for its effect on TrackPanel's memory of last selected // Do this after, for its effect on TrackPanel's memory of last selected

View File

@ -229,13 +229,9 @@ void TimeShiftHandle::CreateListOfCapturedClips
// First, if click was in selection, capture selected clips; otherwise // First, if click was in selection, capture selected clips; otherwise
// just the clicked-on clip // just the clicked-on clip
if ( state.capturedClipIsSelection ) { if ( state.capturedClipIsSelection )
TrackListIterator iter( &trackList ); for (auto t : trackList.Selected())
for (Track *t = iter.First(); t; t = iter.Next()) { AddClipsToCaptured( state, viewInfo, t, true );
if (t->GetSelected())
AddClipsToCaptured( state, viewInfo, t, true );
}
}
else { else {
state.capturedClipArray.push_back state.capturedClipArray.push_back
(TrackClip( &capturedTrack, state.capturedClip )); (TrackClip( &capturedTrack, state.capturedClip ));