diff --git a/libraries/lib-strings/FutureStrings.h b/libraries/lib-strings/FutureStrings.h index 7980eeb923df..3c4fe3fa3093 100644 --- a/libraries/lib-strings/FutureStrings.h +++ b/libraries/lib-strings/FutureStrings.h @@ -111,17 +111,6 @@ XO("Unknown error"), XO("Failed to send crash report"), -// i18n-hint Scheme refers to a color scheme for spectrogram colors -XC("Sche&me", "spectrum prefs"), -// i18n-hint Choice of spectrogram colors -XC("Color (default)", "spectrum prefs"), -// i18n-hint Choice of spectrogram colors -XC("Color (classic)", "spectrum prefs"), -// i18n-hint Choice of spectrogram colors -XC("Grayscale", "spectrum prefs"), -// i18n-hint Choice of spectrogram colors -XC("Inverse grayscale", "spectrum prefs"), - // Update version dialog XC("Update Audacity", "update dialog"), XC("&Skip", "update dialog"), diff --git a/src/AColor.cpp b/src/AColor.cpp index 097ad04bae65..052b78bd86cc 100644 --- a/src/AColor.cpp +++ b/src/AColor.cpp @@ -19,7 +19,7 @@ It is also a place to document colour usage policy in Audacity #include "AColor.h" - +#include "AColorResources.h" #include @@ -635,88 +635,155 @@ void AColor::DarkMIDIChannel(wxDC * dc, int channel /* 1 - 16 */ ) -unsigned char AColor::gradient_pre[ColorGradientTotal][2][gradientSteps][3]; +unsigned char AColor::gradient_pre[ColorGradientTotal][colorSchemes][gradientSteps][3]; void AColor::PreComputeGradient() { - { - if (!gradient_inited) { - gradient_inited = 1; - - for (int selected = 0; selected < ColorGradientTotal; selected++) - for (int grayscale = 0; grayscale <= 1; grayscale++) { - float r, g, b; - - int i; - for (i=0; iGetSpectrogramSettings().spectralSelection = bSpectralSelect; } - if( wt && bHasGrayScale ){ - wt->GetSpectrogramSettings().isGrayscale = bGrayScale; + if (wt && bHasSpecColorScheme) { + wt->GetSpectrogramSettings().colorScheme = (SpectrogramSettings::ColorScheme)mSpecColorScheme; } return true; diff --git a/src/commands/SetTrackInfoCommand.h b/src/commands/SetTrackInfoCommand.h index d6b695d709d1..e51f228bf29e 100644 --- a/src/commands/SetTrackInfoCommand.h +++ b/src/commands/SetTrackInfoCommand.h @@ -124,7 +124,7 @@ class SetTrackVisualsCommand : public SetTrackBase bool bUseSpecPrefs; bool bSpectralSelect; - bool bGrayScale; + int mSpecColorScheme; // For tracking optional parameters. bool bHasColour; @@ -137,7 +137,7 @@ class SetTrackVisualsCommand : public SetTrackBase bool bHasUseSpecPrefs; bool bHasSpectralSelect; - bool bHasGrayScale; + bool bHasSpecColorScheme; }; class SetTrackCommand : public SetTrackBase diff --git a/src/prefs/SpectrogramSettings.cpp b/src/prefs/SpectrogramSettings.cpp index 6cde50a2bbc2..d70d5dd8e58d 100644 --- a/src/prefs/SpectrogramSettings.cpp +++ b/src/prefs/SpectrogramSettings.cpp @@ -16,6 +16,7 @@ Paul Licameli #include "SpectrogramSettings.h" +#include "../AColor.h" #include "../NumberScale.h" #include @@ -70,7 +71,7 @@ SpectrogramSettings::SpectrogramSettings(const SpectrogramSettings &other) #ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS , zeroPaddingFactor(other.zeroPaddingFactor) #endif - , isGrayscale(other.isGrayscale) + , colorScheme(other.colorScheme) , scaleType(other.scaleType) #ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH , spectralSelection(other.spectralSelection) @@ -107,7 +108,7 @@ SpectrogramSettings &SpectrogramSettings::operator= (const SpectrogramSettings & #ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS zeroPaddingFactor = other.zeroPaddingFactor; #endif - isGrayscale = other.isGrayscale; + colorScheme = other.colorScheme; scaleType = other.scaleType; #ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH spectralSelection = other.spectralSelection; @@ -154,6 +155,47 @@ const EnumValueSymbols &SpectrogramSettings::GetScaleNames() return result; } +//static +const EnumValueSymbols &SpectrogramSettings::GetColorSchemeNames() +{ + static const EnumValueSymbols result{ + // Keep in correspondence with enum SpectrogramSettings::ColorScheme: + /* i18n-hint: New color scheme for spectrograms */ + { wxT("SpecColorNew"), XC("Color (default)", "spectrum prefs") }, + /* i18n-hint: Classic color scheme(from theme) for spectrograms */ + { wxT("SpecColorTheme"), XC("Color (classic)", "spectrum prefs") }, + /* i18n-hint: Grayscale color scheme for spectrograms */ + { wxT("SpecGrayscale"), XC("Grayscale", "spectrum prefs") }, + /* i18n-hint: Inverse grayscale color scheme for spectrograms */ + { wxT("SpecInvGrayscale"), XC("Inverse grayscale", "spectrum prefs") }, + }; + + wxASSERT(csNumColorScheme == result.size()); + static_assert(csNumColorScheme == AColor::colorSchemes, "Broken correspondence"); + + return result; +} + + +void SpectrogramSettings::ColorSchemeEnumSetting::Migrate(wxString &value) +{ + // Migrate old grayscale option to Color scheme choice + bool isGrayscale = (gPrefs->Read(wxT("/Spectrum/Grayscale"), 0L) != 0); + if (isGrayscale && !gPrefs->Read(wxT("/Spectrum/ColorScheme"), &value)) { + value = GetColorSchemeNames().at(csInvGrayscale).Internal(); + Write(value); + gPrefs->Flush(); + } +} + +SpectrogramSettings::ColorSchemeEnumSetting SpectrogramSettings::colorSchemeSetting{ + wxT("/Spectrum/ColorScheme"), + GetColorSchemeNames(), + csColorNew, // default to Color(New) + { csColorNew, csColorTheme, csGrayscale, csInvGrayscale }, +}; + + //static const TranslatableStrings &SpectrogramSettings::GetAlgorithmNames() { @@ -227,6 +269,9 @@ bool SpectrogramSettings::Validate(bool quiet) ScaleType(std::max(0, std::min((int)(SpectrogramSettings::stNumScaleTypes) - 1, (int)(scaleType)))); + colorScheme = ColorScheme( + std::max(0, std::min(csNumColorScheme-1, colorScheme)) + ); algorithm = Algorithm( std::max(0, std::min((int)(algNumAlgorithms) - 1, (int)(algorithm))) ); @@ -254,7 +299,7 @@ void SpectrogramSettings::LoadPrefs() gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, eWinFuncHann); - isGrayscale = (gPrefs->Read(wxT("/Spectrum/Grayscale"), 0L) != 0); + colorScheme = colorSchemeSetting.ReadEnum(); scaleType = ScaleType(gPrefs->Read(wxT("/Spectrum/ScaleType"), 0L)); @@ -302,7 +347,7 @@ void SpectrogramSettings::SavePrefs() gPrefs->Write(wxT("/Spectrum/WindowType"), windowType); - gPrefs->Write(wxT("/Spectrum/Grayscale"), isGrayscale); + colorSchemeSetting.WriteEnum(colorScheme); gPrefs->Write(wxT("/Spectrum/ScaleType"), (int) scaleType); @@ -361,10 +406,8 @@ void SpectrogramSettings::UpdatePrefs() gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, eWinFuncHann); } - if (isGrayscale == defaults().isGrayscale) { - int temp; - gPrefs->Read(wxT("/Spectrum/Grayscale"), &temp, 0L); - isGrayscale = (temp != 0); + if (colorScheme == defaults().colorScheme) { + colorScheme = colorSchemeSetting.ReadEnum(); } if (scaleType == defaults().scaleType) { diff --git a/src/prefs/SpectrogramSettings.h b/src/prefs/SpectrogramSettings.h index f608a5133ef0..5eedd5f0f3c9 100644 --- a/src/prefs/SpectrogramSettings.h +++ b/src/prefs/SpectrogramSettings.h @@ -67,6 +67,7 @@ class AUDACITY_DLL_API SpectrogramSettings : public PrefsListener }; static const EnumValueSymbols &GetScaleNames(); + static const EnumValueSymbols &GetColorSchemeNames(); static const TranslatableStrings &GetAlgorithmNames(); static SpectrogramSettings &defaults(); @@ -128,7 +129,22 @@ class AUDACITY_DLL_API SpectrogramSettings : public PrefsListener size_t GetFFTLength() const; // window size (times zero padding, if STFT) size_t NBins() const; - bool isGrayscale; + enum ColorScheme : int { + // Keep in correspondence with AColor::colorSchemes, AColor::gradient_pre + csColorNew = 0, + csColorTheme, + csGrayscale, + csInvGrayscale, + + csNumColorScheme, + }; + ColorScheme colorScheme; + + class ColorSchemeEnumSetting : public EnumSetting< ColorScheme > { + using EnumSetting< ColorScheme >::EnumSetting; + void Migrate(wxString &value) override; + }; + static ColorSchemeEnumSetting colorSchemeSetting; ScaleType scaleType; diff --git a/src/prefs/SpectrumPrefs.cpp b/src/prefs/SpectrumPrefs.cpp index 2f6a9143cc5f..b1b851b11959 100644 --- a/src/prefs/SpectrumPrefs.cpp +++ b/src/prefs/SpectrumPrefs.cpp @@ -101,7 +101,7 @@ enum { ID_GAIN, ID_RANGE, ID_FREQUENCY_GAIN, - ID_GRAYSCALE, + ID_COLOR_SCHEME, ID_SPECTRAL_SELECTION, #endif ID_DEFAULTS, @@ -223,11 +223,13 @@ void SpectrumPrefs::PopulateOrExchange(ShuttleGui & S) S.Id(ID_FREQUENCY_GAIN).TieNumericTextBox(XXO("High &boost (dB/dec):"), mTempSettings.frequencyGain, 8); + + // i18n-hint Scheme refers to a color scheme for spectrogram colors + S.Id(ID_COLOR_SCHEME).TieChoice(XC("Sche&me", "spectrum prefs"), + (int&)mTempSettings.colorScheme, + Msgids( SpectrogramSettings::GetColorSchemeNames() ) ); } S.EndMultiColumn(); - - S.Id(ID_GRAYSCALE).TieCheckBox(XXO("Gra&yscale"), - mTempSettings.isGrayscale); } S.EndStatic(); } @@ -584,7 +586,7 @@ BEGIN_EVENT_TABLE(SpectrumPrefs, PrefsPanel) EVT_TEXT(ID_GAIN, SpectrumPrefs::OnControl) EVT_TEXT(ID_RANGE, SpectrumPrefs::OnControl) EVT_TEXT(ID_FREQUENCY_GAIN, SpectrumPrefs::OnControl) - EVT_CHECKBOX(ID_GRAYSCALE, SpectrumPrefs::OnControl) + EVT_CHOICE(ID_COLOR_SCHEME, SpectrumPrefs::OnControl) EVT_CHECKBOX(ID_SPECTRAL_SELECTION, SpectrumPrefs::OnControl) END_EVENT_TABLE() diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp index bb0204d616d0..8b29d9c99734 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp @@ -215,7 +215,7 @@ void DrawClipSpectrum(TrackPanelDrawingContext &context, freqHi = selectedRegion.f1(); #endif - const bool &isGrayscale = settings.isGrayscale; + const int &colorScheme = settings.colorScheme; const int &range = settings.range; const int &gain = settings.gain; @@ -576,7 +576,7 @@ void DrawClipSpectrum(TrackPanelDrawingContext &context, : clip->mSpecPxCache->values[correctedX * hiddenMid.height + yy]; unsigned char rv, gv, bv; - GetColorGradient(value, selected, isGrayscale, &rv, &gv, &bv); + GetColorGradient(value, selected, colorScheme, &rv, &gv, &bv); #ifdef EXPERIMENTAL_FFT_Y_GRID if (fftYGrid && yGrid[yy]) {