1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-02 17:23:18 +02:00

Separate default waveform scale choice in Tracks preferences...

... Some complications in handling correct migration of preferences from
config files in older versions
This commit is contained in:
Paul Licameli 2020-01-13 17:34:21 -05:00
parent 6c3731061f
commit b45e3e8aac
6 changed files with 93 additions and 72 deletions

View File

@ -180,7 +180,7 @@ public:
long defaultSymbol,
std::vector<int> intValues, // must have same size as symbols
const wxString &oldKey
const wxString &oldKey = {}
);
protected:
@ -215,7 +215,7 @@ public:
long defaultSymbol,
std::initializer_list< Enum > values, // must have same size as symbols
const wxString &oldKey
const wxString &oldKey = {}
)
: EnumSettingBase{
key, symbols, defaultSymbol,

View File

@ -53,70 +53,108 @@ namespace {
}
namespace {
const auto waveformScaleKey = wxT("/GUI/DefaultWaveformScaleChoice");
const auto dbValueString = wxT("dB");
}
static EnumSetting< WaveformSettings::ScaleTypeValues > waveformScaleSetting{
waveformScaleKey,
{
{ XO("Linear") },
{ dbValueString, XO("Logarithmic (dB)") },
},
0, // linear
{
WaveformSettings::stLinear,
WaveformSettings::stLogarithmic,
}
};
//////////
// There is a complicated migration history here!
namespace {
const auto key0 = wxT("/GUI/DefaultViewMode");
const auto key1 = wxT("/GUI/DefaultViewModeNew");
const auto key2 = wxT("/GUI/DefaultViewModeChoice");
const auto key3 = wxT("/GUI/DefaultViewModeChoiceNew");
const EnumValueSymbol waveformSymbol{ XO("Waveform") };
const EnumValueSymbol spectrumSymbol{ XO("Spectrogram") };
const wxString obsoleteValue{ wxT("WaveformDB") };
};
class TracksViewModeEnumSetting
: public EnumSetting< WaveTrackViewConstants::Display > {
public:
TracksViewModeEnumSetting(
const wxString &key,
EnumValueSymbols symbols,
long defaultSymbol,
std::initializer_list< WaveTrackViewConstants::Display > intValues,
const wxString &oldKey
)
: EnumSetting{
key, std::move( symbols ), defaultSymbol,
std::move( intValues ), oldKey
}
{}
using EnumSetting< WaveTrackViewConstants::Display >::EnumSetting;
void Migrate( wxString &value ) override
{
// Special logic for this preference which was twice migrated!
// First test for the older but not oldest key:
EnumSetting::Migrate(value);
if (!value.empty())
return;
// Special logic for this preference which was three times migrated!
// 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
WaveTrackViewConstants::Display viewMode;
int oldMode;
gPrefs->Read(wxT("/GUI/DefaultViewMode"), // The very old key
wxString newValue;
auto stringValue =
[]( WaveTrackViewConstants::Display display ){
switch ( display ) {
case WaveTrackViewConstants::Spectrum:
return spectrumSymbol.Internal();
case WaveTrackViewConstants::obsoleteWaveformDBDisplay:
return obsoleteValue;
default:
return waveformSymbol.Internal();
}
};
if ( gPrefs->Read(key0, // The very old key
&oldMode,
(int)(WaveTrackViewConstants::Waveform));
auto viewMode = WaveTrackViewConstants::ConvertLegacyDisplayValue(oldMode);
(int)(WaveTrackViewConstants::Waveform) ) ) {
viewMode = WaveTrackViewConstants::ConvertLegacyDisplayValue(oldMode);
newValue = stringValue( viewMode );
}
else if ( gPrefs->Read(key1,
&oldMode,
(int)(WaveTrackViewConstants::Waveform) ) ) {
viewMode = static_cast<WaveTrackViewConstants::Display>( oldMode );
newValue = stringValue( viewMode );
}
else
gPrefs->Read( key2, &newValue );
// Now future-proof 2.1.1 against a recurrence of this sort of bug!
viewMode = WaveTrackViewConstants::ValidateWaveTrackDisplay(viewMode);
if ( !gPrefs->Read( key3, &value ) ) {
if (newValue == obsoleteValue) {
newValue = waveformSymbol.Internal();
gPrefs->Write(waveformScaleKey, dbValueString);
}
const_cast<TracksViewModeEnumSetting*>(this)->WriteInt( viewMode );
gPrefs->Flush();
value = mSymbols[ FindInt(viewMode) ].Internal();
Write( value = newValue );
gPrefs->Flush();
return;
}
}
};
static TracksViewModeEnumSetting viewModeSetting{
wxT("/GUI/DefaultViewModeChoice"),
key3,
{
{ XO("Waveform") },
{ wxT("WaveformDB"), XO("Waveform (dB)") },
{ XO("Spectrogram") }
{ waveformSymbol },
{ spectrumSymbol }
},
0, // Waveform
// for migrating old preferences:
{
WaveTrackViewConstants::Waveform,
WaveTrackViewConstants::obsoleteWaveformDBDisplay,
WaveTrackViewConstants::Spectrum
},
wxT("/GUI/DefaultViewModeNew")
}
};
WaveTrackViewConstants::Display TracksPrefs::ViewModeChoice()
@ -124,6 +162,11 @@ WaveTrackViewConstants::Display TracksPrefs::ViewModeChoice()
return viewModeSetting.ReadEnum();
}
WaveformSettings::ScaleTypeValues TracksPrefs::WaveformScaleChoice()
{
return waveformScaleSetting.ReadEnum();
}
//////////
static EnumSetting< WaveTrackViewConstants::SampleDisplay >
sampleDisplaySetting{
@ -299,9 +342,13 @@ void TracksPrefs::PopulateOrExchange(ShuttleGui & S)
30
);
#endif
S.TieChoice(XO("Default &view mode:"),
viewModeSetting );
S.TieChoice(XO("Default Waveform scale:"),
waveformScaleSetting );
S.TieChoice(XO("Display &samples:"),
sampleDisplaySetting );

