From bc08f571dcdbc6dc87fb574df0c11df5e14f449a Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 23 Feb 2019 14:37:57 -0500 Subject: [PATCH] ChoiceSetting default is changeable and can be unspecified --- src/Prefs.cpp | 28 +++++++++++++++++++++++----- src/Prefs.h | 13 +++++++------ src/prefs/TracksPrefs.cpp | 2 +- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/Prefs.cpp b/src/Prefs.cpp index 566a22f75..63df6d719 100755 --- a/src/Prefs.cpp +++ b/src/Prefs.cpp @@ -276,6 +276,14 @@ const wxArrayStringEx &EnumValueSymbols::GetInternals() const } ////////// +const EnumValueSymbol &ChoiceSetting::Default() const +{ + if ( mDefaultSymbol >= 0 && mDefaultSymbol < mSymbols.size() ) + return mSymbols[ mDefaultSymbol ]; + static EnumValueSymbol empty; + return empty; +} + wxString ChoiceSetting::Read() const { const auto &defaultValue = Default().Internal(); @@ -321,7 +329,7 @@ bool ChoiceSetting::Write( const wxString &value ) EnumSetting::EnumSetting( const wxString &key, EnumValueSymbols symbols, - size_t defaultSymbol, + long defaultSymbol, std::vector intValues, // must have same size as symbols const wxString &oldKey @@ -337,6 +345,14 @@ EnumSetting::EnumSetting( } } +void ChoiceSetting::SetDefault( long value ) +{ + if ( value < (long)mSymbols.size() ) + mDefaultSymbol = value; + else + wxASSERT( false ); +} + int EnumSetting::ReadInt() const { auto index = Find( Read() ); @@ -361,12 +377,14 @@ void EnumSetting::Migrate( wxString &value ) // Do not DELETE the old key -- let that be read if user downgrades // Audacity. But further changes will be stored only to the NEW key // and won't be seen then. - auto index = FindInt( intValue ); + auto index = (long) FindInt( intValue ); if ( index >= mSymbols.size() ) index = mDefaultSymbol; - value = mSymbols[index].Internal(); - Write(value); - gPrefs->Flush(); + if ( index >= 0 && index < mSymbols.size() ) { + value = mSymbols[index].Internal(); + Write(value); + gPrefs->Flush(); + } } } diff --git a/src/Prefs.h b/src/Prefs.h index 5b7849c35..eec87f36b 100644 --- a/src/Prefs.h +++ b/src/Prefs.h @@ -127,7 +127,7 @@ public: ChoiceSetting( const wxString &key, EnumValueSymbols symbols, - size_t defaultSymbol + long defaultSymbol = -1 ) : mKey{ key } @@ -135,17 +135,18 @@ public: , mDefaultSymbol{ defaultSymbol } { - wxASSERT( defaultSymbol < mSymbols.size() ); + wxASSERT( defaultSymbol < (long)mSymbols.size() ); } const wxString &Key() const { return mKey; } - const EnumValueSymbol &Default() const - { return mSymbols[mDefaultSymbol]; } + const EnumValueSymbol &Default() const; const EnumValueSymbols &GetSymbols() const { return mSymbols; } wxString Read() const; bool Write( const wxString &value ); // you flush gPrefs afterward + void SetDefault( long value ); + protected: size_t Find( const wxString &value ) const; virtual void Migrate( wxString& ); @@ -157,7 +158,7 @@ protected: // stores an internal value mutable bool mMigrated { false }; - const size_t mDefaultSymbol; + long mDefaultSymbol; }; /// Extends ChoiceSetting with a corresponding table of integer codes @@ -170,7 +171,7 @@ public: EnumSetting( const wxString &key, EnumValueSymbols symbols, - size_t defaultSymbol, + long defaultSymbol, std::vector intValues, // must have same size as symbols const wxString &oldKey diff --git a/src/prefs/TracksPrefs.cpp b/src/prefs/TracksPrefs.cpp index a22c2e82c..b06ff91cf 100644 --- a/src/prefs/TracksPrefs.cpp +++ b/src/prefs/TracksPrefs.cpp @@ -59,7 +59,7 @@ public: TracksViewModeEnumSetting( const wxString &key, EnumValueSymbols symbols, - size_t defaultSymbol, + long defaultSymbol, std::vector intValues, const wxString &oldKey