From 65e4f56126f66587826c77868a11569f867d8b25 Mon Sep 17 00:00:00 2001 From: martynshaw99 Date: Mon, 30 Dec 2013 00:41:18 +0000 Subject: [PATCH] Norm's patch to improve selection speed on large projects by reducing the number of unnecessary auto-saves. Maybe vertical zooming should also not trigger an auto-save? --- src/Menus.cpp | 50 +++++++++++++++++------------------ src/Project.cpp | 15 ++++++----- src/Project.h | 6 +++-- src/TrackPanel.cpp | 66 +++++++++++++++++++++++----------------------- src/TrackPanel.h | 7 ++--- 5 files changed, 74 insertions(+), 70 deletions(-) diff --git a/src/Menus.cpp b/src/Menus.cpp index 829cd3534..9feb7b3a9 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -1922,7 +1922,7 @@ void AudacityProject::OnPlayStopSelect() if( mViewInfo.sel1 < mViewInfo.sel0 ) { mViewInfo.sel1 = mViewInfo.sel0; } - ModifyState(); + ModifyState(false); // without bWantsAutoSave toolbar->OnStop(evt); } else if (!gAudioIO->IsBusy()) { @@ -1945,7 +1945,7 @@ void AudacityProject::OnStopSelect() mViewInfo.sel1 = mViewInfo.sel0; } GetControlToolBar()->OnStop(evt); - ModifyState(); + ModifyState(false); // without bWantsAutoSave } } @@ -2114,7 +2114,7 @@ void AudacityProject::OnSkipStart() wxCommandEvent evt; GetControlToolBar()->OnRewind(evt); - ModifyState(); + ModifyState(false); } void AudacityProject::OnSkipEnd() @@ -2122,7 +2122,7 @@ void AudacityProject::OnSkipEnd() wxCommandEvent evt; GetControlToolBar()->OnFF(evt); - ModifyState(); + ModifyState(false); } void AudacityProject::OnSeekLeftShort() @@ -2148,13 +2148,13 @@ void AudacityProject::OnSeekRightLong() void AudacityProject::OnSelToStart() { Rewind(true); - ModifyState(); + ModifyState(false); } void AudacityProject::OnSelToEnd() { SkipEnd(true); - ModifyState(); + ModifyState(false); } void AudacityProject::OnCursorUp() @@ -2281,7 +2281,7 @@ void AudacityProject::OnSetLeftSelection() if (bSelChanged) { - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); } } @@ -2323,7 +2323,7 @@ void AudacityProject::OnSetRightSelection() if (bSelChanged) { - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); } } @@ -2642,7 +2642,7 @@ void AudacityProject::OnZeroCrossing() mViewInfo.sel1 = mViewInfo.sel0; } - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); } @@ -4174,7 +4174,7 @@ void AudacityProject::OnSelectAll() mViewInfo.sel0 = mTracks->GetMinOffset(); mViewInfo.sel1 = mTracks->GetEndTime(); - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); if (mMixerBoard) @@ -4185,7 +4185,7 @@ void AudacityProject::OnSelectNone() { this->SelectNone(); mViewInfo.sel1 = mViewInfo.sel0; - ModifyState(); + ModifyState(false); } void AudacityProject::OnSelectCursorEnd() @@ -4206,7 +4206,7 @@ void AudacityProject::OnSelectCursorEnd() mViewInfo.sel1 = maxEndOffset; - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); } @@ -4229,7 +4229,7 @@ void AudacityProject::OnSelectStartCursor() mViewInfo.sel0 = minOffset; - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); } @@ -4247,7 +4247,7 @@ void AudacityProject::OnSelectSyncLockSel() } if (selected) - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); if (mMixerBoard) @@ -4261,7 +4261,7 @@ void AudacityProject::OnSelectAllTracks() t->SetSelected(true); } - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); if (mMixerBoard) @@ -4447,7 +4447,7 @@ void AudacityProject::OnZoomFitV() mVsbar->SetThumbPosition(0); RedrawProject(); - ModifyState(); + ModifyState(true); } void AudacityProject::OnZoomSel() @@ -4867,7 +4867,7 @@ void AudacityProject::OnSelectionRestore() mViewInfo.sel0 = mSel0save; mViewInfo.sel1 = mSel1save; - ModifyState(); + ModifyState(false); mTrackPanel->Refresh(false); } @@ -4891,7 +4891,7 @@ void AudacityProject::OnCursorTrackStart() if (minOffset < 0.0) minOffset = 0.0; mViewInfo.sel0 = minOffset; mViewInfo.sel1 = minOffset; - ModifyState(); + ModifyState(false); mTrackPanel->ScrollIntoView(mViewInfo.sel0); mTrackPanel->Refresh(false); } @@ -4916,7 +4916,7 @@ void AudacityProject::OnCursorTrackEnd() mViewInfo.sel0 = maxEndOffset; mViewInfo.sel1 = maxEndOffset; - ModifyState(); + ModifyState(false); mTrackPanel->ScrollIntoView(mViewInfo.sel1); mTrackPanel->Refresh(false); } @@ -4924,7 +4924,7 @@ void AudacityProject::OnCursorTrackEnd() void AudacityProject::OnCursorSelStart() { mViewInfo.sel1 = mViewInfo.sel0; - ModifyState(); + ModifyState(false); mTrackPanel->ScrollIntoView(mViewInfo.sel0); mTrackPanel->Refresh(false); } @@ -4932,7 +4932,7 @@ void AudacityProject::OnCursorSelStart() void AudacityProject::OnCursorSelEnd() { mViewInfo.sel0 = mViewInfo.sel1; - ModifyState(); + ModifyState(false); mTrackPanel->ScrollIntoView(mViewInfo.sel1); mTrackPanel->Refresh(false); } @@ -5791,7 +5791,7 @@ void AudacityProject::OnCollapseAllTracks() t = iter.Next(); } - ModifyState(); + ModifyState(true); RedrawProject(); } @@ -5806,7 +5806,7 @@ void AudacityProject::OnExpandAllTracks() t = iter.Next(); } - ModifyState(); + ModifyState(true); RedrawProject(); } @@ -5822,7 +5822,7 @@ void AudacityProject::OnMuteAllTracks() t = iter.Next(); } - ModifyState(); + ModifyState(true); RedrawProject(); if (mMixerBoard) mMixerBoard->UpdateMute(); @@ -5839,7 +5839,7 @@ void AudacityProject::OnUnMuteAllTracks() t = iter.Next(); } - ModifyState(); + ModifyState(true); RedrawProject(); if (mMixerBoard) mMixerBoard->UpdateMute(); diff --git a/src/Project.cpp b/src/Project.cpp index 73bcb59af..47ee3d310 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -1235,7 +1235,7 @@ void AudacityProject::AS_ModifySelection(double &start, double &end, bool done) mViewInfo.sel1 = end; mTrackPanel->Refresh(false); if (done) { - ModifyState(); + ModifyState(false); } } @@ -3706,10 +3706,11 @@ void AudacityProject::PushState(wxString desc, AutoSave(); } -void AudacityProject::ModifyState() +void AudacityProject::ModifyState(bool bWantsAutoSave) { mUndoManager.ModifyState(mTracks, mViewInfo.sel0, mViewInfo.sel1); - AutoSave(); + if (bWantsAutoSave) + AutoSave(); } // LL: Is there a memory leak here as "l" and "t" are not deleted??? @@ -4381,9 +4382,9 @@ void AudacityProject::TP_PushState(wxString desc, wxString shortDesc, } // TrackPanel callback method -void AudacityProject::TP_ModifyState() +void AudacityProject::TP_ModifyState(bool bWantsAutoSave) { - ModifyState(); + ModifyState(bWantsAutoSave); } // TrackPanel callback method @@ -4685,7 +4686,7 @@ void AudacityProject::HandleTrackMute(Track *t, const bool exclusive) } } } - ModifyState(); + ModifyState(true); } // Type of solo (standard or simple) follows the set preference, unless @@ -4744,6 +4745,6 @@ void AudacityProject::HandleTrackSolo(Track *t, const bool alternate) i = iter.Next(); } } - ModifyState(); + ModifyState(true); } diff --git a/src/Project.h b/src/Project.h index 3076d33d3..5878b8f44 100644 --- a/src/Project.h +++ b/src/Project.h @@ -339,7 +339,8 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame, virtual void TP_OnPlayKey(); virtual void TP_PushState(wxString longDesc, wxString shortDesc, int flags); - virtual void TP_ModifyState(); + virtual void TP_ModifyState(bool bWantsAutoSave); // if true, writes auto-save file. Should set only if you really want the state change restored after + // a crash, as it can take many seconds for large (eg. 10 track-hours) projects virtual void TP_RedrawScrollbars(); virtual void TP_ScrollLeft(); virtual void TP_ScrollRight(); @@ -410,7 +411,8 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame, void ClearClipboard(); void InitialState(); - void ModifyState(); + void ModifyState(bool bWantsAutoSave); // if true, writes auto-save file. Should set only if you really want the state change restored after + // a crash, as it can take many seconds for large (eg. 10 track-hours) projects void PopState(TrackList * l); void UpdateLyrics(); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 99e558aab..d608ba06d 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1416,9 +1416,9 @@ void TrackPanel::MakeParentPushState(wxString desc, wxString shortDesc, mListener->TP_PushState(desc, shortDesc, flags); } -void TrackPanel::MakeParentModifyState() +void TrackPanel::MakeParentModifyState(bool bWantsAutoSave) { - mListener->TP_ModifyState(); + mListener->TP_ModifyState(bWantsAutoSave); } void TrackPanel::MakeParentRedrawScrollbars() @@ -1858,7 +1858,7 @@ void TrackPanel::HandleSelect(wxMouseEvent & event) SetCapturedTrack( NULL ); //Send the new selection state to the undo/redo stack: - MakeParentModifyState(); + MakeParentModifyState(false); } else if (event.LeftDClick() && !event.ShiftDown()) { if (!mCapturedTrack) { @@ -1898,7 +1898,7 @@ void TrackPanel::HandleSelect(wxMouseEvent & event) Refresh(false); SetCapturedTrack( NULL ); - MakeParentModifyState(); + MakeParentModifyState(false); } done: SelectionHandleDrag(event, t); @@ -1983,7 +1983,7 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event, // If the shift button is down, extend the current selection. ExtendSelection(event.m_x, r.x, pTrack); - MakeParentModifyState(); + MakeParentModifyState(false); return; } @@ -2197,7 +2197,7 @@ void TrackPanel::StartSelection(int mouseXCoordinate, int trackLeftEdge) mViewInfo->sel1 = s; SonifyBeginModifyState(); - MakeParentModifyState(); + MakeParentModifyState(false); SonifyEndModifyState(); } @@ -3392,7 +3392,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) mZoomEnd = mZoomStart = 0; Refresh(false); mCapturedTrack = NULL; - MakeParentModifyState(); + MakeParentModifyState(true); return; } #endif @@ -3640,7 +3640,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) UpdateVRuler(mCapturedTrack); Refresh(false); mCapturedTrack = NULL; - MakeParentModifyState(); + MakeParentModifyState(true); } /// Determines if we can edit samples in a wave track. @@ -4161,7 +4161,7 @@ void TrackPanel::HandleMinimizing(wxMouseEvent & event) if (mTracks->GetLink(t)) mTracks->GetLink(t)->SetMinimized(t->GetMinimized()); MakeParentRedrawScrollbars(); - MakeParentModifyState(); + MakeParentModifyState(true); } SetCapturedTrack(NULL); @@ -4424,7 +4424,7 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event) pMixerBoard->RefreshTrackClusters(); if (!unsafe) - MakeParentModifyState(); + MakeParentModifyState(true); } /// The user is dragging one of the tracks: change the track order @@ -4717,7 +4717,7 @@ void TrackPanel::HandleResizeButtonUp(wxMouseEvent & WXUNUSED(event)) { SetCapturedTrack( NULL ); MakeParentRedrawScrollbars(); - MakeParentModifyState(); //v Probably doesn't really warrant AutoSave. Maybe add bWantAutoSave param if there are more. + MakeParentModifyState(false); } /// Resize dragging means that the mouse button IS down and has moved @@ -6291,7 +6291,7 @@ void TrackPanel::OnPrevTrack( bool shift ) t = iter.Last(); SetFocusedTrack( t ); EnsureVisible( t ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } @@ -6325,7 +6325,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( t, false ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } if( tSelected && !pSelected ) @@ -6333,7 +6333,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( p, true ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } if( !tSelected && pSelected ) @@ -6341,7 +6341,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( p, false ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } if( !tSelected && !pSelected ) @@ -6349,7 +6349,7 @@ void TrackPanel::OnPrevTrack( bool shift ) mTracks->Select( t, true ); SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } } @@ -6368,7 +6368,7 @@ void TrackPanel::OnPrevTrack( bool shift ) } SetFocusedTrack( p ); // Wrap to the first track EnsureVisible( p ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } else @@ -6381,7 +6381,7 @@ void TrackPanel::OnPrevTrack( bool shift ) { SetFocusedTrack( p ); // move focus to next track down EnsureVisible( p ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } } @@ -6403,7 +6403,7 @@ void TrackPanel::OnNextTrack( bool shift ) t = iter.First(); SetFocusedTrack( t ); EnsureVisible( t ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } @@ -6431,7 +6431,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( t, false ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } if( tSelected && !nSelected ) @@ -6439,7 +6439,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( n, true ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } if( !tSelected && nSelected ) @@ -6447,7 +6447,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( n, false ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } if( !tSelected && !nSelected ) @@ -6455,7 +6455,7 @@ void TrackPanel::OnNextTrack( bool shift ) mTracks->Select( t, true ); SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } } @@ -6471,7 +6471,7 @@ void TrackPanel::OnNextTrack( bool shift ) n = iter.First(); SetFocusedTrack( n ); // Wrap to the first track EnsureVisible( n ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } else @@ -6484,7 +6484,7 @@ void TrackPanel::OnNextTrack( bool shift ) { SetFocusedTrack( n ); // move focus to next track down EnsureVisible( n ); - MakeParentModifyState(); + MakeParentModifyState(false); return; } } @@ -6500,7 +6500,7 @@ void TrackPanel::OnToggle() mTracks->Select( t, !t->GetSelected() ); EnsureVisible( t ); - MakeParentModifyState(); + MakeParentModifyState(false); mAx->Updated(); @@ -6536,7 +6536,7 @@ void TrackPanel::OnCursorLeft( bool shift, bool ctrl, bool keyup ) return; } - MakeParentModifyState(); + MakeParentModifyState(false); return; } @@ -6650,7 +6650,7 @@ void TrackPanel::OnCursorRight( bool shift, bool ctrl, bool keyup ) return; } - MakeParentModifyState(); + MakeParentModifyState(false); return; } @@ -6812,7 +6812,7 @@ void TrackPanel::OnBoundaryMove(bool left, bool boundaryContract) mViewInfo->sel1 = indicator; } - MakeParentModifyState(); + MakeParentModifyState(false); Refresh(false); } else @@ -6869,7 +6869,7 @@ void TrackPanel::OnBoundaryMove(bool left, bool boundaryContract) } } Refresh( false ); - MakeParentModifyState(); + MakeParentModifyState(false); } } @@ -6943,7 +6943,7 @@ void TrackPanel::OnCursorMove(bool forward, bool jump, bool longjump ) // Make sure it's visible ScrollIntoView( mViewInfo->sel0 ); - MakeParentModifyState(); + MakeParentModifyState(false); } } @@ -7574,7 +7574,7 @@ void TrackPanel::OnSetDisplay(wxCommandEvent & event) #endif UpdateVRuler(wt); } - MakeParentModifyState(); //v Doesn't really warrant AutoSave. Maybe add bWantAutoSave param if there are more. + MakeParentModifyState(true); mPopupMenuTarget = NULL; Refresh(false); } @@ -7931,7 +7931,7 @@ void TrackPanel::OnChangeOctave(wxCommandEvent & event) bool bDown = (OnDownOctaveID == event.GetId()); t->SetBottomNote(t->GetBottomNote() + ((bDown) ? -12 : 12)); - MakeParentModifyState(); + MakeParentModifyState(true); Refresh(false); #endif } diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 88117d2f5..5abc164e7 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -70,7 +70,8 @@ class AUDACITY_DLL_API TrackPanelListener { virtual void TP_OnPlayKey() = 0; virtual void TP_PushState(wxString shortDesc, wxString longDesc, int flags = PUSH_AUTOSAVE | PUSH_CALC_SPACE) = 0; - virtual void TP_ModifyState() = 0; + virtual void TP_ModifyState(bool bWantsAutoSave) = 0; // if true, writes auto-save file. Should set only if you really want the state change restored after + // a crash, as it can take many seconds for large (eg. 10 track-hours) projects virtual void TP_RedrawScrollbars() = 0; virtual void TP_ScrollLeft() = 0; virtual void TP_ScrollRight() = 0; @@ -426,8 +427,8 @@ class AUDACITY_DLL_API TrackPanel:public wxPanel { // AS: Pushing the state preserves state for Undo operations. virtual void MakeParentPushState(wxString desc, wxString shortDesc, int flags = PUSH_AUTOSAVE | PUSH_CALC_SPACE); - virtual void MakeParentModifyState(); - + virtual void MakeParentModifyState(bool bWantsAutoSave); // if true, writes auto-save file. Should set only if you really want the state change restored after + // a crash, as it can take many seconds for large (eg. 10 track-hours) projects virtual void MakeParentResize(); virtual void OnSetName(wxCommandEvent &event);