diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp index b5354e9b7..a2649b644 100644 --- a/src/MixerBoard.cpp +++ b/src/MixerBoard.cpp @@ -318,7 +318,7 @@ void MixerTrackCluster::HandleSliderGain(const bool bWantPushState /*= false*/) mProject->RefreshTPTrack(mTrack); if (bWantPushState) - mProject->TP_PushState(_("Moved gain slider"), _("Gain"), true /* consolidate */); + mProject->TP_PushState(_("Moved gain slider"), _("Gain"), PUSH_CONSOLIDATE ); } void MixerTrackCluster::HandleSliderPan(const bool bWantPushState /*= false*/) @@ -333,7 +333,7 @@ void MixerTrackCluster::HandleSliderPan(const bool bWantPushState /*= false*/) mProject->RefreshTPTrack(mTrack); if (bWantPushState) - mProject->TP_PushState(_("Moved pan slider"), _("Pan"), true /* consolidate */); + mProject->TP_PushState(_("Moved pan slider"), _("Pan"), PUSH_CONSOLIDATE ); } void MixerTrackCluster::ResetMeter(const bool bResetClipping) diff --git a/src/Project.cpp b/src/Project.cpp index a0c23641c..b6147c621 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -3579,10 +3579,10 @@ void AudacityProject::InitialState() void AudacityProject::PushState(wxString desc, wxString shortDesc, - bool consolidate) + int flags ) { mUndoManager.PushState(mTracks, mViewInfo.sel0, mViewInfo.sel1, - desc, shortDesc, consolidate); + desc, shortDesc, flags); mDirty = true; @@ -3606,8 +3606,8 @@ void AudacityProject::PushState(wxString desc, if (GetTracksFitVerticallyZoomed()) this->DoZoomFitV(); - - AutoSave(); + if( (flags & PUSH_AUTOSAVE)!= 0) + AutoSave(); } void AudacityProject::ModifyState() @@ -3685,17 +3685,16 @@ void AudacityProject::SetStateTo(unsigned int n) void AudacityProject::UpdateLyrics() { + // JKC: Previously we created a lyrics window, + // if it did not exist. But we don't need to. + if (!mLyricsWindow) + return; + TrackListOfKindIterator iter(Track::Label, mTracks); LabelTrack* pLabelTrack = (LabelTrack*)(iter.First()); // Lyrics come from only the first label track. if (!pLabelTrack) return; - if (!mLyricsWindow) - { - mLyricsWindow = new LyricsWindow(this); - mLyricsWindow->Show(false); // Don't show it. Need to update content regardless. - } - // The code that updates the lyrics is rather expensive when there // are a lot of labels. // So - bail out early if the lyrics window is not visible. @@ -4275,9 +4274,9 @@ void AudacityProject::TP_OnPlayKey() // TrackPanel callback method void AudacityProject::TP_PushState(wxString desc, wxString shortDesc, - bool consolidate) + int flags) { - PushState(desc, shortDesc, consolidate); + PushState(desc, shortDesc, flags); } // TrackPanel callback method @@ -4336,6 +4335,7 @@ void AudacityProject::ReleaseKeyboard(wxWindow *w) void AudacityProject::AutoSave() { + return; // To minimize the possibility of race conditions, we first write to a // file with the extension ".tmp", then rename the file to .autosave SonifyBeginAutoSave(); diff --git a/src/Project.h b/src/Project.h index d08b736b1..ff1da3bd0 100644 --- a/src/Project.h +++ b/src/Project.h @@ -334,7 +334,7 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame, virtual void TP_OnPlayKey(); virtual void TP_PushState(wxString longDesc, wxString shortDesc, - bool consolidate); + int flags); virtual void TP_ModifyState(); virtual void TP_RedrawScrollbars(); virtual void TP_ScrollLeft(); @@ -397,7 +397,7 @@ class AUDACITY_DLL_API AudacityProject: public wxFrame, static void AllProjectsDeleteUnlock(); void PushState(wxString desc, wxString shortDesc, - bool consolidate = false); + int flags = PUSH_AUTOSAVE | PUSH_CALC_SPACE); private: diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 8c28e13fe..6b250e292 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1329,9 +1329,9 @@ void TrackPanel::OnPaint(wxPaintEvent & /* event */) /// Makes our Parent (well, whoever is listening to us) push their state. /// this causes application state to be preserved on a stack for undo ops. void TrackPanel::MakeParentPushState(wxString desc, wxString shortDesc, - bool consolidate) + int flags) { - mListener->TP_PushState(desc, shortDesc, consolidate); + mListener->TP_PushState(desc, shortDesc, flags); } void TrackPanel::MakeParentModifyState() @@ -1963,7 +1963,7 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event, &mViewInfo->sel0, &mViewInfo->sel1)) { MakeParentPushState(_("Modified Label"), _("Label Edit"), - true /* consolidate */); + PUSH_CONSOLIDATE); } // IF the user clicked a label, THEN select all other tracks by Label @@ -2036,7 +2036,7 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event, mStretching = true; mStretched = false; - MakeParentPushState(_("Stretch Note Track"), _("Stretch"), false); + MakeParentPushState(_("Stretch Note Track"), _("Stretch")); // Full refresh since the label area may need to indicate // newly selected tracks. (I'm really not sure if the label area @@ -2263,7 +2263,8 @@ void TrackPanel::Stretch(int mouseXCoordinate, int trackLeftEdge, wxASSERT(false); break; } - MakeParentPushState(_("Stretch Note Track"), _("Stretch"), true); + MakeParentPushState(_("Stretch Note Track"), _("Stretch"), + PUSH_CONSOLIDATE | PUSH_AUTOSAVE | PUSH_CALC_SPACE); mStretched = true; Refresh(false); } @@ -2397,8 +2398,7 @@ void TrackPanel::HandleEnvelope(wxMouseEvent & event) mCapturedTrack = NULL; MakeParentPushState( _("Adjusted envelope."), - _("Envelope"), - false /* do not consolidate these actions */ + _("Envelope") ); } } @@ -2557,7 +2557,8 @@ void TrackPanel::HandleSlide(wxMouseEvent & event) direction.c_str(), fabs(mHSlideAmount)); consolidate = true; } - MakeParentPushState(msg, _("Time-Shift"), consolidate); + MakeParentPushState(msg, _("Time-Shift"), + consolidate ? (PUSH_CONSOLIDATE) : (PUSH_AUTOSAVE|PUSH_CALC_SPACE)); } } @@ -3778,7 +3779,7 @@ void TrackPanel::HandleSampleEditingButtonUp( wxMouseEvent & event ) mDrawingTrack=NULL; //Set this to NULL so it will catch improper drag events. MakeParentPushState(_("Moved Sample"), _("Sample Edit"), - true /* consolidate */); + PUSH_CONSOLIDATE|PUSH_AUTOSAVE|PUSH_CALC_SPACE); } @@ -4052,7 +4053,7 @@ void TrackPanel::HandleSliders(wxMouseEvent &event, bool pan) #endif MakeParentPushState(pan ? _("Moved pan slider") : _("Moved gain slider"), pan ? _("Pan") : _("Gain"), - true /* consolidate */); + PUSH_CONSOLIDATE); #ifdef EXPERIMENTAL_MIDI_OUT } else { MakeParentPushState(_("Moved velocity slider"), _("Velocity"), true); @@ -4661,7 +4662,7 @@ void TrackPanel::OnKeyDown(wxKeyEvent & event) if (lt->OnKeyDown(mViewInfo->sel0, mViewInfo->sel1, event)) MakeParentPushState(_("Modified Label"), _("Label Edit"), - true /* consolidate */); + PUSH_CONSOLIDATE); // Make sure caret is in view int x; @@ -4699,7 +4700,7 @@ void TrackPanel::OnChar(wxKeyEvent & event) if (((LabelTrack *)t)->OnChar(mViewInfo->sel0, mViewInfo->sel1, event)) MakeParentPushState(_("Modified Label"), _("Label Edit"), - true /* consolidate */); + PUSH_CONSOLIDATE); // If selection modified, refresh // Otherwise, refresh track display if the keystroke was handled @@ -4865,7 +4866,7 @@ bool TrackPanel::HandleTrackLocationMouseEvent(WaveTrack * track, wxRect &r, wxM mViewInfo->sel0 = cutlineStart; mViewInfo->sel1 = cutlineEnd; DisplaySelection(); - MakeParentPushState(_("Expanded Cut Line"), _("Expand"), false ); + MakeParentPushState(_("Expanded Cut Line"), _("Expand")); handled = true; } } else if (mCapturedTrackLocation.typ == WaveTrack::locationMergePoint) @@ -4874,7 +4875,7 @@ bool TrackPanel::HandleTrackLocationMouseEvent(WaveTrack * track, wxRect &r, wxM WaveTrack* linked = (WaveTrack*)mTracks->GetLink(track); if (linked) linked->MergeClips(mCapturedTrackLocation.clipidx1, mCapturedTrackLocation.clipidx2); - MakeParentPushState(_("Merged Clips"),_("Merge"), true ); + MakeParentPushState(_("Merged Clips"),_("Merge"), PUSH_CONSOLIDATE|PUSH_CALC_SPACE); handled = true; } } @@ -4885,7 +4886,7 @@ bool TrackPanel::HandleTrackLocationMouseEvent(WaveTrack * track, wxRect &r, wxM WaveTrack* linked = (WaveTrack*)mTracks->GetLink(track); if (linked) linked->RemoveCutLine(mCapturedTrackLocation.pos); - MakeParentPushState(_("Removed Cut Line"), _("Remove"), false ); + MakeParentPushState(_("Removed Cut Line"), _("Remove") ); handled = true; } @@ -4966,7 +4967,7 @@ bool TrackPanel::HandleLabelTrackMouseEvent(LabelTrack * lTrack, wxRect &r, wxMo MakeParentPushState(_("Modified Label"), _("Label Edit"), - true /* consolidate */); + PUSH_CONSOLIDATE); } @@ -6542,7 +6543,7 @@ void TrackPanel::SetTrackPan(Track * t, LWSlider * s) if (link) link->SetPan(newValue); - MakeParentPushState(_("Adjusted Pan"), _("Pan"), true ); + MakeParentPushState(_("Adjusted Pan"), _("Pan"), PUSH_CONSOLIDATE ); RefreshTrack(t); } @@ -6596,7 +6597,7 @@ void TrackPanel::SetTrackGain(Track * t, LWSlider * s) if (link) link->SetGain(newValue); - MakeParentPushState(_("Adjusted gain"), _("Gain"), true ); + MakeParentPushState(_("Adjusted gain"), _("Gain"), PUSH_CONSOLIDATE); RefreshTrack(t); } @@ -7330,7 +7331,7 @@ void TrackPanel::OnCutSelectedText(wxCommandEvent &event) if (lt->CutSelectedText()) { MakeParentPushState(_("Modified Label"), _("Label Edit"), - true /* consolidate */); + PUSH_CONSOLIDATE); } RefreshTrack(lt); } diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 685393702..fd917ff0b 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -67,7 +67,7 @@ class AUDACITY_DLL_API TrackPanelListener { virtual void TP_OnPlayKey() = 0; virtual void TP_PushState(wxString shortDesc, wxString longDesc, - bool consolidate = false) = 0; + int flags = PUSH_AUTOSAVE | PUSH_CALC_SPACE) = 0; virtual void TP_ModifyState() = 0; virtual void TP_RedrawScrollbars() = 0; virtual void TP_ScrollLeft() = 0; @@ -395,7 +395,7 @@ class TrackPanel:public wxPanel { // AS: Pushing the state preserves state for Undo operations. void MakeParentPushState(wxString desc, wxString shortDesc, - bool consolidate = false); + int flags = PUSH_AUTOSAVE | PUSH_CALC_SPACE); void MakeParentModifyState(); void MakeParentResize(); diff --git a/src/UndoManager.cpp b/src/UndoManager.cpp index 64e4c8ff3..9d1fe27ad 100644 --- a/src/UndoManager.cpp +++ b/src/UndoManager.cpp @@ -210,13 +210,12 @@ void UndoManager::ModifyState(TrackList * l, double sel0, double sel1) void UndoManager::PushState(TrackList * l, double sel0, double sel1, wxString longDescription, wxString shortDescription, - bool consolidate) + int flags) { unsigned int i; // If consolidate is set to true, group up to 3 identical operations. - - if (consolidate && lastAction == longDescription && + if (((flags&PUSH_CONSOLIDATE)!=0) && lastAction == longDescription && consolidationCount < 2) { consolidationCount++; ModifyState(l, sel0, sel1); @@ -253,7 +252,8 @@ void UndoManager::PushState(TrackList * l, double sel0, double sel1, stack.Add(push); current++; - push->spaceUsage = this->CalculateSpaceUsage(current); + if( (flags&PUSH_CALC_SPACE)!=0) + push->spaceUsage = this->CalculateSpaceUsage(current); if (saved >= current) { saved = -1; diff --git a/src/UndoManager.h b/src/UndoManager.h index f200ed974..a5d3f84d1 100644 --- a/src/UndoManager.h +++ b/src/UndoManager.h @@ -66,6 +66,14 @@ struct UndoStackElem { WX_DEFINE_USER_EXPORTED_ARRAY(UndoStackElem *, UndoStack, class AUDACITY_DLL_API); +// These flags control what extra to do on a PushState +// Default is PUSH_AUTOSAVE | PUSH_CALC_SPACE +// Frequent/faster actions use PUSH_CONSOLIDATE +const int PUSH_MINIMAL = 0; +const int PUSH_CONSOLIDATE = 1; +const int PUSH_CALC_SPACE = 2; +const int PUSH_AUTOSAVE = 4; + class AUDACITY_DLL_API UndoManager { public: UndoManager(); @@ -73,7 +81,7 @@ class AUDACITY_DLL_API UndoManager { void PushState(TrackList * l, double sel0, double sel1, wxString longDescription, wxString shortDescription, - bool consolidate = false); + int flags = PUSH_CALC_SPACE|PUSH_AUTOSAVE ); void ModifyState(TrackList * l, double sel0, double sel1); void ClearStates(); void RemoveStates(int num); // removes the 'num' oldest states diff --git a/src/prefs/PrefsDialog.cpp b/src/prefs/PrefsDialog.cpp index 16092239e..e05b5d793 100644 --- a/src/prefs/PrefsDialog.cpp +++ b/src/prefs/PrefsDialog.cpp @@ -71,6 +71,36 @@ BEGIN_EVENT_TABLE(PrefsDialog, wxDialog) EVT_TREE_KEY_DOWN(wxID_ANY, PrefsDialog::OnTreeKeyDown) // Handles key events when tree has focus END_EVENT_TABLE() + +class wxTreebookExt : public wxTreebook +{ +public: + wxTreebookExt( wxWindow *parent, + wxWindowID id) : wxTreebook( parent, id ) + {;}; + ~wxTreebookExt(){;}; + virtual int ChangeSelection(size_t n); + virtual int SetSelection(size_t n); +}; + + +int wxTreebookExt::ChangeSelection(size_t n) { + int i = wxTreebook::ChangeSelection(n); + wxString Temp = GetPageText( n ); + ((wxDialog*)GetParent())->SetTitle( Temp ); + return i; +}; + +int wxTreebookExt::SetSelection(size_t n) +{ + int i = wxTreebook::SetSelection(n); + wxString Temp = wxString(wxT("Preferences: ")) + GetPageText( n ); + ((wxDialog*)GetParent())->SetTitle( Temp ); + return i; +} + + + PrefsDialog::PrefsDialog(wxWindow * parent) : wxDialog(parent, wxID_ANY, wxString(_("Audacity Preferences")), wxDefaultPosition, @@ -83,7 +113,7 @@ PrefsDialog::PrefsDialog(wxWindow * parent) { S.StartHorizontalLay(wxALIGN_LEFT | wxEXPAND, true); { - mCategories = new wxTreebook(this, wxID_ANY); + mCategories = new wxTreebookExt(this, wxID_ANY); S.Prop(1); S.AddWindow(mCategories, wxEXPAND);