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:
parent
aee4005044
commit
23a85893a1
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 ));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user