From 3ec8989265442180951ca36b8103ea25b9a650c6 Mon Sep 17 00:00:00 2001 From: lllucius Date: Wed, 23 Oct 2013 20:14:09 +0000 Subject: [PATCH] Bug 510 - undo can change which tracks are selected, and focus Must more extensive review of saving state Try this one David. I reviewed all actions in Menus.cpp and have added state saving where it seemed to be missing. I had no idea it would be so many (22). And that was only reviewing Menus.cpp. I believe that will get them all since all keyboard actions are tied to a menu or command action and they all go through Menus.cpp. (I still have a few to review in TrackPanel.cpp though) --- src/Menus.cpp | 10 ++++++++++ src/Project.cpp | 2 ++ src/TrackPanel.cpp | 15 +++++++++++++++ src/UndoManager.cpp | 4 ++++ 4 files changed, 31 insertions(+) diff --git a/src/Menus.cpp b/src/Menus.cpp index 01c6f1112..67545bcc1 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -1923,6 +1923,7 @@ void AudacityProject::OnPlayStopSelect() if( mViewInfo.sel1 < mViewInfo.sel0 ) { mViewInfo.sel1 = mViewInfo.sel0; } + ModifyState(); toolbar->OnStop(evt); } else if (!gAudioIO->IsBusy()) { @@ -2114,6 +2115,7 @@ void AudacityProject::OnSkipStart() wxCommandEvent evt; GetControlToolBar()->OnRewind(evt); + ModifyState(); } void AudacityProject::OnSkipEnd() @@ -2121,6 +2123,7 @@ void AudacityProject::OnSkipEnd() wxCommandEvent evt; GetControlToolBar()->OnFF(evt); + ModifyState(); } void AudacityProject::OnSeekLeftShort() @@ -4245,14 +4248,19 @@ void AudacityProject::OnSelectStartCursor() void AudacityProject::OnSelectSyncLockSel() { + bool selected = false; TrackListIterator iter(mTracks); for (Track *t = iter.First(); t; t = iter.Next()) { if (t->IsSyncLockSelected()) { t->SetSelected(true); + selected = true; } } + if (selected) + ModifyState(); + mTrackPanel->Refresh(false); if (mMixerBoard) mMixerBoard->Refresh(false); @@ -4265,6 +4273,8 @@ void AudacityProject::OnSelectAllTracks() t->SetSelected(true); } + ModifyState(); + mTrackPanel->Refresh(false); if (mMixerBoard) mMixerBoard->Refresh(false); diff --git a/src/Project.cpp b/src/Project.cpp index 973c73ab6..d2b40dcf4 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -4631,6 +4631,7 @@ void AudacityProject::HandleTrackMute(Track *t, const bool exclusive) } } } + ModifyState(); } // Type of solo (standard or simple) follows the set preference, unless @@ -4689,5 +4690,6 @@ void AudacityProject::HandleTrackSolo(Track *t, const bool alternate) i = iter.Next(); } } + ModifyState(); } diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 4fc6e305c..a44c4f79e 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -6259,6 +6259,7 @@ void TrackPanel::OnPrevTrack( bool shift ) t = iter.Last(); SetFocusedTrack( t ); EnsureVisible( t ); + MakeParentModifyState(); return; } @@ -6292,6 +6293,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( t, false ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); + MakeParentModifyState(); return; } if( tSelected && !pSelected ) @@ -6299,6 +6301,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( p, true ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); + MakeParentModifyState(); return; } if( !tSelected && pSelected ) @@ -6306,6 +6309,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( p, false ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); + MakeParentModifyState(); return; } if( !tSelected && !pSelected ) @@ -6313,6 +6317,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( t, true ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); + MakeParentModifyState(); return; } } @@ -6331,6 +6336,7 @@ void TrackPanel::OnPrevTrack( bool shift ) } SetFocusedTrack( p ); // Wrap to the first track EnsureVisible( p ); + MakeParentModifyState(); return; } else @@ -6343,6 +6349,7 @@ void TrackPanel::OnPrevTrack( bool shift ) { SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); + MakeParentModifyState(); return; } } @@ -6364,6 +6371,7 @@ void TrackPanel::OnNextTrack( bool shift ) t = iter.First(); SetFocusedTrack( t ); EnsureVisible( t ); + MakeParentModifyState(); return; } @@ -6391,6 +6399,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( t, false ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); + MakeParentModifyState(); return; } if( tSelected && !nSelected ) @@ -6398,6 +6407,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( n, true ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); + MakeParentModifyState(); return; } if( !tSelected && nSelected ) @@ -6405,6 +6415,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( n, false ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); + MakeParentModifyState(); return; } if( !tSelected && !nSelected ) @@ -6412,6 +6423,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( t, true ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); + MakeParentModifyState(); return; } } @@ -6427,6 +6439,7 @@ void TrackPanel::OnNextTrack( bool shift ) n = iter.First(); SetFocusedTrack( n ); // Wrap to the first track EnsureVisible( n ); + MakeParentModifyState(); return; } else @@ -6439,6 +6452,7 @@ void TrackPanel::OnNextTrack( bool shift ) { SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); + MakeParentModifyState(); return; } } @@ -6454,6 +6468,7 @@ void TrackPanel::OnToggle() mTracks->Select( t, !t->GetSelected() ); EnsureVisible( t ); + MakeParentModifyState(); mAx->Updated(); diff --git a/src/UndoManager.cpp b/src/UndoManager.cpp index 387df6743..e0a0c67e5 100644 --- a/src/UndoManager.cpp +++ b/src/UndoManager.cpp @@ -186,6 +186,10 @@ bool UndoManager::RedoAvailable() void UndoManager::ModifyState(TrackList * l, double sel0, double sel1) { + if (current == wxNOT_FOUND) { + return; + } + SonifyBeginModifyState(); // Delete current stack[current]->tracks->Clear(true);