1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-28 22:28:44 +02:00

Move some command handlers for selection and focus out of TrackPanel

This commit is contained in:
Paul Licameli 2017-06-11 11:03:28 -04:00
parent a9f7cb26e7
commit d834bcdbd1
6 changed files with 271 additions and 289 deletions

View File

@ -2985,41 +2985,299 @@ void AudacityProject::OnMoveToLabel(bool next)
}
}
/// The following method moves to the previous track
/// selecting and unselecting depending if you are on the start of a
/// block or not.
/// \todo Merge related methods, OnPrevTrack and OnNextTrack.
void AudacityProject::OnPrevTrack( bool shift )
{
TrackListIterator iter( GetTracks() );
Track* t = mTrackPanel->GetFocusedTrack();
if( t == NULL ) // if there isn't one, focus on last
{
t = iter.Last();
mTrackPanel->SetFocusedTrack( t );
mTrackPanel->EnsureVisible( t );
ModifyState(false);
return;
}
Track* p = NULL;
bool tSelected = false;
bool pSelected = false;
if( shift )
{
p = mTracks->GetPrev( t, true ); // Get previous track
if( p == NULL ) // On first track
{
// JKC: wxBell() is probably for accessibility, so a blind
// user knows they were at the top track.
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( GetTracks() );
p = iter.Last();
}
else
{
mTrackPanel->EnsureVisible( t );
return;
}
}
tSelected = t->GetSelected();
if (p)
pSelected = p->GetSelected();
if( tSelected && pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, false, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( p ); // move focus to next track down
mTrackPanel->EnsureVisible( p );
ModifyState(false);
return;
}
if( tSelected && !pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *p, true, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( p ); // move focus to next track down
mTrackPanel->EnsureVisible( p );
ModifyState(false);
return;
}
if( !tSelected && pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *p, false, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( p ); // move focus to next track down
mTrackPanel->EnsureVisible( p );
ModifyState(false);
return;
}
if( !tSelected && !pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, true, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( p ); // move focus to next track down
mTrackPanel->EnsureVisible( p );
ModifyState(false);
return;
}
}
else
{
p = mTracks->GetPrev( t, true ); // Get next track
if( p == NULL ) // On last track so stay there?
{
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( GetTracks() );
for( Track *d = iter.First(); d; d = iter.Next( true ) )
{
p = d;
}
mTrackPanel->SetFocusedTrack( p ); // Wrap to the first track
mTrackPanel->EnsureVisible( p );
ModifyState(false);
return;
}
else
{
mTrackPanel->EnsureVisible( t );
return;
}
}
else
{
mTrackPanel->SetFocusedTrack( p ); // move focus to next track down
mTrackPanel->EnsureVisible( p );
ModifyState(false);
return;
}
}
}
/// The following method moves to the next track,
/// selecting and unselecting depending if you are on the start of a
/// block or not.
void AudacityProject::OnNextTrack( bool shift )
{
Track *t;
Track *n;
TrackListIterator iter( GetTracks() );
bool tSelected,nSelected;
t = mTrackPanel->GetFocusedTrack(); // Get currently focused track
if( t == NULL ) // if there isn't one, focus on first
{
t = iter.First();
mTrackPanel->SetFocusedTrack( t );
mTrackPanel->EnsureVisible( t );
ModifyState(false);
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( GetTracks() );
n = iter.First();
}
else
{
mTrackPanel->EnsureVisible( t );
return;
}
}
tSelected = t->GetSelected();
nSelected = n->GetSelected();
if( tSelected && nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, false, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( n ); // move focus to next track down
mTrackPanel->EnsureVisible( n );
ModifyState(false);
return;
}
if( tSelected && !nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *n, true, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( n ); // move focus to next track down
mTrackPanel->EnsureVisible( n );
ModifyState(false);
return;
}
if( !tSelected && nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *n, false, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( n ); // move focus to next track down
mTrackPanel->EnsureVisible( n );
ModifyState(false);
return;
}
if( !tSelected && !nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, true, false, GetMixerBoard() );
mTrackPanel->SetFocusedTrack( n ); // move focus to next track down
mTrackPanel->EnsureVisible( n );
ModifyState(false);
return;
}
}
else
{
n = mTracks->GetNext( t, true ); // Get next track
if( n == NULL ) // On last track so stay there
{
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( GetTracks() );
n = iter.First();
mTrackPanel->SetFocusedTrack( n ); // Wrap to the first track
mTrackPanel->EnsureVisible( n );
ModifyState(false);
return;
}
else
{
mTrackPanel->EnsureVisible( t );
return;
}
}
else
{
mTrackPanel->SetFocusedTrack( n ); // move focus to next track down
mTrackPanel->EnsureVisible( n );
ModifyState(false);
return;
}
}
}
void AudacityProject::OnCursorUp()
{
mTrackPanel->OnPrevTrack( false );
OnPrevTrack( false );
}
void AudacityProject::OnCursorDown()
{
mTrackPanel->OnNextTrack( false );
OnNextTrack( false );
}
void AudacityProject::OnFirstTrack()
{
mTrackPanel->OnFirstTrack();
Track *t = mTrackPanel->GetFocusedTrack();
if (!t)
return;
TrackListIterator iter(GetTracks());
Track *f = iter.First();
if (t != f)
{
mTrackPanel->SetFocusedTrack(f);
ModifyState(false);
}
mTrackPanel->EnsureVisible(f);
}
void AudacityProject::OnLastTrack()
{
mTrackPanel->OnLastTrack();
Track *t = mTrackPanel->GetFocusedTrack();
if (!t)
return;
TrackListIterator iter(GetTracks());
Track *l = iter.Last();
if (t != l)
{
mTrackPanel->SetFocusedTrack(l);
ModifyState(false);
}
mTrackPanel->EnsureVisible(l);
}
void AudacityProject::OnShiftUp()
{
mTrackPanel->OnPrevTrack( true );
OnPrevTrack( true );
}
void AudacityProject::OnShiftDown()
{
mTrackPanel->OnNextTrack( true );
OnNextTrack( true );
}
#include "TrackPanelAx.h"
void AudacityProject::OnToggle()
{
mTrackPanel->OnToggle( );
Track *t;
t = mTrackPanel->GetFocusedTrack(); // Get currently focused track
if (!t)
return;
GetSelectionState().SelectTrack
( *mTracks, *t, !t->GetSelected(), true, GetMixerBoard() );
mTrackPanel->EnsureVisible( t );
ModifyState(false);
mTrackPanel->GetAx().Updated();
return;
}
void AudacityProject::OnCursorLeft(const wxEvent * evt)
{
bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP;

View File

@ -141,6 +141,8 @@ void OnPlaySpeedDec();
// Moving track focus commands
void OnPrevTrack( bool shift );
void OnNextTrack( bool shift );
void OnCursorUp();
void OnCursorDown();
void OnFirstTrack();

View File

@ -1316,6 +1316,9 @@ void AudacityProject::UpdatePrefs()
SetProjectTitle();
gPrefs->Read(wxT("/GUI/CircularTrackNavigation"), &mCircularTrackNavigation,
false);
if (mTrackPanel) {
mTrackPanel->UpdatePrefs();
}

View File

@ -638,6 +638,7 @@ private:
wxPanel *mTopPanel{};
TrackPanel *mTrackPanel{};
SelectionState mSelectionState{};
bool mCircularTrackNavigation{};
std::unique_ptr<TrackFactory> mTrackFactory{};
wxPanel * mMainPanel;
wxScrollBar *mHsbar;

View File

@ -460,7 +460,6 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
mMouseCapture = IsUncaptured;
mSlideUpDownOnly = false;
mLabelTrackStartXPos=-1;
mCircularTrackNavigation = false;
mRedrawAfterStop = false;
@ -752,8 +751,6 @@ void TrackPanel::UpdatePrefs()
{
gPrefs->Read(wxT("/GUI/AutoScroll"), &mViewInfo->bUpdateTrackIndicator,
true);
gPrefs->Read(wxT("/GUI/CircularTrackNavigation"), &mCircularTrackNavigation,
false);
gPrefs->Read(wxT("/GUI/Solo"), &mSoloPref, wxT("Simple"));
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
@ -7473,278 +7470,6 @@ void TrackPanel::UpdateVRulerSize()
Refresh(false);
}
/// The following method moves to the previous track
/// selecting and unselecting depending if you are on the start of a
/// block or not.
/// \todo Merge related methods, TrackPanel::OnPrevTrack and
/// TrackPanel::OnNextTrack.
void TrackPanel::OnPrevTrack( bool shift )
{
TrackListIterator iter( GetTracks() );
Track* t = GetFocusedTrack();
if( t == NULL ) // if there isn't one, focus on last
{
t = iter.Last();
SetFocusedTrack( t );
EnsureVisible( t );
MakeParentModifyState(false);
return;
}
Track* p = NULL;
bool tSelected = false;
bool pSelected = false;
if( shift )
{
p = mTracks->GetPrev( t, true ); // Get previous track
if( p == NULL ) // On first track
{
// JKC: wxBell() is probably for accessibility, so a blind
// user knows they were at the top track.
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( GetTracks() );
p = iter.Last();
}
else
{
EnsureVisible( t );
return;
}
}
tSelected = t->GetSelected();
if (p)
pSelected = p->GetSelected();
if( tSelected && pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, false, false, GetMixerBoard() );
SetFocusedTrack( p ); // move focus to next track down
EnsureVisible( p );
MakeParentModifyState(false);
return;
}
if( tSelected && !pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *p, true, false, GetMixerBoard() );
SetFocusedTrack( p ); // move focus to next track down
EnsureVisible( p );
MakeParentModifyState(false);
return;
}
if( !tSelected && pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *p, false, false, GetMixerBoard() );
SetFocusedTrack( p ); // move focus to next track down
EnsureVisible( p );
MakeParentModifyState(false);
return;
}
if( !tSelected && !pSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, true, false, GetMixerBoard() );
SetFocusedTrack( p ); // move focus to next track down
EnsureVisible( p );
MakeParentModifyState(false);
return;
}
}
else
{
p = mTracks->GetPrev( t, true ); // Get next track
if( p == NULL ) // On last track so stay there?
{
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( GetTracks() );
for( Track *d = iter.First(); d; d = iter.Next( true ) )
{
p = d;
}
SetFocusedTrack( p ); // Wrap to the first track
EnsureVisible( p );
MakeParentModifyState(false);
return;
}
else
{
EnsureVisible( t );
return;
}
}
else
{
SetFocusedTrack( p ); // move focus to next track down
EnsureVisible( p );
MakeParentModifyState(false);
return;
}
}
}
/// The following method moves to the next track,
/// selecting and unselecting depending if you are on the start of a
/// block or not.
void TrackPanel::OnNextTrack( bool shift )
{
Track *t;
Track *n;
TrackListIterator iter( GetTracks() );
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 );
MakeParentModifyState(false);
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( GetTracks() );
n = iter.First();
}
else
{
EnsureVisible( t );
return;
}
}
tSelected = t->GetSelected();
nSelected = n->GetSelected();
if( tSelected && nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, false, false, GetMixerBoard() );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
MakeParentModifyState(false);
return;
}
if( tSelected && !nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *n, true, false, GetMixerBoard() );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
MakeParentModifyState(false);
return;
}
if( !tSelected && nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *n, false, false, GetMixerBoard() );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
MakeParentModifyState(false);
return;
}
if( !tSelected && !nSelected )
{
GetSelectionState().SelectTrack
( *mTracks, *t, true, false, GetMixerBoard() );
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
MakeParentModifyState(false);
return;
}
}
else
{
n = mTracks->GetNext( t, true ); // Get next track
if( n == NULL ) // On last track so stay there
{
wxBell();
if( mCircularTrackNavigation )
{
TrackListIterator iter( GetTracks() );
n = iter.First();
SetFocusedTrack( n ); // Wrap to the first track
EnsureVisible( n );
MakeParentModifyState(false);
return;
}
else
{
EnsureVisible( t );
return;
}
}
else
{
SetFocusedTrack( n ); // move focus to next track down
EnsureVisible( n );
MakeParentModifyState(false);
return;
}
}
}
void TrackPanel::OnFirstTrack()
{
Track *t = GetFocusedTrack();
if (!t)
return;
TrackListIterator iter(GetTracks());
Track *f = iter.First();
if (t != f)
{
SetFocusedTrack(f);
MakeParentModifyState(false);
}
EnsureVisible(f);
}
void TrackPanel::OnLastTrack()
{
Track *t = GetFocusedTrack();
if (!t)
return;
TrackListIterator iter(GetTracks());
Track *l = iter.Last();
if (t != l)
{
SetFocusedTrack(l);
MakeParentModifyState(false);
}
EnsureVisible(l);
}
void TrackPanel::OnToggle()
{
Track *t;
t = GetFocusedTrack(); // Get currently focused track
if (!t)
return;
GetSelectionState().SelectTrack
( *mTracks, *t, !t->GetSelected(), true, GetMixerBoard() );
EnsureVisible( t );
MakeParentModifyState(false);
mAx->Updated();
return;
}
// Make sure selection edge is in view
void TrackPanel::ScrollIntoView(double pos)
{

View File

@ -237,12 +237,6 @@ class AUDACITY_DLL_API TrackPanel final : public OverlayPanel {
virtual void HandlePageDownKey();
virtual AudacityProject * GetProject() const;
virtual void OnPrevTrack(bool shift = false);
virtual void OnNextTrack(bool shift = false);
virtual void OnFirstTrack();
virtual void OnLastTrack();
virtual void OnToggle();
virtual void ScrollIntoView(double pos);
virtual void ScrollIntoView(int x);
@ -801,7 +795,6 @@ protected:
virtual void SetCapturedTrack( Track * t, enum MouseCaptureEnum MouseCapture=IsUncaptured );
bool mSlideUpDownOnly;
bool mCircularTrackNavigation;
// JH: if the user is dragging a track, at what y
// coordinate should the dragging track move up or down?