From e39da0c42b0a2221b8cee194e7786cc40cdc6cc3 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 29 May 2016 15:47:11 -0400 Subject: [PATCH] New preference for pinned play head, also in Transport menu --- src/Menus.cpp | 22 ++++++++++++++++++++++ src/Menus.h | 1 + src/prefs/PlaybackPrefs.cpp | 32 +++++++++++++++++++++++++++++++- src/prefs/PlaybackPrefs.h | 3 +++ src/toolbars/ControlToolBar.cpp | 20 +++++++++++++++++--- src/toolbars/ControlToolBar.h | 1 + 6 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/Menus.cpp b/src/Menus.cpp index 909332752..1739d3f25 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -69,6 +69,7 @@ simplifies construction of menu items. #include "export/Export.h" #include "export/ExportMultiple.h" #include "prefs/PrefsDialog.h" +#include "prefs/PlaybackPrefs.h" #include "ShuttleGui.h" #include "HistoryWindow.h" #include "LyricsWindow.h" @@ -772,6 +773,11 @@ void AudacityProject::CreateMenusAndCommands() c->AddSeparator(); + c->AddCheck(wxT("PinnedHead"), _("Pinned Recording/Playback Head"), + FN(OnTogglePinnedHead), 0, + // Switching of scrolling on and off is permitted even during transport + AlwaysEnabledFlag, AlwaysEnabledFlag); + c->AddCheck(wxT("Duplex"), _("&Overdub (on/off)"), FN(OnTogglePlayRecording), 0); c->AddCheck(wxT("SWPlaythrough"), _("So&ftware Playthrough (on/off)"), FN(OnToggleSWPlaythrough), 0); @@ -1840,6 +1846,10 @@ void AudacityProject::ModifyToolbarMenus() gPrefs->Read(wxT("/AudioIO/AutomatedInputLevelAdjustment"),&active, false); mCommandManager.Check(wxT("AutomatedInputLevelAdjustmentOnOff"), active); #endif + + active = PlaybackPrefs::GetPinnedHeadPreference(); + mCommandManager.Check(wxT("PinnedHead"), active); + gPrefs->Read(wxT("/AudioIO/Duplex"),&active, true); mCommandManager.Check(wxT("Duplex"), active); gPrefs->Read(wxT("/AudioIO/SWPlaythrough"),&active, false); @@ -2360,6 +2370,18 @@ void AudacityProject::OnToggleSoundActivated() ModifyAllProjectToolbarMenus(); } +void AudacityProject::OnTogglePinnedHead() +{ + PlaybackPrefs::SetPinnedHeadPreference( + !PlaybackPrefs::GetPinnedHeadPreference(), true); + ModifyAllProjectToolbarMenus(); + + // Change what happens in case transport is in progress right now + auto ctb = GetActiveProject()->GetControlToolBar(); + if (ctb) + ctb->StartScrollingIfPreferred(); +} + void AudacityProject::OnTogglePlayRecording() { bool Duplex; diff --git a/src/Menus.h b/src/Menus.h index d88c187d3..88391d723 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -313,6 +313,7 @@ void OnResetToolBars(); void OnSoundActivated(); void OnToggleSoundActivated(); +void OnTogglePinnedHead(); void OnTogglePlayRecording(); void OnToggleSWPlaythrough(); #ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT diff --git a/src/prefs/PlaybackPrefs.cpp b/src/prefs/PlaybackPrefs.cpp index eb816bd71..f9436a468 100644 --- a/src/prefs/PlaybackPrefs.cpp +++ b/src/prefs/PlaybackPrefs.cpp @@ -19,13 +19,25 @@ *//********************************************************************/ #include "../Audacity.h" +#include "PlaybackPrefs.h" #include #include #include "../ShuttleGui.h" +#include "../Prefs.h" -#include "PlaybackPrefs.h" +namespace { + const wxChar *PinnedHeadPreferenceKey() + { + return wxT("/AudioIO/PinnedHead"); + } + + bool PinnedHeadPreferenceDefault() + { + return false; + } +} PlaybackPrefs::PlaybackPrefs(wxWindow * parent) : PrefsPanel(parent, _("Playback")) @@ -113,6 +125,11 @@ void PlaybackPrefs::PopulateOrExchange(ShuttleGui & S) S.EndThreeColumn(); } S.EndStatic(); + + // This affects recording too, though it is in playback preferences. + S.TieCheckBox(_("Pinned playback/recording head"), + PinnedHeadPreferenceKey(), + PinnedHeadPreferenceDefault()); } bool PlaybackPrefs::Apply() @@ -123,8 +140,21 @@ bool PlaybackPrefs::Apply() return true; } +bool PlaybackPrefs::GetPinnedHeadPreference() +{ + return gPrefs->ReadBool(PinnedHeadPreferenceKey(), PinnedHeadPreferenceDefault()); +} + +void PlaybackPrefs::SetPinnedHeadPreference(bool value, bool flush) +{ + gPrefs->Write(PinnedHeadPreferenceKey(), value); + if(flush) + gPrefs->Flush(); +} + PrefsPanel *PlaybackPrefsFactory::Create(wxWindow *parent) { wxASSERT(parent); // to justify safenew return safenew PlaybackPrefs(parent); } + diff --git a/src/prefs/PlaybackPrefs.h b/src/prefs/PlaybackPrefs.h index 0385498d6..43f176b47 100644 --- a/src/prefs/PlaybackPrefs.h +++ b/src/prefs/PlaybackPrefs.h @@ -27,6 +27,9 @@ class PlaybackPrefs final : public PrefsPanel virtual ~PlaybackPrefs(); bool Apply() override; + static bool GetPinnedHeadPreference(); + static void SetPinnedHeadPreference(bool value, bool flush = false); + private: void Populate(); void PopulateOrExchange(ShuttleGui & S); diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index 7b7ecfdf0..b5af09ce9 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -68,6 +68,7 @@ #include "../widgets/Meter.h" #include "../tracks/ui/Scrubbing.h" +#include "../prefs/PlaybackPrefs.h" IMPLEMENT_CLASS(ControlToolBar, ToolBar); @@ -635,15 +636,16 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion, NoteTrackArray(), #endif tcp0, tcp1, myOptions); - } else - { + } + else { // Cannot create cut preview tracks, clean up and exit SetPlay(false); SetStop(false); SetRecord(false); return -1; } - } else { + } + else { // Lifted the following into AudacityProject::GetDefaultPlayOptions() /* if (!timetrack) { @@ -682,6 +684,8 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion, return -1; } + StartScrollingIfPreferred(); + // Let other UI update appearance if (p) p->GetRulerPanel()->HideQuickPlayIndicator(); @@ -1076,6 +1080,8 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt) if (success) { p->SetAudioIOToken(token); mBusyProject = p; + + StartScrollingIfPreferred(); } else { if (shifted) { @@ -1263,6 +1269,14 @@ void ControlToolBar::UpdateStatusBar(AudacityProject *pProject) pProject->GetStatusBar()->SetStatusText(StateForStatusBar(), stateStatusBarField); } +void ControlToolBar::StartScrollingIfPreferred() +{ + if (PlaybackPrefs::GetPinnedHeadPreference()) + StartScrolling(); + else + StopScrolling(); +} + void ControlToolBar::StartScrolling() { using Mode = AudacityProject::PlaybackScroller::Mode; diff --git a/src/toolbars/ControlToolBar.h b/src/toolbars/ControlToolBar.h index 5409a419e..7e739d63b 100644 --- a/src/toolbars/ControlToolBar.h +++ b/src/toolbars/ControlToolBar.h @@ -107,6 +107,7 @@ class ControlToolBar final : public ToolBar { void UpdateStatusBar(AudacityProject *pProject); // Starting and stopping of scrolling display + void StartScrollingIfPreferred(); void StartScrolling(); void StopScrolling();