29#ifndef __AUDACITY_PREFS__
30#define __AUDACITY_PREFS__
39#define AUDACITY_PREFS_VERSION_STRING "1.1.1r1"
46#include <wx/filename.h>
47#include <wx/textfile.h>
54PREFERENCES_API
void InitPreferences( std::unique_ptr<audacity::BasicSettings> uPrefs );
160template<
typename T >
164 using TransactionalSettingBase::TransactionalSettingBase;
170 mutable T mCurrentValue{};
171 mutable bool mValid{
false};
176template<
typename T >
187 , mDefaultValue{ defaultValue }
193 , mFunction{ function }
200 mDefaultValue = mFunction();
201 return mDefaultValue;
207 return ReadWithDefault( pVar, GetDefault() );
214 *pVar = defaultValue;
215 if ( pVar && this->mValid ) {
216 *pVar = this->mCurrentValue;
220 if ( pVar && config ) {
221 if ((this->mValid = config->Read( this->mPath, &this->mCurrentValue )))
222 *pVar = this->mCurrentValue;
225 return (this->mValid =
false);
233 return ReadWithDefault( GetDefault() );
242 return this->mCurrentValue;
245 this->mCurrentValue =
246 config->ReadObject(this->
mPath, defaultValue);
249 this->mValid = (this->mCurrentValue != defaultValue);
250 return this->mCurrentValue;
261 if (config ==
nullptr)
268 this->mCurrentValue = value;
275 this->mCurrentValue = value;
284 return Write( GetDefault() );
289 this->mValid =
false;
295 const T value =
Read();
297 for (
size_t i = mPreviousValues.size(); i < depth; ++i)
298 this->mPreviousValues.emplace_back( value );
304 assert(!this->mPreviousValues.empty());
306 if (this->mPreviousValues.empty())
309 const auto result = this->mPreviousValues.size() > 1 || DoWrite();
310 mPreviousValues.pop_back();
318 assert(!this->mPreviousValues.empty());
320 if (!this->mPreviousValues.empty())
322 this->mCurrentValue = std::move(this->mPreviousValues.back());
323 this->mPreviousValues.pop_back();
333 return this->mValid =
334 config ? config->Write( this->
mPath, this->mCurrentValue ) :
false;
338 mutable T mDefaultValue{};
418 long defaultSymbol = -1)
420 , mSymbols{ move(symbols) }
421 , mpOtherSettings{ &
key }
422 , mDefaultSymbol{ defaultSymbol }
424 assert(defaultSymbol <
static_cast<long>(mSymbols.size()));
429 long defaultSymbol = -1)
431 , mSymbols{ move(symbols) }
432 , mDefaultSymbol{ defaultSymbol }
434 assert(defaultSymbol <
static_cast<long>(mSymbols.size()));
437 const wxString &
Key()
const {
return mKey; }
441 wxString
Read()
const;
446 wxString ReadWithDefault(
const wxString & )
const;
448 bool Write(
const wxString &value );
451 void SetDefault(
long value );
454 size_t Find(
const wxString &value )
const;
455 virtual void Migrate( wxString& );
462 mutable bool mMigrated {
false };
474 template<
typename Key>
480 std::vector<int> intValues,
481 const wxString &oldKey = {}
483 , mIntValues{ move(intValues) }
486 assert (mIntValues.size() == mSymbols.size());
497 int ReadIntWithDefault(
int defaultValue )
const;
501 size_t FindInt(
int code )
const;
502 void Migrate( wxString& )
override;
510template<
typename Enum >
516 template<
typename Key>
522 std::vector< Enum >
values,
523 const wxString &oldKey = {}
526 std::forward<Key>(
key), move(symbols), defaultSymbol,
527 ConvertValues(
values), oldKey
533 {
return static_cast<Enum
>(
ReadInt() ); }
540 auto integer =
static_cast<int>(defaultValue);
541 return static_cast<Enum
>( ReadIntWithDefault( integer ) );
545 {
return WriteInt(
static_cast<int>( value ) ); }
551 std::vector<int> result;
552 result.reserve(
values.size());
554 result.push_back(
static_cast<int>(value));
571 static void Broadcast(
int id = 0);
578 virtual void UpdatePrefs() = 0;
585 virtual void UpdateSelectedPrefs(
int id );
605 virtual void operator () () = 0;
607 static void ReinitializeAll();
gPrefs Read(wxT("/GUI/VerticalZooming"), &bVZoom, false)
PREFERENCES_API BoolSetting DefaultUpdatesCheckingFlag
PREFERENCES_API void GetPreferencesVersion(int &vMajor, int &vMinor, int &vMicro)
PREFERENCES_API wxString WarningDialogKey(const wxString &internalDialogName)
PREFERENCES_API void SetPreferencesVersion(int vMajor, int vMinor, int vMicor)
PREFERENCES_API void FinishPreferences()
PREFERENCES_API void ResetPreferences()
Call this to reset preferences to an (almost)-"new" default state.
PREFERENCES_API ByColumns_t ByColumns
PREFERENCES_API void InitPreferences(std::unique_ptr< audacity::BasicSettings > uPrefs)
PREFERENCES_API audacity::BasicSettings * gPrefs
std::vector< TranslatableString > TranslatableStrings
This specialization of Setting for bool adds a Toggle method to negate the saved value.
Class template adds an in-memory cache of a value to TransactionalSettingBase and support for Setting...
CachingSettingBase(const CachingSettingBase &)=default
CachingSettingBase(const SettingBase &path)
const wxString & Key() const
ChoiceSetting(const SettingBase &key, EnumValueSymbols symbols, long defaultSymbol=-1)
const EnumValueSymbols mSymbols
ChoiceSetting(const SettingPath &, EnumValueSymbols, long=-1)=delete
const EnumValueSymbols & GetSymbols() const
ChoiceSetting(TransactionalSettingBase &key, EnumValueSymbols symbols, long defaultSymbol=-1)
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
Specialization of Setting for double.
std::vector< int > mIntValues
EnumSettingBase(Key &&key, EnumValueSymbols symbols, long defaultSymbol, std::vector< int > intValues, const wxString &oldKey={})
Adapts EnumSettingBase to a particular enumeration type.
std::vector< int > ConvertValues(const std::vector< Enum > &values)
bool WriteEnum(Enum value)
EnumSetting(Key &&key, EnumValueSymbols symbols, long defaultSymbol, std::vector< Enum > values, const wxString &oldKey={})
Enum ReadEnumWithDefault(Enum defaultValue) const
EnumValueSymbols()=default
wxArrayStringEx mInternals
EnumValueSymbols(std::vector< EnumValueSymbol > symbols)
EnumValueSymbols(std::initializer_list< EnumValueSymbol > symbols)
TranslatableStrings mMsgids
Specialization of Setting for int.
A listener notified of changes in preferences.
std::unique_ptr< Impl > mpImpl
Base class for settings objects. It holds a configuration key path.
audacity::BasicSettings * GetConfig() const
SettingBase(const wxChar *path)
SettingBase(const wxString &path)
SettingBase(const char *path)
SettingBase(const SettingBase &)=default
const SettingPath & GetPath() const
bool Write(const T &value)
Write value to config and return true if successful.
T Read() const
overload of Read, always returning a value
Setting(const SettingBase &path, const T &defaultValue)
Usual overload supplies a default value.
T ReadWithDefault(const T &defaultValue) const
new direct use is discouraged but it may be needed in legacy code
void EnterTransaction(size_t depth) override
void Invalidate() override
bool ReadWithDefault(T *pVar, const T &defaultValue) const
overload of ReadWithDefault returning a boolean that is true if the value was previously defined */
void Rollback() noexcept override
bool Reset()
Reset to the default value.
bool DoWrite()
Write cached value to config and return true if successful.
bool Read(T *pVar) const
overload of Read returning a boolean that is true if the value was previously defined */
std::function< T() > DefaultValueFunction
std::vector< T > mPreviousValues
const T & GetDefault() const
Setting(const SettingBase &path, DefaultValueFunction function)
This overload causes recomputation of the default each time it is needed.
const DefaultValueFunction mFunction
Makes temporary changes to preferences, then rolls them back at destruction.
static AddResult Add(TransactionalSettingBase &setting)
SettingScope(const SettingScope &)=delete
SettingScope & operator=(const SettingScope &)=delete
std::set< TransactionalSettingBase * > mPending
Extend SettingScope with Commit() which flushes updates in a batch.
Specialization of Setting for strings.
friend class SettingScope
virtual void Rollback() noexcept=0
virtual void EnterTransaction(size_t depth)=0
virtual void Invalidate()=0
Base class for objects that provide facility to store data persistently, and access it with string ke...
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
PROJECT_FILE_IO_API void Add(const FilePath &path)
PROJECT_FILE_IO_API wxString Find(const FilePath &path)
bool GetConfig(const EffectDefinitionInterface &ident, ConfigurationType type, const RegistryPath &group, const RegistryPath &key, Value &var, const Value &defval)
static const auto WriteInt
static const auto ReadInt