View File

@ -18,6 +18,7 @@
#include <vector>
#include "PrefsPanel.h"
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
#include "WaveformSettings.h" // for ScaleTypeValues
class ShuttleGui;
@ -43,6 +44,7 @@ class TracksPrefs final : public PrefsPanel
static wxString GetDefaultAudioTrackNamePreference();
static WaveTrackViewConstants::Display ViewModeChoice();
static WaveformSettings::ScaleTypeValues WaveformScaleChoice();
static WaveTrackViewConstants::SampleDisplay SampleViewChoice();
static WaveTrackViewConstants::ZoomPresets Zoom1Choice();
static WaveTrackViewConstants::ZoomPresets Zoom2Choice();

View File

@ -1206,13 +1206,12 @@ void WaveTrackView::BuildSubViews() const
// Force creation always:
WaveformSettings &settings = static_cast< WaveTrack* >( pTrack.get() )
->GetIndependentWaveformSettings();
if (display == WaveTrackViewConstants::obsoleteWaveformDBDisplay) {
display = WaveTrackViewConstants::Waveform;
settings.scaleType = WaveformSettings::stLogarithmic;
}
->GetIndependentWaveformSettings();
// Set the default scale type to linear or log, even if we are showing
// spectrogram
settings.scaleType = TracksPrefs::WaveformScaleChoice();
pThis->DoSetDisplay( display );
}
}

View File

@ -43,27 +43,3 @@ WaveTrackViewConstants::ConvertLegacyDisplayValue(int oldValue)
}
return newValue;
}
// static
WaveTrackViewConstants::Display
WaveTrackViewConstants::ValidateWaveTrackDisplay(Display display)
{
switch (display) {
// non-obsolete codes
case Waveform:
case obsoleteWaveformDBDisplay:
case Spectrum:
return display;
// obsolete codes
case obsolete1: // was SpectrumLogDisplay
case obsolete2: // was SpectralSelectionDisplay
case obsolete3: // was SpectralSelectionLogDisplay
case obsolete4: // was PitchDisplay
return Spectrum;
// codes out of bounds (from future prefs files?)
default:
return MinDisplay;
}
}

View File

@ -77,9 +77,6 @@ namespace WaveTrackViewConstants
// Handle remapping of enum values from 2.1.0 and earlier
Display ConvertLegacyDisplayValue(int oldValue);
// Handle restriction of range of values of the enum from future versions
Display ValidateWaveTrackDisplay(Display display);
}
#endif