From 83a01e255f232de0d08a1c2ba229673c37ea468a Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 20 Mar 2018 14:51:03 -0400 Subject: [PATCH] Redo view mode choice in Tracks preferences --- src/WaveTrack.cpp | 28 +----------- src/WaveTrack.h | 3 -- src/prefs/TracksPrefs.cpp | 93 +++++++++++++++++++++++++++++++-------- src/prefs/TracksPrefs.h | 5 ++- 4 files changed, 79 insertions(+), 50 deletions(-) diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index 8fe26772f..e6baff06e 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -96,7 +96,7 @@ WaveTrack::WaveTrack(const std::shared_ptr &projDirManager, sampleFo // Force creation always: WaveformSettings &settings = GetIndependentWaveformSettings(); - mDisplay = FindDefaultViewMode(); + mDisplay = TracksPrefs::ViewModeChoice(); if (mDisplay == obsoleteWaveformDBDisplay) { mDisplay = Waveform; settings.scaleType = WaveformSettings::stLogarithmic; @@ -254,32 +254,6 @@ void WaveTrack::SetPanFromChannelType() }; -//static -WaveTrack::WaveTrackDisplay WaveTrack::FindDefaultViewMode() -{ - // PRL: Bugs 1043, 1044 - // 2.1.1 writes a NEW key for this preference, which got NEW values, - // to avoid confusing version 2.1.0 if it reads the preference file afterwards. - // Prefer the NEW preference key if it is present - - WaveTrack::WaveTrackDisplay viewMode; - gPrefs->Read(wxT("/GUI/DefaultViewModeNew"), &viewMode, -1); - - // Default to the old key only if not, default the value if it's not there either - wxASSERT(WaveTrack::MinDisplay >= 0); - if (viewMode < 0) { - int oldMode; - gPrefs->Read(wxT("/GUI/DefaultViewMode"), &oldMode, - (int)(WaveTrack::Waveform)); - viewMode = WaveTrack::ConvertLegacyDisplayValue(oldMode); - } - - // Now future-proof 2.1.1 against a recurrence of this sort of bug! - viewMode = WaveTrack::ValidateWaveTrackDisplay(viewMode); - - return viewMode; -} - // static WaveTrack::WaveTrackDisplay WaveTrack::ConvertLegacyDisplayValue(int oldValue) diff --git a/src/WaveTrack.h b/src/WaveTrack.h index a2c93c2d4..63bf2bedb 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -578,9 +578,6 @@ private: kMaxZoom, }; - // Read appropriate value from preferences - static WaveTrackDisplay FindDefaultViewMode(); - // Handle remapping of enum values from 2.1.0 and earlier static WaveTrackDisplay ConvertLegacyDisplayValue(int oldValue); diff --git a/src/prefs/TracksPrefs.cpp b/src/prefs/TracksPrefs.cpp index f8e799517..837550f5c 100644 --- a/src/prefs/TracksPrefs.cpp +++ b/src/prefs/TracksPrefs.cpp @@ -45,17 +45,86 @@ namespace { } +////////// +static const IdentInterfaceSymbol choicesView[] = { + { XO("Waveform") }, + { wxT("WaveformDB"), XO("Waveform (dB)") }, + { XO("Spectrogram") } +}; +static const int intChoicesView[] = { + (int)(WaveTrack::Waveform), + (int)(WaveTrack::obsoleteWaveformDBDisplay), + (int)(WaveTrack::Spectrum) +}; +static const size_t nChoicesView = WXSIZEOF(choicesView); +static_assert( nChoicesView == WXSIZEOF(intChoicesView), "size mismatch" ); + +static const size_t defaultChoiceView = 0; + +class TracksViewModeSetting : public EncodedEnumSetting { +public: + TracksViewModeSetting( + const wxString &key, + const IdentInterfaceSymbol symbols[], size_t nSymbols, + size_t defaultSymbol, + + const int intValues[], + const wxString &oldKey + ) + : EncodedEnumSetting{ + key, symbols, nSymbols, defaultSymbol, intValues, oldKey } + {} + + void Migrate( wxString &value ) override + { + // Special logic for this preference which was twice migrated! + + // First test for the older but not oldest key: + EncodedEnumSetting::Migrate(value); + if (!value.empty()) + return; + + // PRL: Bugs 1043, 1044 + // 2.1.1 writes a NEW key for this preference, which got NEW values, + // to avoid confusing version 2.1.0 if it reads the preference file afterwards. + // Prefer the NEW preference key if it is present + + int oldMode; + gPrefs->Read(wxT("/GUI/DefaultViewMode"), // The very old key + &oldMode, + (int)(WaveTrack::Waveform)); + auto viewMode = WaveTrack::ConvertLegacyDisplayValue(oldMode); + + // Now future-proof 2.1.1 against a recurrence of this sort of bug! + viewMode = WaveTrack::ValidateWaveTrackDisplay(viewMode); + + const_cast(this)->WriteInt( viewMode ); + gPrefs->Flush(); + + value = mSymbols[ FindInt(viewMode) ].Internal(); + } +}; + +static TracksViewModeSetting viewModeSetting{ + wxT("/GUI/DefaultViewModeChoice"), + choicesView, nChoicesView, defaultChoiceView, + + intChoicesView, + wxT("/GUI/DefaultViewModeNew") +}; + +WaveTrack::WaveTrackDisplay TracksPrefs::ViewModeChoice() +{ + return (WaveTrack::WaveTrackDisplay) viewModeSetting.ReadInt(); +} + +////////// TracksPrefs::TracksPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: "Tracks" include audio recordings but also other collections of * data associated with a time line, such as sequences of labels, and musical * notes */ : PrefsPanel(parent, winid, _("Tracks")) { - // Bugs 1043, 1044 - // First rewrite legacy preferences - gPrefs->Write(wxT("/GUI/DefaultViewModeNew"), - (int) WaveTrack::FindDefaultViewMode()); - Populate(); } @@ -68,15 +137,6 @@ void TracksPrefs::Populate() // Keep view choices and codes in proper correspondence -- // we don't display them by increasing integer values. - mViewChoices.Add(_("Waveform")); - mViewCodes.push_back((int)(WaveTrack::Waveform)); - - mViewChoices.Add(_("Waveform (dB)")); - mViewCodes.push_back((int)(WaveTrack::obsoleteWaveformDBDisplay)); - - mViewChoices.Add(_("Spectrogram")); - mViewCodes.push_back(WaveTrack::Spectrum); - // How samples are displayed when zoomed in: @@ -153,10 +213,7 @@ void TracksPrefs::PopulateOrExchange(ShuttleGui & S) S.StartMultiColumn(2); { S.TieChoice(_("Default &view mode:"), - wxT("/GUI/DefaultViewModeNew"), - 0, - mViewChoices, - mViewCodes); + viewModeSetting ); S.TieChoice(_("Display &samples:"), wxT("/GUI/SampleView"), diff --git a/src/prefs/TracksPrefs.h b/src/prefs/TracksPrefs.h index 9282558aa..d12e6bb3e 100644 --- a/src/prefs/TracksPrefs.h +++ b/src/prefs/TracksPrefs.h @@ -20,6 +20,7 @@ #include #include "PrefsPanel.h" +#include "../WaveTrack.h" class ShuttleGui; @@ -36,14 +37,14 @@ class TracksPrefs final : public PrefsPanel static wxString GetDefaultAudioTrackNamePreference(); + static WaveTrack::WaveTrackDisplay ViewModeChoice(); + private: void Populate(); void PopulateOrExchange(ShuttleGui & S) override; static int iPreferencePinned; - std::vector mViewCodes; - wxArrayString mViewChoices; std::vector mSampleDisplayCodes; wxArrayString mSampleDisplayChoices; std::vector mZoomCodes;