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:
parent
a9f7cb26e7
commit
d834bcdbd1
272
src/Menus.cpp
272
src/Menus.cpp
@ -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;
|
||||
|
@ -141,6 +141,8 @@ void OnPlaySpeedDec();
|
||||
|
||||
// Moving track focus commands
|
||||
|
||||
void OnPrevTrack( bool shift );
|
||||
void OnNextTrack( bool shift );
|
||||
void OnCursorUp();
|
||||
void OnCursorDown();
|
||||
void OnFirstTrack();
|
||||
|
@ -1316,6 +1316,9 @@ void AudacityProject::UpdatePrefs()
|
||||
|
||||
SetProjectTitle();
|
||||
|
||||
gPrefs->Read(wxT("/GUI/CircularTrackNavigation"), &mCircularTrackNavigation,
|
||||
false);
|
||||
|
||||
if (mTrackPanel) {
|
||||
mTrackPanel->UpdatePrefs();
|
||||
}
|
||||
|
@ -638,6 +638,7 @@ private:
|
||||
wxPanel *mTopPanel{};
|
||||
TrackPanel *mTrackPanel{};
|
||||
SelectionState mSelectionState{};
|
||||
bool mCircularTrackNavigation{};
|
||||
std::unique_ptr<TrackFactory> mTrackFactory{};
|
||||
wxPanel * mMainPanel;
|
||||
wxScrollBar *mHsbar;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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?
|
||||
|
Loading…
x
Reference in New Issue
Block a user