The following function moves to the next track, selecting and unselecting depending if you are on the start of a block or not. Definition at line 4805 of file TrackPanel.cpp. References TrackListIterator::First(), Track::GetName(), TrackList::GetNext(), Track::GetSelected(), and TrackList::Select(). {
Track *t;
Track *n;
TrackListIterator iter( mTracks );
bool tSelected,nSelected;
t = GetFocusedTrack(); // Get currently focused track
if( t == NULL ) // if there isn't one, focus on first
{
t = iter.First();
SetFocusedTrack( t );
EnsureVisible( t );
return;
}
if( shift )
{
n = mTracks->GetNext( t, true ); // Get next track
if( n == NULL ) // On last track so stay there
{
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( mTracks );
n = iter.First();
}
else
{
EnsureVisible( t );
wxLogDebug(wxT("On last track, %s"),t->GetName().c_str());
return;
}
}
tSelected = t->GetSelected();
nSelected = n->GetSelected();
if( tSelected & nSelected )
{
mTracks->Select( t, false );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
return;
}
if( tSelected & !nSelected )
{
mTracks->Select( n, true );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
return;
}
if( !tSelected & nSelected )
{
mTracks->Select( n, false );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
return;
}
if( !tSelected & !nSelected )
{
mTracks->Select( t, true );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
return;
}
}
else
{
n = mTracks->GetNext( t, true ); // Get next track
if( n == NULL ) // On last track so stay there
{
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( mTracks );
n = iter.First();
SetFocusedTrack( n ); // Wrap to the first track
EnsureVisible( n );
return;
}
else
{
EnsureVisible( t );
return;
}
}
else
{
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
return;
}
}
}
|